diff --git a/.gitignore b/.gitignore
index 99efc91..96de5bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -128,3 +128,7 @@ dmypy.json
# Pyre type checker
.pyre/
.DS_Store
+
+# Big files
+/homework/LiamNolan/06/cat_test.csv
+/homework/LiamNolan/06/cat_train.csv
diff --git a/homework/LiamNolan/06/HW06+7.ipynb b/homework/LiamNolan/06/HW06+7.ipynb
new file mode 100644
index 0000000..dfdc7e2
--- /dev/null
+++ b/homework/LiamNolan/06/HW06+7.ipynb
@@ -0,0 +1,6544 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# ASTR 596: FDS Homework 6+7: Gaussian Processes (200 pts)\n",
+ "\n",
+ "### This is a double HW set so you get extra time - until reading day (May 4th, 2023) at noon to do it. \n",
+ "### After that, it's finals time. \n",
+ "\n",
+ "\n",
+ "# P1. Gaussian Processes\n",
+ "\n",
+ "### Last HW, you worked on finding periodic planet signals in the light curve of Kepler-90, a star that is photometrically stable. The periodogram worked nicely because \n",
+ "\n",
+ "### a) we cleaned the light curve to squelch red noise\n",
+ "### b) the signals really were periodic and we could implictly make a strong assumption about the covariance between points.\n",
+ "\n",
+ "### Life gets harder when the star itself has quasi-periodic variations because it has a magnetic field and is rotating (ruh oh...) "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib notebook\n",
+ "from astropy.table import Table\n",
+ "import scipy.stats as st\n",
+ "import sklearn\n",
+ "import sklearn.ensemble\n",
+ "import pickle\n",
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
Table length=14588\n",
+ "
\n",
+ "| time | flux | error | quarter |
\n",
+ "| float64 | float64 | float64 | int64 |
\n",
+ "| 539.4710179205795 | 5221.16455078125 | 4.891251087188721 | 6 |
\n",
+ "| 539.4914521464307 | 5216.07958984375 | 4.892819404602051 | 6 |
\n",
+ "| 539.5118864718097 | 5225.43359375 | 4.891888618469238 | 6 |
\n",
+ "| 539.5323205971945 | 5233.111328125 | 4.892074108123779 | 6 |
\n",
+ "| 539.5527548221144 | 5221.17333984375 | 4.891964435577393 | 6 |
\n",
+ "| 539.573189147035 | 5220.09521484375 | 4.891523361206055 | 6 |
\n",
+ "| ... | ... | ... | ... |
\n",
+ "| 905.8044143491425 | 5862.43798828125 | 4.119598388671875 | 9 |
\n",
+ "| 905.824848745775 | 5863.95458984375 | 4.118742942810059 | 9 |
\n",
+ "| 905.845282941933 | 5870.349609375 | 4.119640827178955 | 9 |
\n",
+ "| 905.865717337867 | 5867.27099609375 | 4.119102478027344 | 9 |
\n",
+ "| 905.8861516335674 | 5868.67822265625 | 4.119019031524658 | 9 |
\n",
+ "| 905.9065858290269 | 5864.173828125 | 4.119871616363525 | 9 |
\n",
+ "| 905.9270202242624 | 5861.61572265625 | 4.119407653808594 | 9 |
\n",
+ "
"
+ ],
+ "text/plain": [
+ "\n",
+ " time flux error quarter\n",
+ " float64 float64 float64 int64 \n",
+ "----------------- ---------------- ----------------- -------\n",
+ "539.4710179205795 5221.16455078125 4.891251087188721 6\n",
+ "539.4914521464307 5216.07958984375 4.892819404602051 6\n",
+ "539.5118864718097 5225.43359375 4.891888618469238 6\n",
+ "539.5323205971945 5233.111328125 4.892074108123779 6\n",
+ "539.5527548221144 5221.17333984375 4.891964435577393 6\n",
+ " 539.573189147035 5220.09521484375 4.891523361206055 6\n",
+ " ... ... ... ...\n",
+ "905.8044143491425 5862.43798828125 4.119598388671875 9\n",
+ " 905.824848745775 5863.95458984375 4.118742942810059 9\n",
+ " 905.845282941933 5870.349609375 4.119640827178955 9\n",
+ " 905.865717337867 5867.27099609375 4.119102478027344 9\n",
+ "905.8861516335674 5868.67822265625 4.119019031524658 9\n",
+ "905.9065858290269 5864.173828125 4.119871616363525 9\n",
+ "905.9270202242624 5861.61572265625 4.119407653808594 9"
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "tab = Table.read('KIC2157356.txt',format='ascii')\n",
+ "tab['quarter'] = tab['quarter'].astype('int')\n",
+ "tab"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "qs = sorted(np.unique(tab['quarter']))\n",
+ "plt.figure()\n",
+ "means = []\n",
+ "cycle_map = {}\n",
+ "for i, q in enumerate(qs):\n",
+ " ind = tab['quarter']==q\n",
+ " t = tab[ind]\n",
+ " plt.errorbar(t['time'],t['flux'], yerr=t['error'], marker='.', linestyle='None', alpha=0.01)\n",
+ " meanflux = np.mean(t['flux'])\n",
+ " cycle_map[q] = ind\n",
+ " means.append(meanflux)\n",
+ " if i == 0:\n",
+ " plt.axhline(meanflux, label='m', color='grey', ls=\":\")\n",
+ " else:\n",
+ "\n",
+ " vmin = means[0]\n",
+ " vmax = meanflux\n",
+ "\n",
+ " plt.plot((t['time'][0], t['time'][0]), (vmin, vmax), label=rf'$c_{i}$', color=f'C{i}', ls='--') \n",
+ " \n",
+ "plt.xlabel('Time')\n",
+ "plt.ylabel('Flux')\n",
+ "plt.legend(frameon=False);\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### As you can see there is some kind of periodic singal, but it's not perfectly regular. There is also the usual offsets between Kepler photometry in different cycles.\n",
+ "\n",
+ "### You'll need four parameters to describe constants ($m, c_1, c_2, c_3$) to renormalize the flux to the first cycle, illustrated in the figure above. \n",
+ "### $m$ specifies the mean of the Gaussian process, while $c_1, c_2, c_3$ are nuisance parameters. \n",
+ "\n",
+ "### You know how to implement a model with one common zeropoint and multiple offsets - this was what you did on your midterm.\n",
+ "\n",
+ "\n",
+ "### You'll also need some model to describe the quasi-periodic oscillations. There's no good way to write down a model in real for these in real space because stellar magnetic fields are incredibly complicated. \n",
+ "\n",
+ "### Instead we'll write down a model for the covariance between the observations and use a Gaussian process to model the star. You can model quasi-periodic correlation structure as something periodic + something that varies the periodicity smoothly:\n",
+ "\n",
+ "## $$k(t_i, t_j) = A\\cdot \\exp\\left(-\\Gamma_1\\cdot \\sin^2\\left(\\frac{\\pi}{P}|t_i - t_j|\\right) - \\frac{|t_i-t_j|^2}{\\lambda}) \\right) $$\n",
+ "\n",
+ "### This is another 4 parameters, ($A, \\Gamma_1, P, \\lambda$) parameters for a total of 8: ($m, c_1, c_2, c_3, A, \\Gamma_1, P, \\lambda$)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "### Q1: To implement the GP correlations, use the `george` package to construct this quasi-periodic kernel\n",
+ "https://george.readthedocs.io/en/latest/user/kernels/\n",
+ "\n",
+ "\n",
+ "### In particular, you should be able to combine `ExpSine2Kernel` and `ExpSquaredKernel` to get a model for the quasi-periodic oscillations. (20 pts)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Dropping this problem as 1 of the 2 assignments\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('Dropping this problem as 1 of the 2 assignments')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Q2: To implement the full model, read how to use `george`'s modeling protocol: (20 pts)\n",
+ "https://george.readthedocs.io/en/latest/tutorials/model/"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Dropping this problem as 1 of the 2 assignments\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('Dropping this problem as 1 of the 2 assignments')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Q3: With your model and likelihood constructured, write down priors on the parameters (you should be able to estimate from the plots) (20 pts)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Dropping this problem as 1 of the 2 assignments\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('Dropping this problem as 1 of the 2 assignments')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Q4: Use `emcee` to optimize the model parameters and hyper-parameters, **using only every 10th sample in time**\n",
+ "### (Don't go overboard with the number of walkers or steps) (20 pts)\n",
+ "https://george.readthedocs.io/en/latest/tutorials/hyper/ may help "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Dropping this problem as 1 of the 2 assignments\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('Dropping this problem as 1 of the 2 assignments')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Q5: Plot your posterior model over the data after correcting for the offsets, showing the points you used to condition the GP in red, and the remaining data in black. (20 pts)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Dropping this problem as 1 of the 2 assignments\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('Dropping this problem as 1 of the 2 assignments')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# P2. Random Forests\n",
+ "\n",
+ "For this work, we'll use the datasets produced by [Dey et al. (2022)](https://ui.adsabs.harvard.edu/abs/2022MNRAS.515.5285D/abstract), who trained a deep capsule network on postage stamps of SDSS galaxies to predict photometric redshifts. \n",
+ "\n",
+ "We're not going to use a deep capsule network on postage stamps, but we can use tabular data. This won't be as performant, but it's still instructive to see how well we can do with a simple random forest. Dey et al. have done an excellent job making their data available - http://d-scholarship.pitt.edu/42023/ (all of it)\n",
+ "\n",
+ "You will need the [training set](http://d-scholarship.pitt.edu/42023/9/cat_train.csv) and the [test set](http://d-scholarship.pitt.edu/42023/8/cat_test.csv).\n",
+ "\n",
+ "I suggest reading through Sec. 2 of the paper to get some sense of what the data is. Importantly, the data includes columns for photometric redshift already. You can't use these to train your random forest (duh.). I've limited the number of columns you can use to a set defined below. If you use more than these (e.g. the GalaxyZoo parameters) you might get better performance at the cost of a smaller training sample because you've also got to filter missing data. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "train_cols = ['dered_petro_u', 'dered_petro_g', 'dered_petro_r', 'dered_petro_i', 'dered_petro_z',\\\n",
+ " 'petroMagErr_u', 'petroMagErr_g', 'petroMagErr_r', 'petroMagErr_i', 'petroMagErr_z',\\\n",
+ " 'v_disp', 'sersicN_r', 'petroR90_r']\n",
+ "#pred_cols = ['bestObjID', 'z', 'zErr', 'zphot', 'dzphot']\n",
+ "pred_cols = ['z', 'zErr'] # This seems to give much more logical results - 'bestObjID' gets all wacky"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Q6. Pre-process the data\n",
+ "\n",
+ "All ML work involves some amount of cleaning and pre-processing the data.\n",
+ "Filter data that have `zphot_reliable` == `True`, and have redshifts and photo-zs >= 0. \n",
+ "Next filter any entries in the `train_cols` that have any value that is > 5 $\\times$ the normally-scaled Median Absolute Deviation (as described in Sec 2.3) (`scipy.stats.median_abs_deviation` is your friend). \n",
+ "Your pre-processed training data should have 357397 entries.\n",
+ "Make a hexbin plot of `zphot` vs `z` for the training data (to avoid plotting that many points) but replicate Fig. 3 in Dey et al. \n",
+ "(35 pts)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/numpy/core/fromnumeric.py:758: UserWarning: Warning: 'partition' will ignore the 'mask' of the MaskedColumn.\n",
+ " a.partition(kth, axis=axis, kind=kind, order=order)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "350063\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Pre-processing\n",
+ "def clip(tab, col):\n",
+ " med = np.median(tab[col])\n",
+ " mad = st.median_abs_deviation(tab[col], scale='normal')\n",
+ " ran = [med - (5 * mad), med + (5 * mad)]\n",
+ " tab = tab[tab[col] >= ran[0]]\n",
+ " tab = tab[tab[col] <= ran[1]]\n",
+ " return tab\n",
+ "\n",
+ "\n",
+ "train_tab = Table.read('cat_train.csv')\n",
+ "test_tab = Table.read('cat_test.csv')\n",
+ "\n",
+ "train_tab = train_tab[train_tab['zphot_reliable'] == True]\n",
+ "test_tab = test_tab[test_tab['zphot_reliable'] == True]\n",
+ "\n",
+ "train_tab = clip(train_tab, train_cols[0])\n",
+ "\n",
+ "for col in train_cols:\n",
+ " train_tab = clip(train_tab, col)\n",
+ " test_tab = clip(test_tab, col)\n",
+ " \n",
+ "print(len(train_tab))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "Text(0.05, 0.99, '\\n$\\\\sigma_{NMAD}=0.0101$\\n$f_{outlier}=0.0124$\\n$\\\\langle\\\\frac{\\\\Delta z}{1+z_{spec}}\\\\rangle=0.0119$')"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Quantities\n",
+ "sig_nmad = st.median_abs_deviation(train_tab['zphot'] - train_tab['z'])\n",
+ "delz = np.abs((train_tab['z'] - train_tab['zphot']) / (1 + train_tab['z']))\n",
+ "delz_av = np.average(delz)\n",
+ "f_out = float(len(delz[delz > 0.05])) / float(len(delz))\n",
+ "\n",
+ "# Plot\n",
+ "fig, ax = plt.subplots(figsize=(6,6))\n",
+ "hb = ax.hexbin(train_tab['z'], train_tab['zphot'], cmap='viridis', mincnt=1, gridsize=(350,350))\n",
+ "cb = fig.colorbar(hb, label='Number of galaxies per pixel')\n",
+ "x0 = np.asarray([0, 0.4])\n",
+ "ax.plot(x0, x0, color='grey', linestyle='-') # z_p = z_s\n",
+ "ax.plot(x0, (1.05 * x0 + 0.05), color='grey', linestyle='--') # delz / (1 + z_s) = 0.05\n",
+ "ax.plot(x0, (0.95 * x0 - 0.05), color='grey', linestyle='--') # - delz / (1 + z_s) = 0.05\n",
+ "ax.set_xlim(0, 0.4)\n",
+ "ax.set_ylim(0, 0.4)\n",
+ "ax.grid(linestyle='--')\n",
+ "ax.set_xlabel(r'$z_{spec}$')\n",
+ "ax.set_ylabel(r'$z_{phot}$')\n",
+ "\n",
+ "textstr = '\\n'.join(('',\n",
+ " r'$\\sigma_{NMAD}=%.4f$' % (sig_nmad, ),\n",
+ " r'$f_{outlier}=%.4f$' % (delz_av, ),\n",
+ " r'$\\langle\\frac{\\Delta z}{1+z_{spec}}\\rangle=%.4f$' % (f_out, )))\n",
+ "props = dict(boxstyle='round', facecolor='white', alpha=1)\n",
+ "ax.text(0.05, 0.99, textstr, transform=ax.transAxes, fontsize=12,\n",
+ " verticalalignment='top', bbox=props)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Q7. Train the forest(s)\n",
+ "\n",
+ "Using `n_estimators` (i.e. number of trees) in (5, 20, 50, 200, 500), train a random forest. You can use all the cores your CPU has with `n_jobs=-1`. Limit the maximum number of features at each branch with `sqrt`. Use the inverse variance of the redshifts as your sample weights. Plot the `oob_score` vs the number of trees. For each of the forests you trained, make a plot of the feature importances. (35 pts)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/sklearn/ensemble/_forest.py:584: UserWarning: Some inputs do not have OOB scores. This probably means too few trees were used to compute any reliable OOB estimates.\n",
+ " warn(\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/sklearn/ensemble/_forest.py:584: UserWarning: Some inputs do not have OOB scores. This probably means too few trees were used to compute any reliable OOB estimates.\n",
+ " warn(\n"
+ ]
+ }
+ ],
+ "source": [
+ "n_estimators = [5, 20, 50, 200, 500]\n",
+ "train_pan = train_tab.to_pandas().dropna()\n",
+ "#f = open(\"rfr_dict.pkl\",\"wb\")\n",
+ "#pickle.dump(rfr_dict,f)\n",
+ "#f.close()\n",
+ "oobs = []\n",
+ "fimpts = []\n",
+ "for n in n_estimators:\n",
+ " rfr = sklearn.ensemble.RandomForestRegressor(n_estimators=n, n_jobs=-1, max_features='sqrt', \n",
+ " oob_score=True, random_state=42)\n",
+ " x = train_pan[train_cols]\n",
+ " y = train_pan[pred_cols]\n",
+ " wht = train_pan['zErr'] ** -2\n",
+ " rfr.fit(x, y, wht)\n",
+ " oobs.append(rfr.oob_score_)\n",
+ " fimpts.append(rfr.feature_importances_)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "rf_tab = Table([n_estimators, oobs], names=('n', 'oobs'))\n",
+ "for c, colname in enumerate(train_cols):\n",
+ " col = []\n",
+ " for n in range(len(n_estimators)):\n",
+ " col.append(fimpts[n][c])\n",
+ " rf_tab[colname] = col\n",
+ "rf_tab.write('rf.tab', format='ascii', overwrite=True)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "Text(0, 0.5, 'oobs score')"
+ ]
+ },
+ "execution_count": 19,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "rf_tab = Table.read('rf.tab', format='ascii')\n",
+ "\n",
+ "fig, ax = plt.subplots(figsize=(4,4), dpi=200)\n",
+ "ax.plot(rf_tab['n'], rf_tab['oobs'])\n",
+ "ax.set_xscale('log')\n",
+ "ax.set_xlabel('# of Branches')\n",
+ "ax.set_ylabel('oobs score')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig, axs = plt.subplots(nrows=len(n_estimators), ncols=1, figsize=(4,12), dpi=200)\n",
+ "for n in range(len(n_estimators)):\n",
+ " impts = []\n",
+ " for col in train_cols:\n",
+ " impts.append(rf_tab[col][n])\n",
+ " \n",
+ " ax = axs[n]\n",
+ " ax.barh(train_cols, impts)\n",
+ " ax.set_title('n = %i' % n_estimators[n])\n",
+ " ax.set_xlabel('Feature Importance')\n",
+ "\n",
+ "plt.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Q8. Test.\n",
+ "\n",
+ "Pick your best performing forest from Q7. Load the test data (remember to apply any cuts you did to the training data). Use your random forest to predict the photo-z. Replicate Fig. 3 and Fig. 4 with your photo-z prediction *and* the photo-z prediction from SDSS included in the file. (30 pts, 10 pts for prediction, 10 for the two figures)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "opt_n = n_estimators[np.argmax(rf_tab['oobs'])]\n",
+ "rfr = sklearn.ensemble.RandomForestRegressor(n_estimators=opt_n, n_jobs=-1, max_features='sqrt', \n",
+ " oob_score=True, random_state=42)\n",
+ "x = train_pan[train_cols]\n",
+ "y = train_pan[pred_cols]\n",
+ "wht = train_pan['zErr'] ** -2\n",
+ "rfr.fit(x, y, wht)\n",
+ "test_pan = test_tab.to_pandas().dropna()\n",
+ "xt = test_pan[train_cols]\n",
+ "pred_pan = pd.DataFrame(rfr.predict(xt), columns=pred_cols)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[-0.00435766 0.00457395 0.01070292 ... -0.01665639 0.00269457\n",
+ " 0.00023237]\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(test_pan['z'].values - pred_pan['z'].values)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Plotting time\n",
+ "def makefig34(z, zphot, title):\n",
+ " # Quantities\n",
+ " sig_nmad = st.median_abs_deviation(zphot - z)\n",
+ " delz = (z - zphot) / (1 + z)\n",
+ " delz_abs = np.abs(delz)\n",
+ " delz_av = np.average(delz_abs)\n",
+ " f_out = float(len(delz[delz > 0.05])) / float(len(delz))\n",
+ " \n",
+ " # Plot\n",
+ " fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(8,4), dpi=200)\n",
+ " \n",
+ " # Figure 3\n",
+ " axs[0].tick_params(direction='in')\n",
+ " hb = axs[0].hexbin(z, zphot, cmap='viridis', mincnt=1, gridsize=(350,350))\n",
+ " cb = fig.colorbar(hb, label='Number of galaxies per pixel')\n",
+ " x0 = np.asarray([0, 0.4])\n",
+ " axs[0].plot(x0, x0, color='grey', linestyle='-') # z_p = z_s\n",
+ " axs[0].plot(x0, (1.05 * x0 + 0.05), color='grey', linestyle='--') # delz / (1 + z_s) = 0.05\n",
+ " axs[0].plot(x0, (0.95 * x0 - 0.05), color='grey', linestyle='--') # - delz / (1 + z_s) = 0.05\n",
+ " axs[0].set_xlim(0, 0.4)\n",
+ " axs[0].set_ylim(0, 0.4)\n",
+ " axs[0].grid(linestyle='--')\n",
+ " axs[0].set_xlabel(r'$z_{spec}$')\n",
+ " if title == 'SDSS':\n",
+ " axs[0].set_ylabel(r'$z_{phot}$')\n",
+ " else:\n",
+ " axs[0].set_ylabel(r'$z_{pred}$')\n",
+ " textstr = '\\n'.join(('',\n",
+ " r'$\\sigma_{NMAD}=%.4f$' % (sig_nmad, ),\n",
+ " r'$f_{outlier}=%.4f$' % (delz_av, ),\n",
+ " r'$\\langle\\frac{\\Delta z}{1+z_{spec}}\\rangle=%.4f$' % (f_out, )))\n",
+ " props = dict(boxstyle='round', facecolor='white', alpha=1)\n",
+ " axs[0].text(0.05, 0.99, textstr, transform=axs[0].transAxes, fontsize=10,\n",
+ " verticalalignment='top', bbox=props)\n",
+ " axs[0].set_title('Fig. 3: ' + title)\n",
+ " \n",
+ " # Figure 4\n",
+ " bn = 0.1\n",
+ " xs = np.linspace(-bn, bn, 1000)\n",
+ " delz_mean = np.average(delz)\n",
+ " norman = st.norm.pdf(xs, delz_mean, sig_nmad)\n",
+ " axs[1].plot(xs, norman, color='orange')\n",
+ " \n",
+ " axs[1].tick_params(direction='in')\n",
+ " axs[1].hist(delz, bins=60, density=True, color='lightblue')\n",
+ " axs[1].set_xlim(-bn, bn)\n",
+ " axs[1].grid(linestyle='--')\n",
+ " axs[1].set_xlabel(r'$\\frac{\\Delta z}{1+z_{spec}}$')\n",
+ " axs[1].set_ylabel('Relative Frequency')\n",
+ " axs[1].set_title('Fig. 4: ' + title)\n",
+ " \n",
+ " plt.tight_layout()\n",
+ "\n",
+ "\n",
+ "makefig34(train_pan['z'].values, train_pan['zphot'].values, 'SDSS')\n",
+ "makefig34(test_pan['z'].values, pred_pan['z'].values, 'My RF')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python [conda env:fds] *",
+ "language": "python",
+ "name": "conda-env-fds-py"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/homework/LiamNolan/06/KIC2157356.txt b/homework/LiamNolan/06/KIC2157356.txt
new file mode 100644
index 0000000..5ab44ad
--- /dev/null
+++ b/homework/LiamNolan/06/KIC2157356.txt
@@ -0,0 +1,14589 @@
+time flux error quarter
+539.4710179205795 5221.16455078125 4.891251087188721 6.0
+539.4914521464307 5216.07958984375 4.892819404602051 6.0
+539.5118864718097 5225.43359375 4.891888618469238 6.0
+539.5323205971945 5233.111328125 4.892074108123779 6.0
+539.5527548221144 5221.17333984375 4.891964435577393 6.0
+539.573189147035 5220.09521484375 4.891523361206055 6.0
+539.5936232714812 5222.14208984375 4.893854141235352 6.0
+539.6140574957026 5224.57958984375 4.893648147583008 6.0
+539.6344918194518 5223.78564453125 4.894421100616455 6.0
+539.6549259432068 5231.61669921875 4.894259929656982 6.0
+539.6753601664968 5220.6865234375 4.893633842468262 6.0
+539.6957944897877 5221.1767578125 4.893622875213623 6.0
+539.7162287126048 5223.71240234375 4.8946852684021 6.0
+539.7366628351956 5220.2041015625 4.894609451293945 6.0
+539.7570971575478 5221.7158203125 4.8934807777404785 6.0
+539.7775313794409 5222.7451171875 4.894133567810059 6.0
+539.7979655013332 5224.58544921875 4.894071102142334 6.0
+539.8183998227614 5221.95654296875 4.895394802093506 6.0
+539.838833943948 5234.009765625 4.894789695739746 6.0
+539.8592682649105 5221.0576171875 4.891158580780029 6.0
+539.8797024856322 5216.453125 4.8923773765563965 6.0
+539.9001366061275 5225.3720703125 4.892318248748779 6.0
+539.9205709261587 5222.2939453125 4.892451286315918 6.0
+539.9410051461891 5216.4580078125 4.892969608306885 6.0
+539.9614392657459 5219.8212890625 4.893195629119873 6.0
+539.9818735850786 5224.25048828125 4.893740653991699 6.0
+540.0023078041704 5214.88818359375 4.893039226531982 6.0
+540.0227419228031 5224.07763671875 4.894540309906006 6.0
+540.0431762414373 5227.23828125 4.894280433654785 6.0
+540.0636104596051 5228.4267578125 4.894853115081787 6.0
+540.0840446775328 5217.3818359375 4.894943714141846 6.0
+540.1044788952349 5218.76953125 4.894562244415283 6.0
+540.124913112697 5212.4013671875 4.893524646759033 6.0
+540.1657815467042 5214.95068359375 4.893892765045166 6.0
+540.186215763475 5219.47705078125 4.893922328948975 6.0
+540.2066500797737 5227.8671875 4.894657135009766 6.0
+540.227084295846 5221.44677734375 4.894467830657959 6.0
+540.2475184116774 5216.76904296875 4.894023418426514 6.0
+540.2679527272849 5225.47216796875 4.896175861358643 6.0
+540.2883869424259 5216.63818359375 4.895997524261475 6.0
+540.3088210573333 5214.369140625 4.896141529083252 6.0
+540.3292553722349 5218.35693359375 4.895681381225586 6.0
+540.3496895866774 5222.4072265625 4.896216869354248 6.0
+540.3701237006462 5214.89990234375 4.895313739776611 6.0
+540.3905580146238 5220.8720703125 4.895748138427734 6.0
+540.4109922283678 5216.09814453125 4.895146369934082 6.0
+540.4314263416381 5214.66748046875 4.894029140472412 6.0
+540.4518606546844 5217.18798828125 4.89610481262207 6.0
+540.4722947674964 5213.22900390625 4.895731449127197 6.0
+540.4927290800697 5216.25537109375 4.896398067474365 6.0
+540.5131632921839 5222.892578125 4.897199630737305 6.0
+540.5335974042973 5217.95556640625 4.89674186706543 6.0
+540.5540317159393 5216.55078125 4.895070552825928 6.0
+540.574465927355 5217.61083984375 4.895684719085693 6.0
+540.5949001385379 5217.05908203125 4.895843982696533 6.0
+540.6153343494807 5212.01904296875 4.8963117599487305 6.0
+540.6357685601979 5221.51904296875 4.896169185638428 6.0
+540.6562027704495 5212.93994140625 4.895749092102051 6.0
+540.6766369804609 5225.02587890625 4.897115230560303 6.0
+540.6970711902468 5217.8974609375 4.895944595336914 6.0
+540.7175053997998 5213.36376953125 4.896998882293701 6.0
+540.7379397091136 5210.375 4.896181106567383 6.0
+540.7583738179674 5219.2861328125 4.897007942199707 6.0
+540.7788081268227 5213.31982421875 4.896083831787109 6.0
+540.7992423352043 5211.826171875 4.895425319671631 6.0
+540.8196764433596 5213.4794921875 4.896745681762695 6.0
+540.8401107512764 5213.46044921875 4.895123481750488 6.0
+540.8605449589668 5214.1708984375 4.897132873535156 6.0
+540.8809790661908 5215.2490234375 4.89549446105957 6.0
+540.9014133731835 5221.4453125 4.897830009460449 6.0
+540.9218475799353 5224.07080078125 4.8971428871154785 6.0
+540.9422816864608 5211.81591796875 4.897022724151611 6.0
+540.9627159927477 5217.53466796875 4.897524356842041 6.0
+540.9831501988083 5218.3564453125 4.897166728973389 6.0
+541.0035843044025 5207.20263671875 4.897072792053223 6.0
+541.0240186097653 5208.7529296875 4.894843101501465 6.0
+541.0444528148873 5211.47509765625 4.897841930389404 6.0
+541.0648871197845 5206.826171875 4.896744251251221 6.0
+541.0853212244401 5211.31201171875 4.8964457511901855 6.0
+541.126189632836 5206.005859375 4.895673751831055 6.0
+541.1466238365683 5210.021484375 4.895411491394043 6.0
+541.1670580400605 5212.91162109375 4.8964691162109375 6.0
+541.1874922433271 5211.21484375 4.8959760665893555 6.0
+541.2079264461208 5216.49951171875 4.895586967468262 6.0
+541.2283606489218 5222.2724609375 4.897108554840088 6.0
+541.2487948512571 5217.85498046875 4.895817756652832 6.0
+541.2692290533596 5216.1162109375 4.897392749786377 6.0
+541.289663255222 5210.236328125 4.895978927612305 6.0
+541.3100975568595 5223.0693359375 4.898825168609619 6.0
+541.3305316580227 5210.94189453125 4.897177696228027 6.0
+541.3509659591946 5211.87109375 4.897460460662842 6.0
+541.3714001599001 5220.220703125 4.898230075836182 6.0
+541.391834260372 5211.1201171875 4.897754669189453 6.0
+541.4122685606053 5205.55322265625 4.897641181945801 6.0
+541.4327027603795 5208.66796875 4.8976545333862305 6.0
+541.4531368601456 5210.662109375 4.897927284240723 6.0
+541.4940053585306 5217.513671875 4.898743152618408 6.0
+541.5144394573726 5218.5849609375 4.898568630218506 6.0
+541.5348737557433 5209.69873046875 4.897822380065918 6.0
+541.5553079541205 5221.4150390625 4.899723529815674 6.0
+541.5757421520248 5215.65869140625 4.898690223693848 6.0
+541.5961763497035 5219.40283203125 4.898460865020752 6.0
+541.6166105471493 5212.3681640625 4.898789882659912 6.0
+541.6370447443551 5208.38330078125 4.898849964141846 6.0
+541.6779131378498 5206.8837890625 4.898705959320068 6.0
+541.698347434125 5211.97802734375 4.899057388305664 6.0
+541.7187815301731 5209.68408203125 4.898737907409668 6.0
+541.7392157259892 5209.24755859375 4.898847579956055 6.0
+541.7596500213331 5211.82568359375 4.898627281188965 6.0
+541.7800842166835 5202.23681640625 4.898011207580566 6.0
+541.8005183115674 5206.75244140625 4.898565769195557 6.0
+541.8209526062128 5200.77001953125 4.8982253074646 6.0
+541.8413867006311 5213.5390625 4.898551940917969 6.0
+541.8618208948174 5200.1552734375 4.897091388702393 6.0
+541.8822551885314 5216.6328125 4.9005126953125 6.0
+541.9026892820184 5204.90771484375 4.8975701332092285 6.0
+541.9231234752733 5206.10888671875 4.897862911224365 6.0
+541.9435577682889 5205.80517578125 4.897514343261719 6.0
+541.9639918610774 5220.60791015625 4.899232864379883 6.0
+541.9844261534017 5208.7783203125 4.897810459136963 6.0
+542.004860345718 5202.87060546875 4.897446632385254 6.0
+542.0252944375752 5208.46923828125 4.898268222808838 6.0
+542.0457287292011 5210.3916015625 4.8988037109375 6.0
+542.0661629205861 5210.89111328125 4.898695945739746 6.0
+542.0865970115119 5205.8876953125 4.897988319396973 6.0
+542.1070313022065 5207.4384765625 4.898669242858887 6.0
+542.127465492893 5213.513671875 4.898103713989258 6.0
+542.1683338728835 5213.2109375 4.89807653427124 6.0
+542.1887680626387 5213.39306640625 4.899004936218262 6.0
+542.2092022519355 5211.431640625 4.898679733276367 6.0
+542.229636541233 5214.88232421875 4.899797439575195 6.0
+542.2500706300561 5199.875 4.898548603057861 6.0
+542.2705049184224 5212.8818359375 4.898663520812988 6.0
+542.2909391067806 5208.52001953125 4.898960113525391 6.0
+542.3113731946796 5199.3232421875 4.89788818359375 6.0
+542.3318074825802 5211.99658203125 4.8996357917785645 6.0
+542.3522416700143 5209.8671875 4.899730682373047 6.0
+542.3726757569748 5198.5966796875 4.898708343505859 6.0
+542.393110043944 5203.67578125 4.89911413192749 6.0
+542.4339783169416 5207.2666015625 4.899343490600586 6.0
+542.4544126029796 5204.99755859375 4.898716449737549 6.0
+542.4748467885511 5201.7587890625 4.898601055145264 6.0
+542.4952808741145 5203.97314453125 4.898621559143066 6.0
+542.5157151592211 5197.6767578125 4.898139953613281 6.0
+542.5361492443262 5209.7978515625 4.900256156921387 6.0
+542.5565835289599 5201.74267578125 4.89894437789917 6.0
+542.5770177133672 5209.2421875 4.899559497833252 6.0
+542.5974517973082 5212.77490234375 4.899479866027832 6.0
+542.6178860812433 5203.666015625 4.9000630378723145 6.0
+542.6383202647194 5211.1484375 4.8998003005981445 6.0
+542.6587544479553 5210.17138671875 4.900010585784912 6.0
+542.6791886309657 5202.35693359375 4.899810314178467 6.0
+542.6996228135104 5208.08935546875 4.8999762535095215 6.0
+542.7200569960551 5192.2421875 4.898226261138916 6.0
+542.7404911781268 5208.6865234375 4.899490833282471 6.0
+542.760925359973 5199.94580078125 4.898625373840332 6.0
+542.7813595415791 5200.3056640625 4.898190498352051 6.0
+542.8222279038746 5205.0634765625 4.900021553039551 6.0
+542.8630963649994 5200.47802734375 4.8998589515686035 6.0
+542.883530445215 5209.9619140625 4.899960041046143 6.0
+542.9039647249592 5206.615234375 4.900017261505127 6.0
+542.92439890471 5207.47998046875 4.899965286254883 6.0
+542.9448329839943 5211.36767578125 4.900426864624023 6.0
+542.96526726304 5207.55615234375 4.900267601013184 6.0
+542.9857014418594 5209.13427734375 4.900382041931152 6.0
+543.0061355202124 5203.1240234375 4.899759769439697 6.0
+543.0265697985596 5210.57421875 4.900242328643799 6.0
+543.0470039764477 5199.07470703125 4.899752616882324 6.0
+543.067438154103 5205.31884765625 4.899662494659424 6.0
+543.0878723312853 5211.48779296875 4.901232719421387 6.0
+543.1083065084749 5206.81640625 4.900172233581543 6.0
+543.1287406851989 5195.953125 4.898388385772705 6.0
+543.1491748616827 5209.56591796875 4.899041175842285 6.0
+543.169609037941 5200.81201171875 4.898437976837158 6.0
+543.1900432139664 5205.74072265625 4.901010990142822 6.0
+543.2104773897518 5207.24560546875 4.90078067779541 6.0
+543.2309115650787 5199.79931640625 4.9001641273498535 6.0
+543.2513457401728 5193.08984375 4.899673938751221 6.0
+543.2717799150269 5200.78759765625 4.9003005027771 6.0
+543.2922140896553 5205.89892578125 4.900930404663086 6.0
+543.3126483638189 5209.24658203125 4.901057243347168 6.0
+543.3330824377408 5197.91552734375 4.900578498840332 6.0
+543.353516611438 5210.25244140625 4.900849342346191 6.0
+543.3943849581265 5206.74462890625 4.900079727172852 6.0
+543.4148191308923 5212.88818359375 4.90181303024292 6.0
+543.435253403426 5203.43994140625 4.901232719421387 6.0
+543.4556874757182 5203.35107421875 4.900641918182373 6.0
+543.4761217477862 5211.63427734375 4.9018731117248535 6.0
+543.4965559196135 5195.96875 4.899898052215576 6.0
+543.5169899909815 5204.4375 4.900808811187744 6.0
+543.5374242621183 5200.11865234375 4.900699138641357 6.0
+543.5578584330215 5203.36767578125 4.901119709014893 6.0
+543.5782925036838 5199.91162109375 4.900871276855469 6.0
+543.5987267738892 5213.8505859375 4.90373420715332 6.0
+543.6191609440866 5206.06787109375 4.9016313552856445 6.0
+543.6395951138256 5196.826171875 4.899896144866943 6.0
+543.660029283099 5204.45751953125 4.902605056762695 6.0
+543.6804634523724 5202.08251953125 4.900404453277588 6.0
+543.7008976211728 5214.01220703125 4.904163837432861 6.0
+543.7213317899805 5208.9140625 4.9005351066589355 6.0
+543.7417659583152 5201.439453125 4.9002485275268555 6.0
+543.7622001261916 5200.85986328125 4.901158332824707 6.0
+543.782634294068 5203.72314453125 4.900153160095215 6.0
+543.8030684614787 5199.01611328125 4.899554252624512 6.0
+543.8235027288829 5195.33447265625 4.898550033569336 6.0
+543.8439368955951 5217.8134765625 4.9033708572387695 6.0
+543.8643709622993 5199.1318359375 4.901912212371826 6.0
+543.8848052287794 5209.94677734375 4.901808261871338 6.0
+543.9052392947924 5213.70947265625 4.903465747833252 6.0
+543.9256734605733 5203.75634765625 4.901104927062988 6.0
+543.9461077261149 5202.30224609375 4.9008660316467285 6.0
+543.9665417911965 5202.2041015625 4.900276184082031 6.0
+543.9869759562716 5199.72607421875 4.901233673095703 6.0
+544.0074102208891 5211.67724609375 4.90407133102417 6.0
+544.0278442852723 5211.6767578125 4.90391731262207 6.0
+544.0482784494234 5203.5810546875 4.9015793800354 6.0
+544.0687127131023 5207.681640625 4.903392791748047 6.0
+544.1095810400002 5194.80908203125 4.900694370269775 6.0
+544.1300152027543 5204.09912109375 4.903058052062988 6.0
+544.1504493655084 5218.1103515625 4.904709339141846 6.0
+544.1708835277896 5213.1044921875 4.90195894241333 6.0
+544.191317690078 5204.85791015625 4.9009575843811035 6.0
+544.2117518519008 5203.4189453125 4.901391983032227 6.0
+544.2321860132506 5204.94482421875 4.901884078979492 6.0
+544.2526201746077 5212.55712890625 4.903689861297607 6.0
+544.2730543354992 5201.5380859375 4.903754711151123 6.0
+544.2934885961513 5207.42919921875 4.904106616973877 6.0
+544.3139226565763 5200.8681640625 4.901833534240723 6.0
+544.3343568167693 5206.6298828125 4.902921676635742 6.0
+544.3547910764901 5200.4970703125 4.902085781097412 6.0
+544.3752251362166 5197.43798828125 4.901350498199463 6.0
+544.3956593952462 5202.568359375 4.9016289710998535 6.0
+544.4160935542677 5202.49658203125 4.901573657989502 6.0
+544.4365276130629 5203.77685546875 4.903491020202637 6.0
+544.456961871394 5209.1474609375 4.904252052307129 6.0
+544.4773960294842 5204.42431640625 4.902968406677246 6.0
+544.4978300873481 5201.5126953125 4.901801109313965 6.0
+544.5182643449807 5201.80908203125 4.902112007141113 6.0
+544.5386985021396 5211.3525390625 4.905207633972168 6.0
+544.5591325590722 5207.1728515625 4.904375076293945 6.0
+544.5795668157734 5191.89208984375 4.901857852935791 6.0
+544.6000008722331 5209.3515625 4.904722690582275 6.0
+544.6204350282351 5188.25830078125 4.900984764099121 6.0
+544.6408692842379 5200.0107421875 4.9037041664123535 6.0
+544.6613034397669 5209.103515625 4.904435634613037 6.0
+544.6817374950697 5202.32470703125 4.903685569763184 6.0
+544.7021717499083 5194.431640625 4.903817176818848 6.0
+544.7226059047389 5192.2099609375 4.900876045227051 6.0
+544.7430400591111 5198.8408203125 4.901859760284424 6.0
+544.7634742132504 5201.82177734375 4.902895450592041 6.0
+544.7839083669169 5211.740234375 4.903822422027588 6.0
+544.8043425205906 5209.57373046875 4.903937339782715 6.0
+544.8247766737986 5192.23291015625 4.9013166427612305 6.0
+544.8452108267666 5193.3505859375 4.902389049530029 6.0
+544.8656450795097 5199.314453125 4.903194427490234 6.0
+544.8860791317857 5196.513671875 4.9035468101501465 6.0
+544.9065132840551 5203.14306640625 4.903253078460693 6.0
+544.9269475358669 5204.1513671875 4.904491901397705 6.0
+544.9473815874444 5200.52734375 4.904177665710449 6.0
+544.9678157385497 5191.806640625 4.902684211730957 6.0
+544.988249989663 5194.76513671875 4.903732776641846 6.0
+545.0086840403092 5199.40673828125 4.903923034667969 6.0
+545.0291182907167 5203.61669921875 4.904444217681885 6.0
+545.0495524406651 5203.66943359375 4.904458999633789 6.0
+545.0699864906128 5203.115234375 4.9044904708862305 6.0
+545.090420740089 5204.73583984375 4.90466833114624 6.0
+545.110854889339 5197.3427734375 4.903953552246094 6.0
+545.131289038356 5191.5498046875 4.903329372406006 6.0
+545.1517231869002 5189.953125 4.903261661529541 6.0
+545.1721573354516 5195.83251953125 4.903401851654053 6.0
+545.1925914835301 5197.09814453125 4.9039177894592285 6.0
+545.2130256313831 5189.5966796875 4.902773380279541 6.0
+545.2334597787703 5195.03759765625 4.901228904724121 6.0
+545.2538939261503 5196.78076171875 4.902812480926514 6.0
+545.2947622197607 5194.90478515625 4.903625011444092 6.0
+545.3151964659774 5195.17724609375 4.903800964355469 6.0
+545.3356305121997 5197.927734375 4.903081893920898 6.0
+545.3560646579572 5195.94091796875 4.904008865356445 6.0
+545.3764989034753 5194.19384765625 4.90399694442749 6.0
+545.3969329487663 5197.4072265625 4.904497146606445 6.0
+545.4173670935925 5200.90478515625 4.904679298400879 6.0
+545.4378013381793 5200.64501953125 4.904117107391357 6.0
+545.458235382539 5193.3193359375 4.90363073348999 6.0
+545.4786695266666 5187.6875 4.903234958648682 6.0
+545.4991037705549 5202.21826171875 4.904214382171631 6.0
+545.5399719571797 5189.611328125 4.903854846954346 6.0
+545.5808402428665 5199.65283203125 4.9042816162109375 6.0
+545.6012743851315 5195.99755859375 4.903991222381592 6.0
+545.6217086271572 5201.6962890625 4.904134750366211 6.0
+545.6421426689558 5195.09619140625 4.903381824493408 6.0
+545.6625769105231 5215.18408203125 4.905364990234375 6.0
+545.6830110516166 5199.36181640625 4.904146671295166 6.0
+545.7034451924847 5205.4775390625 4.904684543609619 6.0
+545.7238793331198 5197.05810546875 4.9035797119140625 6.0
+545.7443134735149 5193.98193359375 4.903210639953613 6.0
+545.7647476134516 5196.34814453125 4.903331756591797 6.0
+545.8260500318574 5210.498046875 4.905538558959961 6.0
+545.8464842708636 5201.7158203125 4.904995441436768 6.0
+545.8669183093953 5192.13818359375 4.903534889221191 6.0
+545.8873524477021 5197.28759765625 4.904237270355225 6.0
+545.9077866855368 5206.06689453125 4.904700756072998 6.0
+545.9282207233773 5208.8203125 4.905313014984131 6.0
+545.9486549607536 5204.47998046875 4.904285907745361 6.0
+545.9690889978956 5195.66064453125 4.9037299156188965 6.0
+546.009957371476 5185.23828125 4.903313636779785 6.0
+546.0303914076867 5194.08056640625 4.904182434082031 6.0
+546.050825543658 5200.41015625 4.904141426086426 6.0
+546.0712597794045 5191.5849609375 4.903410911560059 6.0
+546.0916938146838 5195.32275390625 4.903621673583984 6.0
+546.1121279499566 5190.85693359375 4.903415203094482 6.0
+546.1325621847718 5193.169921875 4.903985500335693 6.0
+546.1529963191133 5189.7197265625 4.903348445892334 6.0
+546.1734303534613 5191.38671875 4.903818607330322 6.0
+546.1938645873452 5193.51708984375 4.903844356536865 6.0
+546.2142987212283 5187.69921875 4.903263568878174 6.0
+546.2347328544056 5204.8896484375 4.9040656089782715 6.0
+546.2551669840977 5192.701171875 4.903374195098877 6.0
+546.2756011168094 5193.36669921875 4.904021739959717 6.0
+546.2960353492963 5188.32470703125 4.903123378753662 6.0
+546.3164693815488 5198.88427734375 4.9042134284973145 6.0
+546.3369035135693 5192.546875 4.903416156768799 6.0
+546.3573377451175 5189.71484375 4.903632640838623 6.0
+546.3777717764387 5194.57275390625 4.903895854949951 6.0
+546.3982059075206 5183.51904296875 4.902923107147217 6.0
+546.4186401383777 5190.85205078125 4.903262138366699 6.0
+546.4390741687675 5189.8388671875 4.903008937835693 6.0
+546.4595082991582 5193.15576171875 4.902265548706055 6.0
+546.4799425288438 5190.0791015625 4.903851509094238 6.0
+546.5003765585352 5189.7890625 4.903477668762207 6.0
+546.5208106879873 5190.28515625 4.902960300445557 6.0
+546.5412449169817 5188.9775390625 4.902973651885986 6.0
+546.5616789457417 5185.61279296875 4.902623653411865 6.0
+546.5821131740304 5188.34423828125 4.903326511383057 6.0
+546.6025472023248 5179.87841796875 4.902161598205566 6.0
+546.6229813301543 5184.96875 4.902660369873047 6.0
+546.6434155577444 5190.82080078125 4.903331756591797 6.0
+546.6638495848747 5196.86181640625 4.902773857116699 6.0
+546.6842837120057 5184.5263671875 4.903171062469482 6.0
+546.7047179386645 5189.28076171875 4.903036117553711 6.0
+546.7251520650971 5191.29443359375 4.903029918670654 6.0
+546.7455860910632 5191.1064453125 4.903310298919678 6.0
+546.7660203170235 5187.40869140625 4.903045177459717 6.0
+546.7864544425247 5187.755859375 4.903626441955566 6.0
+546.8068884677923 5192.91845703125 4.902948379516602 6.0
+546.8273226925885 5188.31298828125 4.902597904205322 6.0
+546.8477568173912 5185.05517578125 4.9032158851623535 6.0
+546.868191041729 5180.5537109375 4.902571678161621 6.0
+546.8886250658252 5181.7607421875 4.90247106552124 6.0
+546.9090591894637 5184.673828125 4.9024224281311035 6.0
+546.929493413103 5188.20703125 4.9035844802856445 6.0
+546.9499274362679 5190.41650390625 4.90342378616333 6.0
+546.970361559208 5180.28759765625 4.902610778808594 6.0
+546.9907957816831 5185.1572265625 4.902746200561523 6.0
+547.0112298041495 5182.45703125 4.903341770172119 6.0
+547.0316639261582 5176.5986328125 4.901974201202393 6.0
+547.0520981479349 5188.9638671875 4.9056196212768555 6.0
+547.4812146367258 5179.39208984375 4.901860237121582 6.0
+547.5016488519759 5184.44873046875 4.9017181396484375 6.0
+547.522082866999 5181.4208984375 4.90117073059082 6.0
+547.5425169815571 5183.015625 4.901485919952393 6.0
+547.5629511961088 5182.77197265625 4.901236534118652 6.0
+547.5833852102005 5188.89013671875 4.904575347900391 6.0
+547.6038193240602 5177.18994140625 4.9017205238342285 6.0
+547.6242535374477 5179.84716796875 4.901664733886719 6.0
+547.6446875506081 5178.38037109375 4.901895046234131 6.0
+547.6651216635364 5192.5546875 4.903168678283691 6.0
+547.6855558762254 5183.642578125 4.902066230773926 6.0
+547.7059899886881 5178.509765625 4.901604652404785 6.0
+547.7264240006771 5186.138671875 4.900839805603027 6.0
+547.746858212442 5177.056640625 4.903173446655273 6.0
+547.7672923239734 5178.095703125 4.899747848510742 6.0
+547.7877263350383 5191.884765625 4.901587009429932 6.0
+547.8081605458647 5177.40478515625 4.903082370758057 6.0
+547.8285946564647 5175.443359375 4.900465488433838 6.0
+547.8490288668254 5177.79638671875 4.901041030883789 6.0
+547.8694628767262 5182.81396484375 4.903870105743408 6.0
+547.8898969863949 5178.52978515625 4.902977466583252 6.0
+547.9103311958243 5185.4765625 4.90496301651001 6.0
+547.9307652050265 5172.75146484375 4.901849746704102 6.0
+547.9511993137639 5172.13818359375 4.9020676612854 6.0
+547.9716334222612 5175.15087890625 4.902149200439453 6.0
+547.992067530533 5172.68701171875 4.901254177093506 6.0
+548.0125015385711 5183.7666015625 4.90507173538208 6.0
+548.0329357461378 5176.68798828125 4.902105808258057 6.0
+548.0533698534782 5174.88525390625 4.904403209686279 6.0
+548.0738039605858 5183.02294921875 4.902887344360352 6.0
+548.0942380672204 5181.30419921875 4.904138088226318 6.0
+548.1146721736295 5178.9033203125 4.901853084564209 6.0
+548.1351063798065 5181.9228515625 4.903266429901123 6.0
+548.1555403857419 5178.9072265625 4.901933193206787 6.0
+548.1759744912197 5190.54833984375 4.9032206535339355 6.0
+548.1964086964654 5175.64892578125 4.900543212890625 6.0
+548.2168428014702 5179.98583984375 4.903855323791504 6.0
+548.2372768062487 5175.9580078125 4.901340961456299 6.0
+548.2577110105631 5179.35546875 4.9052252769470215 6.0
+548.2781451146366 5170.82958984375 4.901136875152588 6.0
+548.2985791184838 5177.48486328125 4.901915073394775 6.0
+548.3190133220996 5174.0771484375 4.904116630554199 6.0
+548.3394474252418 5170.3662109375 4.901120662689209 6.0
+548.3598814281577 5183.87109375 4.904874801635742 6.0
+548.3803156306094 5169.00537109375 4.903045177459717 6.0
+548.4007497330531 5170.83935546875 4.901958465576172 6.0
+548.4211837350376 5171.4755859375 4.9002203941345215 6.0
+548.4416179367909 5183.10888671875 4.903138160705566 6.0
+548.4620520380704 5173.34814453125 4.901051044464111 6.0
+548.482486239358 5178.0908203125 4.902413845062256 6.0
+548.5029202401784 5172.49365234375 4.900636672973633 6.0
+548.5233543407594 5174.52880859375 4.901811122894287 6.0
+548.5437885408828 5169.97119140625 4.902619361877441 6.0
+548.5642225407719 5167.5029296875 4.901823043823242 6.0
+548.5846566404216 5173.2158203125 4.901638984680176 6.0
+548.6050908398465 5182.55615234375 4.903625011444092 6.0
+548.6255248388043 5179.42529296875 4.904175758361816 6.0
+548.6459589375227 5175.1748046875 4.90220308303833 6.0
+548.6663930360155 5173.357421875 4.903974533081055 6.0
+548.6868271342755 5181.6591796875 4.904208660125732 6.0
+548.7072612320626 5179.53271484375 4.904365539550781 6.0
+548.7276953296241 5175.22412109375 4.904048919677734 6.0
+548.7481294269528 5175.60986328125 4.90107536315918 6.0
+548.7685636240421 5173.6259765625 4.9041242599487305 6.0
+548.7889977206723 5180.6416015625 4.904845237731934 6.0
+548.809431717069 5176.416015625 4.903172492980957 6.0
+548.8298659129941 5177.30029296875 4.903655052185059 6.0
+548.8503000089258 5181.552734375 4.903918743133545 6.0
+548.8707340043911 5180.8642578125 4.9040327072143555 6.0
+548.8911681996178 5170.01171875 4.903131008148193 6.0
+548.9116022943854 5175.19873046875 4.902599334716797 6.0
+548.9320362889193 5174.017578125 4.903314590454102 6.0
+548.9524704832147 5180.16162109375 4.903858184814453 6.0
+548.9729045772838 5172.5390625 4.902591228485107 6.0
+548.9933385711192 5177.30810546875 4.903982639312744 6.0
+549.0137727644833 5180.3408203125 4.902798175811768 6.0
+549.034206857621 5174.4169921875 4.90297269821167 6.0
+549.0546409502858 5183.63525390625 4.904394626617432 6.0
+549.0750750427251 5176.22412109375 4.903463363647461 6.0
+549.0955091351643 5178.05419921875 4.903789520263672 6.0
+549.1159433268986 5181.5322265625 4.903980731964111 6.0
+549.1363773186386 5176.3056640625 4.903654098510742 6.0
+549.1568114099136 5184.90380859375 4.903785228729248 6.0
+549.1772456009494 5181.4140625 4.90347957611084 6.0
+549.1976796917588 5176.61279296875 4.903677463531494 6.0
+549.2181136821018 5171.92529296875 4.90271520614624 6.0
+549.2385478722063 5175.4267578125 4.902794361114502 6.0
+549.2589819620844 5184.33251953125 4.903848171234131 6.0
+549.279415951496 5171.11376953125 4.901646614074707 6.0
+549.299850140902 5187.62841796875 4.904832363128662 6.0
+549.3202842296159 5179.85107421875 4.903956890106201 6.0
+549.3407182183291 5172.15966796875 4.902495384216309 6.0
+549.3611524068037 5176.40478515625 4.903503894805908 6.0
+549.3815863948184 5183.73974609375 4.902904033660889 6.0
+549.4428886569949 5176.18603515625 4.901375770568848 6.0
+549.463322843847 5182.71533203125 4.902300834655762 6.0
+549.4837569304582 5181.65673828125 4.902677536010742 6.0
+549.5041909166102 5179.216796875 4.902790069580078 6.0
+549.524625102531 5174.43115234375 4.902740478515625 6.0
+549.5654931736644 5172.48095703125 4.900260925292969 6.0
+549.5859273586539 5177.19189453125 4.901485443115234 6.0
+549.6063614434024 5182.18017578125 4.903224945068359 6.0
+549.6267955279254 5180.5546875 4.904006481170654 6.0
+549.6472296119828 5185.33154296875 4.904038429260254 6.0
+549.6676636958 5175.97412109375 4.902633190155029 6.0
+549.6880977793917 5176.5537109375 4.902689456939697 6.0
+549.7085319627513 5180.9453125 4.9033660888671875 6.0
+549.7289659456364 5175.2294921875 4.902792930603027 6.0
+549.7494001282976 5175.70166015625 4.901388645172119 6.0
+549.7698342107251 5183.65234375 4.9035162925720215 6.0
+549.7902681926789 5178.33056640625 4.9028520584106445 6.0
+549.8107023744087 5185.2578125 4.903495788574219 6.0
+549.8311364559049 5167.853515625 4.902850151062012 6.0
+549.8515704369274 5175.775390625 4.904285430908203 6.0
+549.8720046179587 5179.07861328125 4.903423309326172 6.0
+549.8924386985236 5182.01904296875 4.903437614440918 6.0
+549.9128726786148 5175.67041015625 4.903598308563232 6.0
+549.9333068587148 5183.63818359375 4.90379524230957 6.0
+549.9537409383483 5175.29931640625 4.902595520019531 6.0
+549.974174917741 5174.68603515625 4.902449131011963 6.0
+549.9946090966769 5175.318359375 4.903104305267334 6.0
+550.0150431753791 5170.90625 4.9019269943237305 6.0
+550.2193840465407 5177.72314453125 4.903173446655273 6.0
+550.2398180219825 5187.7890625 4.904729843139648 6.0
+550.2602520969522 5184.62890625 4.9036712646484375 6.0
+550.2806862719299 5179.97802734375 4.903069019317627 6.0
+550.3011202464404 5179.91162109375 4.903613567352295 6.0
+550.3215543207189 5180.73486328125 4.9044389724731445 6.0
+550.3419884945251 5176.3046875 4.902528762817383 6.0
+550.3624224681043 5175.22412109375 4.902331352233887 6.0
+550.382856641445 5174.84912109375 4.903628349304199 6.0
+550.4032907145593 5177.890625 4.903467178344727 6.0
+550.42372468744 5184.92236328125 4.904078960418701 6.0
+550.4441588598493 5174.16357421875 4.902109146118164 6.0
+550.4645929317994 5186.82666015625 4.903519630432129 6.0
+550.4850269037488 5189.22412109375 4.903291702270508 6.0
+550.5054610752268 5183.73388671875 4.902040481567383 6.0
+550.5258951464784 5181.45751953125 4.902620792388916 6.0
+550.5463292174973 5177.94189453125 4.903284072875977 6.0
+550.5667632880431 5190.80126953125 4.903575897216797 6.0
+550.5871973583635 5184.2177734375 4.902982711791992 6.0
+550.607631428451 5174.7158203125 4.901983261108398 6.0
+550.6280654980656 5191.2109375 4.9033203125 6.0
+550.6484995674546 5184.55859375 4.903993606567383 6.0
+550.6689336366107 5180.62939453125 4.902850151062012 6.0
+550.6893677055268 5176.36279296875 4.902839660644531 6.0
+550.7098017739845 5177.33740234375 4.902576923370361 6.0
+550.7302358422094 5186.54296875 4.9017558097839355 6.0
+550.7506699099613 5183.46044921875 4.902914047241211 6.0
+550.7711039777205 5192.74169921875 4.902164936065674 6.0
+550.7915381450148 5180.2685546875 4.90178108215332 6.0
+550.8119721118346 5185.736328125 4.902842998504639 6.0
+550.8324061786625 5189.53271484375 4.902944564819336 6.0
+550.8528403450255 5190.375 4.902941703796387 6.0
+550.8732743111468 5176.88330078125 4.901233196258545 6.0
+550.8937083768105 5185.22998046875 4.901882171630859 6.0
+550.914142542475 5186.83056640625 4.901336193084717 6.0
+550.934576507665 5188.80419921875 4.90359354019165 6.0
+550.9550105723974 5189.1005859375 4.9034881591796875 6.0
+550.9754447371306 5194.97509765625 4.903164386749268 6.0
+550.9958787013893 5189.48583984375 4.902748107910156 6.0
+551.0163128651911 5182.841796875 4.9010467529296875 6.0
+551.0367469289922 5193.3837890625 4.903192043304443 6.0
+551.0571809923204 5196.0751953125 4.901489734649658 6.0
+551.0776150554229 5191.771484375 4.903543949127197 6.0
+551.0980491180599 5193.8115234375 4.9025349617004395 6.0
+551.1184831806895 5189.16455078125 4.903334617614746 6.0
+551.1389172428608 5187.0869140625 4.902698516845703 6.0
+551.1593513045664 5184.48681640625 4.9024505615234375 6.0
+551.1797853662647 5196.5068359375 4.904294013977051 6.0
+551.2002194275046 5182.92333984375 4.902003288269043 6.0
+551.2206534882789 5192.8017578125 4.904125690460205 6.0
+551.2410875490459 5186.4013671875 4.902566909790039 6.0
+551.2615217093553 5194.18115234375 4.903336048126221 6.0
+551.2819556694303 5192.99951171875 4.902245044708252 6.0
+551.3023897290332 5191.43408203125 4.9019012451171875 6.0
+551.3228238884112 5192.2216796875 4.902900218963623 6.0
+551.3432578475549 5185.619140625 4.901957035064697 6.0
+551.36369200646 5179.76708984375 4.901302814483643 6.0
+551.384126064906 5193.80224609375 4.901715278625488 6.0
+551.4045600231184 5193.65087890625 4.9019269943237305 6.0
+551.4249941810922 5193.453125 4.901137351989746 6.0
+551.4454281386061 5188.849609375 4.901024341583252 6.0
+551.4658621958879 5200.3017578125 4.901488780975342 6.0
+551.4862963529304 5201.61474609375 4.901725769042969 6.0
+551.5067303097458 5197.4267578125 4.902045249938965 6.0
+551.5271643660963 5196.6103515625 4.900851249694824 6.0
+551.5475985222074 5191.640625 4.9014811515808105 6.0
+551.5680324778587 5200.1845703125 4.903713226318359 6.0
+551.5884665332778 5198.962890625 4.9041290283203125 6.0
+551.6089006884577 5202.037109375 4.9037604331970215 6.0
+551.6293347434112 5204.05078125 4.904229640960693 6.0
+551.649768797899 5190.2880859375 4.902395725250244 6.0
+551.6702028521468 5196.8447265625 4.9047651290893555 6.0
+551.690636906169 5188.5498046875 4.903400897979736 6.0
+551.7110709597182 5191.27978515625 4.904182434082031 6.0
+551.7315050132747 5202.2763671875 4.9050164222717285 6.0
+551.7519390661328 5182.15087890625 4.9027018547058105 6.0
+551.7723732189843 5189.0927734375 4.902154445648193 6.0
+551.7928071713759 5187.6982421875 4.902289390563965 6.0
+551.8132412235354 5189.296875 4.903049468994141 6.0
+551.8336753752228 5194.3984375 4.9033522605896 6.0
+551.8541093266831 5192.70068359375 4.901606559753418 6.0
+551.8745433779113 5190.87744140625 4.901152610778809 6.0
+551.9154114794292 5193.4619140625 4.90206241607666 6.0
+551.9358455297261 5201.84521484375 4.902177810668945 6.0
+551.9562796797836 5197.82568359375 4.90290641784668 6.0
+551.9767136293813 5198.79931640625 4.902057647705078 6.0
+551.9971477787476 5194.0361328125 4.903058052062988 6.0
+552.0175818278731 5194.99267578125 4.902528285980225 6.0
+552.0380157767722 5200.01220703125 4.903688907623291 6.0
+552.0584499252072 5192.05029296875 4.90331506729126 6.0
+552.0788839734014 5199.03759765625 4.903209209442139 6.0
+552.0993179211364 5204.62353515625 4.90432071685791 6.0
+552.1197520686401 5197.48876953125 4.90221643447876 6.0
+552.1401861159029 5199.58154296875 4.903826713562012 6.0
+552.1606200629394 5197.41259765625 4.903206825256348 6.0
+552.1810542095118 5187.4697265625 4.902384281158447 6.0
+552.2014882558433 5208.73388671875 4.904242992401123 6.0
+552.2219222017156 5197.4365234375 4.903223991394043 6.0
+552.2423563475895 5201.46923828125 4.902087211608887 6.0
+552.2627903929897 5209.2177734375 4.902200698852539 6.0
+552.2832243379307 5194.3583984375 4.9006805419921875 6.0
+552.3036584828733 5198.8349609375 4.901177406311035 6.0
+552.3240925273421 5206.06640625 4.903443813323975 6.0
+552.3445266715862 5197.29541015625 4.902761936187744 6.0
+552.3649606153631 5210.69677734375 4.904138088226318 6.0
+552.3853946589006 5200.5595703125 4.902518272399902 6.0
+552.4058288022134 5200.10498046875 4.903589248657227 6.0
+552.4262627450589 5200.42822265625 4.903239727020264 6.0
+552.446696787898 5201.96435546875 4.904294490814209 6.0
+552.4671309300466 5204.5625 4.903781414031982 6.0
+552.4875648721936 5195.35400390625 4.903746128082275 6.0
+552.5079989138685 5198.30126953125 4.903870105743408 6.0
+552.5284330553186 5212.53857421875 4.904256820678711 6.0
+552.5488669965343 5207.27197265625 4.902642250061035 6.0
+552.5693010372779 5200.5546875 4.903325080871582 6.0
+552.610169217849 5207.19287109375 4.904244899749756 6.0
+552.6306032578941 5194.6767578125 4.901248931884766 6.0
+552.6510372974808 5207.92919921875 4.904157638549805 6.0
+552.6714713365945 5206.05615234375 4.90379524230957 6.0
+552.6919053757156 5211.341796875 4.904819488525391 6.0
+552.712339414371 5201.67041015625 4.905509948730469 6.0
+552.7327734527935 5207.529296875 4.905727863311768 6.0
+552.7532074907431 5206.552734375 4.9044575691223145 6.0
+552.7736415284671 5204.38720703125 4.903552532196045 6.0
+552.7940755659511 5208.91357421875 4.905104637145996 6.0
+552.8145096029766 5203.576171875 4.9048686027526855 6.0
+552.8553775763285 5205.72705078125 4.903783798217773 6.0
+552.875811712649 5211.7763671875 4.904767036437988 6.0
+552.8962457485104 5203.0146484375 4.902278423309326 6.0
+552.9166796841382 5206.455078125 4.9032135009765625 6.0
+552.9371138192946 5211.06103515625 4.903980731964111 6.0
+552.9575478542247 5211.5966796875 4.903810024261475 6.0
+552.9779819889154 5216.7802734375 4.902690410614014 6.0
+553.0188499573778 5210.4072265625 4.903426647186279 6.0
+553.0597180246696 5205.52587890625 4.902421951293945 6.0
+553.080152057737 5212.9658203125 4.903676986694336 6.0
+553.1005861905651 5204.59716796875 4.903134346008301 6.0
+553.121020222934 5204.91943359375 4.9041523933410645 6.0
+553.1414541553022 5217.68798828125 4.904394626617432 6.0
+553.161888287199 5214.89404296875 4.903073787689209 6.0
+553.1823223186366 5209.98779296875 4.903555870056152 6.0
+553.2027562500734 5209.607421875 4.903756141662598 6.0
+553.2231903810389 5221.2197265625 4.906253337860107 6.0
+553.2436244115452 5202.421875 4.903862953186035 6.0
+553.2640583420507 5214.6611328125 4.905050754547119 6.0
+553.2844924720848 5198.85400390625 4.904889106750488 6.0
+553.3049265016598 5202.34521484375 4.903775691986084 6.0
+553.3253606312355 5205.4443359375 4.90529203414917 6.0
+553.3662285892133 5218.27880859375 4.905867576599121 6.0
+553.3866627176249 5214.97119140625 4.9047956466674805 6.0
+553.4070966457948 5210.9638671875 4.904994964599609 6.0
+553.42753067374 5205.22900390625 4.903310775756836 6.0
+553.4479648012202 5212.9306640625 4.9056620597839355 6.0
+553.4683987284589 5205.71240234375 4.902327537536621 6.0
+553.4888327554727 5202.31396484375 4.901663303375244 6.0
+553.5092667822537 5211.0830078125 4.903707504272461 6.0
+553.5297008085618 5207.765625 4.904563903808594 6.0
+553.5501348344114 5202.46337890625 4.90151309967041 6.0
+553.5705688602611 5209.48193359375 4.904296875 6.0
+553.5910028856379 5210.7119140625 4.903675079345703 6.0
+553.611436910789 5205.66650390625 4.9027099609375 6.0
+553.6318710354753 5217.72119140625 4.906167030334473 6.0
+553.6523049601528 5208.45166015625 4.902272701263428 6.0
+553.6727390841406 5217.48828125 4.902499675750732 6.0
+553.6931731081277 5226.30859375 4.903165340423584 6.0
+553.713607031641 5217.80224609375 4.902595043182373 6.0
+553.7340411549303 5206.93505859375 4.900423049926758 6.0
+553.754475177986 5211.94189453125 4.902549743652344 6.0
+553.774909100568 5208.40234375 4.903008460998535 6.0
+553.795343222926 5204.2216796875 4.901657581329346 6.0
+553.8157772448176 5211.1728515625 4.903975486755371 6.0
+553.8362111664683 5202.69775390625 4.903136730194092 6.0
+553.8566452878949 5218.50048828125 4.904001712799072 6.0
+553.877079309088 5217.1474609375 4.904789447784424 6.0
+553.8975132298074 5219.81298828125 4.904437065124512 6.0
+553.9179473503027 5212.1689453125 4.903481960296631 6.0
+553.9383813703316 5217.6650390625 4.903366565704346 6.0
+553.958815490354 5216.52734375 4.90256929397583 6.0
+553.9792494096837 5212.3779296875 4.902825832366943 6.0
+553.9996834290141 5220.8994140625 4.9036641120910645 6.0
+554.0201175478724 5209.03857421875 4.902057647705078 6.0
+554.0405514665035 5212.86181640625 4.901819229125977 6.0
+554.0609854849026 5219.5068359375 4.904201984405518 6.0
+554.0814196028296 5211.8251953125 4.901011943817139 6.0
+554.1018536205302 5216.30712890625 4.903315544128418 6.0
+554.1222875377644 5215.0087890625 4.902584075927734 6.0
+554.1427216549928 5206.87939453125 4.901195049285889 6.0
+554.1631555715285 5221.5244140625 4.903702735900879 6.0
+554.1835895880649 5212.927734375 4.902202129364014 6.0
+554.2040237041292 5212.3798828125 4.903172016143799 6.0
+554.2244576199664 5216.759765625 4.903351306915283 6.0
+554.2448916355715 5207.193359375 4.902975559234619 6.0
+554.2653257507045 5216.04296875 4.903130531311035 6.0
+554.2857596656104 5215.3486328125 4.903630256652832 6.0
+554.3061937800521 5232.8173828125 4.905515193939209 6.0
+554.3266277944858 5216.69482421875 4.903939723968506 6.0
+554.3470617082276 5218.86572265625 4.9041314125061035 6.0
+554.3674958219635 5219.9052734375 4.903952121734619 6.0
+554.3879298352404 5229.07373046875 4.903662204742432 6.0
+554.4083637482836 5217.083984375 4.902876377105713 6.0
+554.4287978610955 5214.04736328125 4.90200662612915 6.0
+554.4492318734337 5215.32958984375 4.902678966522217 6.0
+554.4696658855464 5209.91845703125 4.902890682220459 6.0
+554.4900998971862 5220.61181640625 4.9032182693481445 6.0
+554.5105339088332 5211.25244140625 4.902660846710205 6.0
+554.5309679197817 5211.2958984375 4.902596950531006 6.0
+554.5514019307302 5219.6494140625 4.90357780456543 6.0
+554.5718359412058 5225.08251953125 4.904289245605469 6.0
+554.5922699514558 5213.74462890625 4.903133392333984 6.0
+554.6127040612337 5215.6494140625 4.903566837310791 6.0
+554.6535720803367 5227.96484375 4.903425693511963 6.0
+554.6740060891825 5217.06396484375 4.903843879699707 6.0
+554.694439997802 5226.041015625 4.904048919677734 6.0
+554.7148741061901 5219.85888671875 4.901875972747803 6.0
+554.7353081143374 5216.9267578125 4.903295993804932 6.0
+554.7557420220255 5220.330078125 4.903067111968994 6.0
+554.7966101364655 5220.72509765625 4.9038615226745605 6.0
+554.8170440432223 5221.2666015625 4.902359485626221 6.0
+554.8374781497478 5221.73974609375 4.903615951538086 6.0
+554.8579121557996 5209.97607421875 4.9028639793396 6.0
+554.878346061625 5220.86962890625 4.904223442077637 6.0
+554.8987801672192 5224.82958984375 4.905156135559082 6.0
+554.9192140725718 5214.18310546875 4.904207229614258 6.0
+554.9396480774667 5225.10546875 4.903698921203613 6.0
+554.9600821818967 5214.95166015625 4.904041290283203 6.0
+554.9805161863187 5231.1279296875 4.90552282333374 6.0
+555.0009501902823 5220.533203125 4.904310703277588 6.0
+555.0213841940131 5229.078125 4.904226779937744 6.0
+555.0418181972709 5225.1298828125 4.904224395751953 6.0
+555.0622522003032 5227.8818359375 4.903615951538086 6.0
+555.0826862031026 5225.05419921875 4.905024528503418 6.0
+555.1031202054291 5220.9912109375 4.904094696044922 6.0
+555.1235542075301 5222.34033203125 4.9048285484313965 6.0
+555.1439882093982 5226.35498046875 4.905014991760254 6.0
+555.1644222107934 5221.4267578125 4.90469217300415 6.0
+555.1848563119638 5220.14404296875 4.903461933135986 6.0
+555.2052902128999 5223.34619140625 4.905251979827881 6.0
+555.2461583136028 5243.07421875 4.906740188598633 6.0
+555.2665922136075 5235.28564453125 4.905817031860352 6.0
+555.28702621314 5213.42578125 4.904807090759277 6.0
+555.3074603124478 5221.1123046875 4.905999183654785 6.0
+555.3278942115212 5224.015625 4.906080722808838 6.0
+555.3483283101232 5225.22607421875 4.906448841094971 6.0
+555.3687623084988 5227.92578125 4.906355857849121 6.0
+555.3891962064081 5229.1240234375 4.905660629272461 6.0
+555.4096303040787 5239.8271484375 4.907381057739258 6.0
+555.4300643015231 5226.365234375 4.905379772186279 6.0
+555.4504982987273 5219.38525390625 4.904972553253174 6.0
+555.4709322954732 5215.052734375 4.90454626083374 6.0
+555.4913662919862 5221.1572265625 4.905142784118652 6.0
+555.5118001880328 5215.197265625 4.904935836791992 6.0
+555.5322342838408 5223.8408203125 4.905642509460449 6.0
+555.5526682794225 5233.53076171875 4.906747341156006 6.0
+555.5731021747706 5230.0244140625 4.906108856201172 6.0
+555.5935362696473 5225.07568359375 4.906432628631592 6.0
+555.6139702642977 5218.74853515625 4.904437065124512 6.0
+555.6344041584816 5223.9091796875 4.905368804931641 6.0
+555.654838252427 5227.08447265625 4.9058332443237305 6.0
+555.675272246146 5219.95361328125 4.904709815979004 6.0
+555.6957063393929 5218.0419921875 4.905786514282227 6.0
+555.7161402324127 5217.5537109375 4.904751300811768 6.0
+555.7365742252005 5225.68408203125 4.905160903930664 6.0
+555.757008317516 5223.5107421875 4.905727863311768 6.0
+555.7774422096045 5225.0380859375 4.904804706573486 6.0
+555.7978762014609 5233.16064453125 4.904818534851074 6.0
+555.8183102928451 5222.99169921875 4.905211448669434 6.0
+555.8387441840023 5224.5341796875 4.905235767364502 6.0
+555.8591781746945 5225.81689453125 4.905179023742676 6.0
+555.8796122653803 5220.779296875 4.90527868270874 6.0
+555.9000461553733 5228.92578125 4.905027866363525 6.0
+555.920480145367 5223.333984375 4.90504264831543 6.0
+555.9409142348886 5223.1875 4.906003952026367 6.0
+555.9613481241831 5224.12060546875 4.90531063079834 6.0
+555.9817821130127 5236.201171875 4.907214641571045 6.0
+556.0022162018358 5229.57177734375 4.905386924743652 6.0
+556.1248201268827 5224.052734375 4.906106948852539 6.0
+556.145254113384 5228.181640625 4.906879901885986 6.0
+556.1656880994196 5225.8359375 4.907159328460693 6.0
+556.1861220852152 5220.54052734375 4.905842304229736 6.0
+556.2065560705523 5232.173828125 4.906999588012695 6.0
+556.2474240407537 5226.52783203125 4.905633926391602 6.0
+556.2678580251595 5219.38818359375 4.905826091766357 6.0
+556.2882920093325 5233.92041015625 4.907758712768555 6.0
+556.329159876972 5224.73974609375 4.906384468078613 6.0
+556.3495939602144 5231.1357421875 4.906328201293945 6.0
+556.3700279429831 5232.119140625 4.906583309173584 6.0
+556.3904620257599 5229.56201171875 4.9064106941223145 6.0
+556.4108959080695 5223.11572265625 4.905279636383057 6.0
+556.4313298901398 5235.07861328125 4.9069318771362305 6.0
+556.4517639717524 5226.310546875 4.905517101287842 6.0
+556.4721978531306 5233.70458984375 4.906435966491699 6.0
+556.4926318342696 5228.98583984375 4.904839515686035 6.0
+556.5130659149509 5225.09619140625 4.906156539916992 6.0
+556.5334998953986 5226.6435546875 4.906352996826172 6.0
+556.5539337753726 5227.36767578125 4.905940532684326 6.0
+556.5743678553554 5226.60693359375 4.906849384307861 6.0
+556.5948018348718 5229.01708984375 4.906593322753906 6.0
+556.6152357139144 5229.51904296875 4.906697750091553 6.0
+556.6356697927331 5226.94775390625 4.906418323516846 6.0
+556.6561037713182 5227.9521484375 4.906303405761719 6.0
+556.6765376496624 5238.92822265625 4.908039093017578 6.0
+556.6969717275497 5220.26025390625 4.906578540802002 6.0
+556.7174057049706 5230.91162109375 4.906932353973389 6.0
+556.7582736593395 5217.5419921875 4.906029224395752 6.0
+556.778707635829 5242.345703125 4.907224178314209 6.0
+556.7991417123121 5232.3203125 4.907434463500977 6.0
+556.8400095638935 5233.796875 4.904727458953857 6.0
+556.8604436392125 5230.173828125 4.9055280685424805 6.0
+556.8808775143043 5231.6201171875 4.904938697814941 6.0
+556.9013114891641 5227.65185546875 4.905072212219238 6.0
+556.9217454635509 5229.37451171875 4.9067840576171875 6.0
+556.9421794377122 5225.31298828125 4.906700611114502 6.0
+556.9626134114078 5229.44873046875 4.906264781951904 6.0
+556.9830473848633 5217.55419921875 4.9059977531433105 6.0
+557.0034813580933 5224.5947265625 4.905326843261719 6.0
+557.0239153308503 5224.11279296875 4.906489372253418 6.0
+557.0443494033825 5226.77978515625 4.906214237213135 6.0
+557.0647832756804 5224.42822265625 4.906167030334473 6.0
+557.0852173475068 5220.447265625 4.906260967254639 6.0
+557.105651319107 5222.38623046875 4.906684398651123 6.0
+557.1260851904735 5223.525390625 4.90655517578125 6.0
+557.1465192613687 5233.77490234375 4.907646656036377 6.0
+557.1669532320375 5221.88818359375 4.906190872192383 6.0
+557.1873871022399 5221.11181640625 4.906510829925537 6.0
+557.2078211722037 5223.60693359375 4.905002593994141 6.0
+557.2282551419412 5214.7021484375 4.904918670654297 6.0
+557.2486890112123 5229.61376953125 4.906679630279541 6.0
+557.2691230804776 5228.57763671875 4.906633377075195 6.0
+557.2895570490509 5225.81201171875 4.906952857971191 6.0
+557.3099909173907 5221.79443359375 4.906229496002197 6.0
+557.3304249854918 5221.3251953125 4.906887054443359 6.0
+557.3508589533667 5224.65869140625 4.9070611000061035 6.0
+557.3712929207759 5226.29736328125 4.907075881958008 6.0
+557.391726887945 5232.90869140625 4.908247470855713 6.0
+557.4121608546557 5229.18798828125 4.9066057205200195 6.0
+557.4325949213671 5219.79736328125 4.906064510345459 6.0
+557.4530287873713 5222.8583984375 4.906323432922363 6.0
+557.4734627533835 5216.01171875 4.9053802490234375 6.0
+557.4938968189308 5230.32275390625 4.907451152801514 6.0
+557.5143307840044 5226.80810546875 4.907288551330566 6.0
+557.5347646490845 5217.8583984375 4.9053521156311035 6.0
+557.5551987137005 5223.1875 4.906551837921143 6.0
+557.575632577842 5217.00927734375 4.906495094299316 6.0
+557.5960665417588 5217.61279296875 4.906216144561768 6.0
+557.6165006054434 5229.009765625 4.907074928283691 6.0
+557.6369344688865 5231.95166015625 4.906957149505615 6.0
+557.6573684318719 5226.5947265625 4.906965255737305 6.0
+557.6778024946252 5221.6455078125 4.907338619232178 6.0
+557.6982363569041 5221.4716796875 4.9067912101745605 6.0
+557.7186703189582 5219.60107421875 4.906447410583496 6.0
+557.7391043807802 5222.73828125 4.906912803649902 6.0
+557.7595382421277 5219.73291015625 4.906457424163818 6.0
+557.7799723032513 5225.40185546875 4.9066948890686035 6.0
+557.8004062639084 5236.07763671875 4.9080634117126465 6.0
+557.8208401245574 5230.84619140625 4.9063920974731445 6.0
+557.8412741845168 5227.025390625 4.906584739685059 6.0
+557.8617081444754 5227.1240234375 4.9067511558532715 6.0
+557.8821421039611 5222.10888671875 4.905886173248291 6.0
+557.9025760632212 5231.20751953125 4.906344413757324 6.0
+557.9230100220157 5221.60302734375 4.905421733856201 6.0
+557.94344398057 5231.267578125 4.906208038330078 6.0
+557.9638779388988 5213.40576171875 4.904594421386719 6.0
+557.9843118967619 5210.62646484375 4.903909683227539 6.0
+558.004745854385 5223.123046875 4.9053730964660645 6.0
+558.0251799115504 5226.87060546875 4.905993461608887 6.0
+558.0456137684814 5221.2373046875 4.905592441558838 6.0
+558.0660477251731 5218.84130859375 4.904006481170654 6.0
+558.0864817814072 5220.3583984375 4.90556001663208 6.0
+558.1069156374069 5222.48095703125 4.9072113037109375 6.0
+558.1273496931681 5217.94189453125 4.905043601989746 6.0
+558.1477836484701 5209.2021484375 4.905247211456299 6.0
+558.1682175035385 5221.54541015625 4.905997276306152 6.0
+558.1886515583683 5212.89453125 4.904733657836914 6.0
+558.209085512739 5211.06640625 4.904083728790283 6.0
+558.229519366876 5211.11865234375 4.90367317199707 6.0
+558.2499534205417 5213.099609375 4.904117584228516 6.0
+558.2703873739811 5206.72021484375 4.905185222625732 6.0
+558.2908212271868 5220.7861328125 4.904546737670898 6.0
+558.3112552799212 5215.4814453125 4.905560493469238 6.0
+558.3316891324284 5212.0107421875 4.904435157775879 6.0
+558.3521230847036 5216.81201171875 4.905909061431885 6.0
+558.3929910880834 5214.41650390625 4.905173301696777 6.0
+558.4134249391936 5200.9775390625 4.904923439025879 6.0
+558.4338589900653 5220.3369140625 4.9062066078186035 6.0
+558.474726891116 5215.12841796875 4.905989170074463 6.0
+558.4951608410629 5213.3193359375 4.9056196212768555 6.0
+558.5155947905441 5209.12841796875 4.905492305755615 6.0
+558.536028839786 5224.26953125 4.906306266784668 6.0
+558.5564626888008 5205.62646484375 4.904784679412842 6.0
+558.5768966375836 5211.33203125 4.905934810638428 6.0
+558.5973306858941 5206.81689453125 4.905190944671631 6.0
+558.6177645339776 5210.74560546875 4.905101776123047 6.0
+558.6381984815962 5218.09814453125 4.905980587005615 6.0
+558.6586325289754 5218.9052734375 4.905811309814453 6.0
+558.6790663758948 5210.5908203125 4.906495571136475 6.0
+558.6995003228149 5215.2666015625 4.905290603637695 6.0
+558.7199343692628 5204.53955078125 4.905602931976318 6.0
+558.7403682152508 5222.3515625 4.907783031463623 6.0
+558.7608021610067 5213.2001953125 4.906642913818359 6.0
+558.7812362065233 5218.39599609375 4.906567573547363 6.0
+558.80167005158 5208.9677734375 4.905071258544922 6.0
+558.8221039964046 5202.1435546875 4.9040985107421875 6.0
+558.8425380409899 5205.2607421875 4.903292655944824 6.0
+558.862971985116 5205.1357421875 4.904687881469727 6.0
+558.8834059290093 5203.3125 4.904836654663086 6.0
+558.9038398724297 5199.73291015625 4.903480529785156 6.0
+558.9242738158573 5207.521484375 4.905191898345947 6.0
+558.9447077585864 5203.7509765625 4.904433727264404 6.0
+558.9651417013083 5210.8056640625 4.904503345489502 6.0
+558.985575543571 5205.34765625 4.905003547668457 6.0
+559.0264435269273 5195.07177734375 4.903658866882324 6.0
+559.0468774682595 5214.0625 4.904561996459961 6.0
+559.0673114093588 5201.2236328125 4.90326452255249 6.0
+559.0877453499852 5207.396484375 4.905002593994141 6.0
+559.1081791903853 5206.51708984375 4.903303146362305 6.0
+559.1286132303212 5208.93798828125 4.90465784072876 6.0
+559.1490471700163 5203.40380859375 4.904520034790039 6.0
+559.169481009485 5210.6337890625 4.904895305633545 6.0
+559.1899150484896 5209.27783203125 4.904613494873047 6.0
+559.2103489872534 5205.43701171875 4.904132843017578 6.0
+559.2307830255595 5198.9931640625 4.90233039855957 6.0
+559.2512168636313 5207.376953125 4.902805805206299 6.0
+559.2716508014637 5207.44970703125 4.90292501449585 6.0
+559.2920848388385 5208.94482421875 4.9028544425964355 6.0
+559.3125186759789 5209.857421875 4.903569221496582 6.0
+559.33295261288 5206.82177734375 4.9038310050964355 6.0
+559.3533866493235 5193.00927734375 4.902642250061035 6.0
+559.3738205855334 5222.67236328125 4.904862403869629 6.0
+559.3942544212696 5201.91455078125 4.901460647583008 6.0
+559.4146884567817 5207.14794921875 4.903595447540283 6.0
+559.435122392053 5202.8251953125 4.901681900024414 6.0
+559.4555562268652 5197.74853515625 4.9027934074401855 6.0
+559.475990261446 5200.884765625 4.9033026695251465 6.0
+559.4964241955604 5198.4345703125 4.902637004852295 6.0
+559.5168580294339 5193.75244140625 4.902231693267822 6.0
+559.5372920630834 5200.66552734375 4.90352201461792 6.0
+559.5577259962593 5195.41796875 4.902952194213867 6.0
+559.5781600292103 5185.50341796875 4.9032440185546875 6.0
+559.5985938619269 5192.66064453125 4.902129173278809 6.0
+559.6190277941787 5202.123046875 4.903912544250488 6.0
+559.6394617261903 5197.79296875 4.9042158126831055 6.0
+559.6598956579764 5195.3115234375 4.903852462768555 6.0
+559.6803295892896 5198.7822265625 4.904675483703613 6.0
+559.7007635201444 5206.18994140625 4.905245304107666 6.0
+559.7211974509992 5200.18212890625 4.904652118682861 6.0
+559.7416313813883 5202.67333984375 4.903712272644043 6.0
+559.7620653113045 5197.45703125 4.903725624084473 6.0
+559.7824992409951 5192.34716796875 4.902807235717773 6.0
+559.8029331704456 5199.68115234375 4.904294967651367 6.0
+559.8233670994377 5188.95361328125 4.903225421905518 6.0
+559.843801028197 5198.3603515625 4.9030022621154785 6.0
+559.8642349567235 5200.123046875 4.903810977935791 6.0
+559.884668884777 5193.53271484375 4.9040632247924805 6.0
+559.905102812605 5193.58642578125 4.903669357299805 6.0
+559.9255368401937 5189.51611328125 4.90283727645874 6.0
+559.9459707673232 5190.2685546875 4.902174472808838 6.0
+559.9664045939862 5183.34326171875 4.901752471923828 6.0
+559.9868386206435 5180.30322265625 4.902825832366943 6.0
+560.0072725468417 5185.72412109375 4.902167320251465 6.0
+560.0277063725734 5186.3017578125 4.901806831359863 6.0
+560.0481403980666 5203.72216796875 4.9052839279174805 6.0
+560.0685743233335 5176.04296875 4.900033950805664 6.0
+560.0890081481339 5199.68359375 4.903791427612305 6.0
+560.1094421729285 5189.6513671875 4.902803421020508 6.0
+560.1298760970312 5185.65380859375 4.9027018547058105 6.0
+560.1503099209003 5191.08251953125 4.903019905090332 6.0
+560.1707439445308 5197.89013671875 4.904540061950684 6.0
+560.191177867935 5190.6201171875 4.902614116668701 6.0
+560.2116117908736 5192.36376953125 4.902305603027344 6.0
+560.2320457133392 5189.82861328125 4.902777194976807 6.0
+560.252479635812 5180.73388671875 4.902347087860107 6.0
+560.2729135578193 5190.38818359375 4.902955532073975 6.0
+560.2933474793535 5184.1669921875 4.903226375579834 6.0
+560.3137814006623 5196.8134765625 4.902940273284912 6.0
+560.3342154217389 5193.5029296875 4.90319299697876 6.0
+560.3546492423411 5186.0341796875 4.901738166809082 6.0
+560.3750831627185 5195.515625 4.9034624099731445 6.0
+560.3955170828631 5181.72607421875 4.9033732414245605 6.0
+560.4159510025347 5181.689453125 4.902005672454834 6.0
+560.4363849219808 5184.9189453125 4.9011030197143555 6.0
+560.456818940962 5188.9931640625 4.902087211608887 6.0
+560.4772527597015 5187.8984375 4.901678085327148 6.0
+560.4976866782163 5197.7724609375 4.903090476989746 6.0
+560.5181206962661 5183.486328125 4.9013848304748535 6.0
+560.5385545140743 5183.0771484375 4.900623798370361 6.0
+560.5589884316578 5200.19775390625 4.901552677154541 6.0
+560.5794224487763 5180.83642578125 4.901163101196289 6.0
+560.5998562654204 5186.599609375 4.901430606842041 6.0
+560.6202901820725 5172.578125 4.89968204498291 6.0
+560.6407241982597 5189.97998046875 4.903331279754639 6.0
+560.6611580139725 5189.400390625 4.904280185699463 6.0
+560.6815920294612 5181.78955078125 4.902700901031494 6.0
+560.7020259447163 5189.91650390625 4.903770446777344 6.0
+560.7224597594977 5185.416015625 4.904088497161865 6.0
+560.7428937740551 5180.77294921875 4.9032487869262695 6.0
+560.7633276883789 5182.18994140625 4.903920650482178 6.0
+560.7837616022298 5183.8935546875 4.903098106384277 6.0
+560.8041955158551 5186.44287109375 4.903336524963379 6.0
+560.8246294290147 5184.68017578125 4.902383327484131 6.0
+560.8450633419343 5180.26171875 4.902852535247803 6.0
+560.8654972546283 5191.75 4.902242660522461 6.0
+560.8859311668566 5187.78173828125 4.902012348175049 6.0
+560.9063650788448 5177.6484375 4.8990159034729 6.0
+560.9267990903754 5173.9833984375 4.897565841674805 6.0
+560.9472329016717 5178.7919921875 4.8991241455078125 6.0
+560.9881008233278 5171.7900390625 4.900492191314697 6.0
+561.0085346336928 5171.16162109375 4.901707172393799 6.0
+561.0494024534855 5185.52783203125 4.901901721954346 6.0
+561.069836362687 5177.32958984375 4.901432514190674 6.0
+561.0902703718821 5182.607421875 4.902026653289795 6.0
+561.1107041803843 5180.0361328125 4.901209354400635 6.0
+561.1311380888874 5179.78515625 4.9017133712768555 6.0
+561.1515720969182 5174.36328125 4.900705337524414 6.0
+561.172005904722 5180.31494140625 4.901729583740234 6.0
+561.1924398120609 5173.29736328125 4.8994035720825195 6.0
+561.2128738191604 5174.9111328125 4.90040922164917 6.0
+561.2333076260329 5183.04296875 4.900125980377197 6.0
+561.2537415324405 5173.53173828125 4.9007954597473145 6.0
+561.2741755383759 5167.0517578125 4.900643348693848 6.0
+561.2946094443178 5177.302734375 4.902719497680664 6.0
+561.3150432497932 5186.0927734375 4.903322219848633 6.0
+561.3354772547973 5173.24560546875 4.902412414550781 6.0
+561.355911159575 5180.41064453125 4.902973651885986 6.0
+561.3763449641192 5188.2314453125 4.903891563415527 6.0
+561.3967789684248 5175.607421875 4.902313232421875 6.0
+561.4172128720384 5174.87548828125 4.901272773742676 6.0
+561.4376468756454 5180.2509765625 4.901513576507568 6.0
+561.4580806787926 5194.08544921875 4.9023590087890625 6.0
+561.4785145817077 5187.06494140625 4.902712345123291 6.0
+561.5193823863665 5174.6337890625 4.899496555328369 6.0
+561.5398162883503 5173.65966796875 4.901081085205078 6.0
+561.5602502898619 5169.75146484375 4.899691581726074 6.0
+561.5806840911464 5167.3798828125 4.899298667907715 6.0
+561.601117991966 5169.33642578125 4.90000581741333 6.0
+561.6215519925463 5165.09765625 4.898938179016113 6.0
+561.6419857928995 5172.337890625 4.89915657043457 6.0
+561.6624196927878 5170.216796875 4.899163722991943 6.0
+561.6828536924368 5171.29833984375 4.899812698364258 6.0
+561.7032874916258 5168.58935546875 4.899892330169678 6.0
+561.7237213905828 5164.26416015625 4.899807929992676 6.0
+561.7441553893004 5169.158203125 4.898060321807861 6.0
+561.7645891875582 5169.953125 4.899155139923096 6.0
+561.7850231855846 5181.86328125 4.900641918182373 6.0
+561.8054570831373 5181.236328125 4.902373790740967 6.0
+561.8258908804637 5169.2998046875 4.901259422302246 6.0
+561.8463248775588 5169.251953125 4.900895118713379 6.0
+561.8667587741802 5166.41748046875 4.900018215179443 6.0
+561.8871925705753 5170.46630859375 4.900730133056641 6.0
+561.907626566739 5167.7783203125 4.899852275848389 6.0
+561.9280604624291 5169.23583984375 4.898725986480713 6.0
+561.9484942576601 5170.95361328125 4.896443843841553 6.0
+561.9689282526597 5171.244140625 4.897134780883789 6.0
+562.0097959419509 5176.66162109375 4.899347305297852 6.0
+562.0302299360192 5166.01611328125 4.900845050811768 6.0
+562.0506638296138 5167.52001953125 4.901303768157959 6.0
+562.091531616119 5168.3935546875 4.900945663452148 6.0
+562.1119655090151 5171.3974609375 4.901679515838623 6.0
+562.1323995014536 5164.3583984375 4.898868560791016 6.0
+562.1528332934249 5168.57568359375 4.899476528167725 6.0
+562.1732671853897 5182.24658203125 4.90135383605957 6.0
+562.193701176664 5171.77490234375 4.898712635040283 6.0
+562.2141349679368 5165.64404296875 4.900398254394531 6.0
+562.2345688587375 5185.33544921875 4.902758598327637 6.0
+562.2550028490805 5171.30029296875 4.901611328125 6.0
+562.2958705290584 5168.11669921875 4.901422023773193 6.0
+562.316304518703 5175.01025390625 4.902133941650391 6.0
+562.3367384078738 5167.65185546875 4.901959419250488 6.0
+562.3571721965855 5180.400390625 4.902009963989258 6.0
+562.3776061850658 5169.544921875 4.90122652053833 6.0
+562.3980400733126 5172.41064453125 4.90226411819458 6.0
+562.4389078488675 5167.78466796875 4.900528907775879 6.0
+562.4797755227919 5166.7421875 4.901329040527344 6.0
+562.5002095094096 5177.96923828125 4.902348041534424 6.0
+562.5206432955601 5162.0087890625 4.898740768432617 6.0
+562.5410772814721 5161.9013671875 4.899742126464844 6.0
+562.5615111671577 5164.1005859375 4.899806499481201 6.0
+562.581944952377 5167.14111328125 4.901134490966797 6.0
+562.6023789373576 5163.68310546875 4.900186538696289 6.0
+562.6432467061677 5159.92529296875 4.899917125701904 6.0
+562.6636805902162 5171.9609375 4.900017261505127 6.0
+562.6841144738064 5163.41796875 4.900644302368164 6.0
+562.7045483569236 5164.169921875 4.899840354919434 6.0
+562.7249822400481 5172.130859375 4.901309490203857 6.0
+562.745416122707 5170.01171875 4.901136875152588 6.0
+562.7658500049001 5168.611328125 4.901379108428955 6.0
+562.786283986854 5156.3623046875 4.90109920501709 6.0
+562.8067177685807 5162.90087890625 4.901443004608154 6.0
+562.8271516498353 5164.16552734375 4.901180744171143 6.0
+562.8475856308651 5171.8525390625 4.9018235206604 6.0
+562.8680194116605 5167.1201171875 4.901011943817139 6.0
+562.8884533919845 5168.984375 4.901365756988525 6.0
+562.9088872718494 5171.7548828125 4.902502059936523 6.0
+562.9293210514807 5167.2880859375 4.90164041519165 6.0
+562.9497550308733 5162.03759765625 4.900827407836914 6.0
+562.9701889100397 5167.10205078125 4.902187824249268 6.0
+562.9906226887397 5171.92041015625 4.901209831237793 6.0
+563.0110566669682 5162.3095703125 4.90061092376709 6.0
+563.0314905452033 5174.63916015625 4.900845527648926 6.0
+563.0519243227391 5168.419921875 4.900864124298096 6.0
+563.0723583002691 5170.9228515625 4.901134014129639 6.0
+563.09279217734 5165.30859375 4.899870872497559 6.0
+563.1132260539453 5168.23388671875 4.900668621063232 6.0
+563.1336599303104 5165.7216796875 4.900783061981201 6.0
+563.15409380645 5166.2724609375 4.902054309844971 6.0
+563.174527582356 5161.8388671875 4.901459217071533 6.0
+563.1949615577905 5165.83349609375 4.901885509490967 6.0
+563.215395432766 5163.8046875 4.900935173034668 6.0
+563.2358293075085 5170.65478515625 4.901439666748047 6.0
+563.256263182011 5168.7763671875 4.90034294128418 6.0
+563.2766970560551 5170.93701171875 4.900996208190918 6.0
+563.2971310298672 5169.486328125 4.900169849395752 6.0
+563.3175648032047 5170.93359375 4.899319648742676 6.0
+563.3379986765503 5170.181640625 4.899848461151123 6.0
+563.3584326491982 5171.85302734375 4.900590419769287 6.0
+563.3788664216045 5169.3759765625 4.8990373611450195 6.0
+563.3993002937859 5166.0810546875 4.900339603424072 6.0
+563.4197342657353 5171.296875 4.899291038513184 6.0
+563.4401680372102 5161.228515625 4.899267196655273 6.0
+563.4606019082275 5169.47509765625 4.898740291595459 6.0
+563.4810358792456 5164.96630859375 4.900264739990234 6.0
+563.5014696495564 5156.55908203125 4.899315357208252 6.0
+563.5219035198752 5167.51513671875 4.901187419891357 6.0
+563.5423374897291 5162.62646484375 4.901520252227783 6.0
+563.5627712591086 5168.16064453125 4.900927543640137 6.0
+563.5832051282632 5160.51171875 4.900851726531982 6.0
+563.6036390971858 5164.537109375 4.90131139755249 6.0
+563.644506833858 5166.322265625 4.902286529541016 6.0
+563.6649407018485 5164.50341796875 4.9006757736206055 6.0
+563.6853745693661 5168.3310546875 4.901219844818115 6.0
+563.7058084364253 5168.14697265625 4.901644229888916 6.0
+563.7262423034845 5175.068359375 4.901969909667969 6.0
+563.7466761700707 5170.27685546875 4.902687072753906 6.0
+563.7671101361993 5167.10791015625 4.902032852172852 6.0
+563.7875439020936 5165.1923828125 4.902593612670898 6.0
+563.8079777677485 5171.69140625 4.9013895988464355 6.0
+563.8284116329451 5170.40185546875 4.901447772979736 6.0
+563.8488454979088 5175.146484375 4.90235710144043 6.0
+563.8692793623995 5158.14453125 4.901193618774414 6.0
+563.8897132266648 5171.32958984375 4.901935577392578 6.0
+563.9101470904643 5163.7958984375 4.9010910987854 6.0
+563.9305808542558 5167.63671875 4.901861190795898 6.0
+563.9510148173576 5166.80810546875 4.902572154998779 6.0
+563.9714486804587 5171.9609375 4.9039106369018555 6.0
+563.9918826428548 5165.85009765625 4.902802467346191 6.0
+564.0123164052566 5173.765625 4.903479099273682 6.0
+564.0327502671862 5170.89453125 4.903586387634277 6.0
+564.0531842286582 5162.841796875 4.902446269989014 6.0
+564.0736179901287 5169.1328125 4.903133869171143 6.0
+564.0940518511343 5175.498046875 4.903417110443115 6.0
+564.1144858116677 5161.57958984375 4.901986598968506 6.0
+564.1349196719748 5172.06689453125 4.902932167053223 6.0
+564.1553534318082 5171.287109375 4.9025678634643555 6.0
+564.1757873916504 5175.291015625 4.903082847595215 6.0
+564.1962212507933 5164.6025390625 4.901019096374512 6.0
+564.2166550099355 5168.74365234375 4.901947021484375 6.0
+564.2370889683734 5171.9892578125 4.902978897094727 6.0
+564.2575228268179 5168.580078125 4.901854991912842 6.0
+564.2983905425353 5174.61328125 4.90302038192749 6.0
+564.3188243998156 5170.48974609375 4.901198387145996 6.0
+564.3392583568566 5170.5595703125 4.902163505554199 6.0
+564.4005599258962 5168.333984375 4.9030327796936035 6.0
+564.420993681546 5174.80078125 4.902747631072998 6.0
+564.4414275367308 5181.09814453125 4.902909755706787 6.0
+564.4618614919091 5172.2978515625 4.902799606323242 6.0
+564.4822952466275 5182.361328125 4.90352201461792 6.0
+564.502729100881 5174.7880859375 4.902034282684326 6.0
+564.5231630548951 5175.21923828125 4.9031805992126465 6.0
+564.5435968086822 5172.68798828125 4.902007579803467 6.0
+564.5640306620044 5174.5654296875 4.902525901794434 6.0
+564.5844645150864 5195.8515625 4.9041314125061035 6.0
+564.6048983677101 5180.34130859375 4.903708457946777 6.0
+564.625332220101 5184.1982421875 4.9030537605285645 6.0
+564.6457660722517 5176.8681640625 4.903054714202881 6.0
+564.6661999239441 5182.71142578125 4.903343677520752 6.0
+564.6866337751708 5181.29736328125 4.903524875640869 6.0
+564.707067726391 5180.22705078125 4.903992176055908 6.0
+564.7275014771512 5182.85009765625 4.903909683227539 6.0
+564.7479354274474 5189.7822265625 4.9042205810546875 6.0
+564.7683692775026 5183.197265625 4.902657985687256 6.0
+564.7888030273316 5175.80029296875 4.902684688568115 6.0
+564.8092369766964 5184.341796875 4.90169620513916 6.0
+564.8296708258204 5183.19580078125 4.903210163116455 6.0
+564.8501045744852 5179.470703125 4.901798725128174 6.0
+564.8705385229187 5180.21435546875 4.904001712799072 6.0
+564.9114061186119 5173.19775390625 4.902643203735352 6.0
+564.9318400661141 5178.99853515625 4.902730941772461 6.0
+564.9522739131426 5186.40234375 4.903707027435303 6.0
+565.0340092982515 5179.052734375 4.9024786949157715 6.0
+565.0544431436574 5192.96435546875 4.904368877410889 6.0
+565.0748769888232 5181.18603515625 4.90339994430542 6.0
+565.0953109335314 5188.89892578125 4.904965877532959 6.0
+565.1157447779988 5184.1083984375 4.90470552444458 6.0
+565.136178522007 5180.76708984375 4.904608726501465 6.0
+565.1566124660167 5186.7978515625 4.904204845428467 6.0
+565.1770463093271 5188.36767578125 4.905112266540527 6.0
+565.1974800523967 5189.2216796875 4.9054436683654785 6.0
+565.2179139952423 5188.61083984375 4.905827045440674 6.0
+565.2383477376206 5188.623046875 4.905409812927246 6.0
+565.2587815797597 5184.0126953125 4.9045820236206055 6.0
+565.2792155216739 5190.37353515625 4.905564308166504 6.0
+565.299649263121 5183.77783203125 4.9051923751831055 6.0
+565.3200831040958 5186.69482421875 4.9056620597839355 6.0
+565.3405170450787 5178.89892578125 4.904319763183594 6.0
+565.3609507853616 5183.154296875 4.903947353363037 6.0
+565.381384625638 5208.1181640625 4.909242630004883 6.0
+565.4018185654568 5185.7578125 4.905409812927246 6.0
+565.4222523048084 5192.1591796875 4.905486106872559 6.0
+565.4426862439213 5188.751953125 4.905388355255127 6.0
+565.463120082808 5185.35595703125 4.905092716217041 6.0
+565.4835538212283 5198.71630859375 4.906412601470947 6.0
+565.5039877594099 5183.43115234375 4.904971122741699 6.0
+565.5244215971325 5184.9853515625 4.905134201049805 6.0
+565.5448554346221 5185.36669921875 4.904996871948242 6.0
+565.5652892718717 5185.8974609375 4.905529975891113 6.0
+565.5857231086629 5186.841796875 4.904750823974609 6.0
+565.606156945214 5191.42138671875 4.905605316162109 6.0
+565.6265907813067 5188.6396484375 4.905508041381836 6.0
+565.6470246171666 5188.7294921875 4.905791759490967 6.0
+565.6674584525608 5196.07763671875 4.905407905578613 6.0
+565.6878923877157 5182.0625 4.903578281402588 6.0
+565.7083261226435 5186.03173828125 4.90436315536499 6.0
+565.7287599570991 5186.9931640625 4.904852390289307 6.0
+565.7491938913299 5191.2021484375 4.904943466186523 6.0
+565.7696276250936 5189.32568359375 4.906930446624756 6.0
+565.7900614586251 5191.15380859375 4.907045364379883 6.0
+565.8104953916845 5193.6220703125 4.9051899909973145 6.0
+565.8309291245168 5185.39306640625 4.904374599456787 6.0
+565.8717968892452 5192.89990234375 4.904240608215332 6.0
+565.8922306211462 5190.26904296875 4.906890869140625 6.0
+565.9126645525757 5192.91455078125 4.904520511627197 6.0
+565.933098383779 5196.033203125 4.907492160797119 6.0
+565.9535321147487 5193.453125 4.905149936676025 6.0
+565.9739660452469 5195.06787109375 4.907255172729492 6.0
+565.9943997752853 5193.50537109375 4.907224178314209 6.0
+566.0148336050916 5187.81396484375 4.9071245193481445 6.0
+566.0352675346585 5191.1298828125 4.90573263168335 6.0
+566.0557013637663 5194.31298828125 4.908388137817383 6.0
+566.0761350926405 5197.13232421875 4.90818977355957 6.0
+566.0965690212761 5202.78466796875 4.909510135650635 6.0
+566.1170028494525 5200.42138671875 4.908594131469727 6.0
+566.1374365773954 5192.765625 4.906955718994141 6.0
+566.1578705048669 5193.9326171875 4.907871723175049 6.0
+566.1783043318792 5197.4384765625 4.90764856338501 6.0
+566.1987382588923 5197.162109375 4.908173561096191 6.0
+566.2191719854309 5184.296875 4.906615257263184 6.0
+566.2396058115119 5200.07470703125 4.907949447631836 6.0
+566.2600397373608 5193.2529296875 4.906630039215088 6.0
+566.2804734629681 5195.9755859375 4.9077324867248535 6.0
+566.3009072881177 5197.78173828125 4.908402442932129 6.0
+566.3213412130353 5187.72509765625 4.907519817352295 6.0
+566.3417749374785 5197.40576171875 4.908186912536621 6.0
+566.3622087616968 5202.68115234375 4.908708572387695 6.0
+566.3826426854503 5203.00634765625 4.909046649932861 6.0
+566.4030764089621 5196.10107421875 4.908380508422852 6.0
+566.4235102322491 5191.8583984375 4.9083638191223145 6.0
+566.443944155064 5188.78173828125 4.907679080963135 6.0
+566.4643778776517 5194.91064453125 4.907256126403809 6.0
+566.4848116997746 5193.98193359375 4.908592700958252 6.0
+566.5256794430825 5202.560546875 4.907630443572998 6.0
+567.4043335534006 5195.10546875 4.864036560058594 6.0
+567.4247673601494 5188.34326171875 4.875109672546387 6.0
+567.4452011666726 5190.205078125 4.876034736633301 6.0
+567.4656349727302 5193.14013671875 4.874155521392822 6.0
+567.4860687787805 5204.53662109375 4.879777431488037 6.0
+567.5065025841395 5196.5078125 4.880926132202148 6.0
+567.5269363892658 5196.212890625 4.884276866912842 6.0
+567.5473702941526 5199.2177734375 4.884400844573975 6.0
+567.5678039985796 5194.70166015625 4.885932445526123 6.0
+567.5882378027745 5204.1103515625 4.888615608215332 6.0
+567.6086717067301 5210.201171875 4.894319534301758 6.0
+567.6495393132573 5216.59130859375 4.896079063415527 6.0
+567.6699731162807 5219.35302734375 4.893873691558838 6.0
+567.7108407209453 5202.4228515625 4.895776271820068 6.0
+567.7312745225718 5205.68701171875 4.89632511138916 6.0
+567.7517082242048 5214.62646484375 4.897943496704102 6.0
+567.7721421253736 5213.85400390625 4.896981239318848 6.0
+567.7925759260688 5201.9462890625 4.898848056793213 6.0
+567.8130096265377 5209.6318359375 4.900515079498291 6.0
+567.8334435267752 5212.22119140625 4.900852203369141 6.0
+567.8538773265391 5206.4599609375 4.90084171295166 6.0
+567.8743111260774 5209.2353515625 4.901296138763428 6.0
+567.89474492515 5208.1943359375 4.902531623840332 6.0
+567.9151787239825 5219.1728515625 4.903863430023193 6.0
+567.9356125225895 5216.25927734375 4.9047722816467285 6.0
+567.9560463207308 5208.53466796875 4.904112815856934 6.0
+567.9764801183992 5221.35302734375 4.906002998352051 6.0
+567.9969140158428 5207.8154296875 4.906014442443848 6.0
+568.017347713052 5212.99951171875 4.907649040222168 6.0
+568.037781509789 5211.671875 4.906284809112549 6.0
+568.0582154063013 5208.009765625 4.906200408935547 6.0
+568.119516793733 5218.4619140625 4.905941963195801 6.0
+568.1399504888468 5208.92578125 4.906336784362793 6.0
+568.1603842837212 5221.96923828125 4.908931255340576 6.0
+568.180818178138 5214.19482421875 4.906851291656494 6.0
+568.2012518723204 5216.89599609375 4.908290386199951 6.0
+568.2216856660307 5217.3603515625 4.909578323364258 6.0
+568.2421195595161 5217.96484375 4.9093170166015625 6.0
+568.2829870453133 5215.64990234375 4.90883207321167 6.0
+568.3034209378675 5224.37744140625 4.909956455230713 6.0
+568.3238546299544 5223.064453125 4.91089391708374 6.0
+568.34428852157 5220.96630859375 4.91131591796875 6.0
+568.364722313192 5221.41259765625 4.911580562591553 6.0
+568.3851561041083 5222.54345703125 4.9113264083862305 6.0
+568.4055898950319 5215.1767578125 4.910981178283691 6.0
+568.4260236854898 5221.0478515625 4.90987491607666 6.0
+568.446457475482 5231.6640625 4.911398410797119 6.0
+568.4668912652342 5220.4921875 4.910398483276367 6.0
+568.4873250547607 5227.802734375 4.911074161529541 6.0
+568.5077588438144 5225.6552734375 4.909928798675537 6.0
+568.5281927324104 5232.16357421875 4.909497261047363 6.0
+568.5486264210049 5229.1376953125 4.909599304199219 6.0
+568.5690602091272 5219.158203125 4.9104132652282715 6.0
+568.5894940967919 5231.07275390625 4.91197395324707 6.0
+568.6099277842222 5229.42431640625 4.913169860839844 6.0
+568.6303615711804 5223.3017578125 4.911633014678955 6.0
+568.6507954579138 5222.7197265625 4.912968158721924 6.0
+568.6712291444128 5235.38232421875 4.91347599029541 6.0
+568.6916630304404 5223.44775390625 4.9126482009887695 6.0
+568.7120967162409 5230.22216796875 4.913369655609131 6.0
+568.7325305015765 5224.55322265625 4.912686347961426 6.0
+568.7529643866728 5239.15869140625 4.912464141845703 6.0
+568.7733980713092 5233.16943359375 4.9121880531311035 6.0
+568.7938318557135 5228.16796875 4.911376953125 6.0
+568.8142657398785 5227.6953125 4.911156177520752 6.0
+568.8346994235835 5225.94921875 4.911624908447266 6.0
+568.8551332068237 5235.42626953125 4.912637710571289 6.0
+568.896000872599 5227.1875 4.911345481872559 6.0
+568.916434554907 5233.53466796875 4.913834095001221 6.0
+568.9368684369765 5229.77197265625 4.914414882659912 6.0
+568.9573022188197 5240.17626953125 4.914316177368164 6.0
+568.9777359001964 5230.93701171875 4.914661407470703 6.0
+568.9981697811018 5234.66943359375 4.914109230041504 6.0
+569.0186035617808 5241.02294921875 4.914732456207275 6.0
+569.0390374422277 5236.30712890625 4.913756847381592 6.0
+569.0594711222002 5237.1591796875 4.9128217697143555 6.0
+569.0799049019479 5228.65625 4.913951873779297 6.0
+569.1003387812234 5231.36279296875 4.912686347961426 6.0
+569.1207724602718 5243.8857421875 4.914050579071045 6.0
+569.1412062388554 5232.205078125 4.913278579711914 6.0
+569.1616401172068 5236.69482421875 4.914351463317871 6.0
+569.1820737953167 5240.615234375 4.913792610168457 6.0
+569.2025075729689 5243.822265625 4.913850784301758 6.0
+569.2229414501489 5234.42138671875 4.913107395172119 6.0
+569.2433751271019 5231.57275390625 4.913782596588135 6.0
+569.2638089038228 5237.6318359375 4.914065361022949 6.0
+569.2842427800788 5235.85205078125 4.914118766784668 6.0
+569.3046764560931 5230.193359375 4.913924694061279 6.0
+569.3251102318827 5245.18115234375 4.916021347045898 6.0
+569.3455441069673 5237.68798828125 4.914793968200684 6.0
+569.3659778820584 5239.54150390625 4.915806293487549 6.0
+569.3864116566838 5236.8447265625 4.9152069091796875 6.0
+569.4068454310764 5246.70263671875 4.915487766265869 6.0
+569.4272791049953 5233.3896484375 4.914555549621582 6.0
+569.4477129784573 5243.97119140625 4.91364049911499 6.0
+569.4885804246733 5237.52880859375 4.913315296173096 6.0
+569.5090142974368 5250.38330078125 4.914609432220459 6.0
+569.5294480697339 5235.00537109375 4.910900115966797 6.0
+569.5498817415573 5237.818359375 4.913192272186279 6.0
+569.5703156131567 5243.02490234375 4.913346290588379 6.0
+569.5907493845152 5244.236328125 4.913552284240723 6.0
+569.6111830554146 5247.515625 4.914222717285156 6.0
+569.6316169260826 5231.333984375 4.913102149963379 6.0
+569.672484366245 5247.6162109375 4.915572166442871 6.0
+569.692918235749 5242.60009765625 4.915256500244141 6.0
+569.713352005012 5243.505859375 4.915241718292236 6.0
+569.7337858738174 5242.345703125 4.915214538574219 6.0
+569.7542195423885 5238.84716796875 4.9153313636779785 6.0
+569.7746533107274 5239.580078125 4.912415504455566 6.0
+569.7950871785943 5244.3330078125 4.91096830368042 6.0
+569.8155208460012 5236.6044921875 4.911778926849365 6.0
+569.8359546134016 5240.12841796875 4.911622047424316 6.0
+569.8768222468207 5245.546875 4.913776397705078 6.0
+569.8972559130634 5250.42236328125 4.915082931518555 6.0
+569.9176897788348 5245.57421875 4.914948463439941 6.0
+569.9381235443798 5243.75732421875 4.91568660736084 6.0
+569.9585572094511 5244.64501953125 4.915132999420166 6.0
+569.9789910742984 5232.5908203125 4.913794040679932 6.0
+569.9994248389121 5248.13623046875 4.91514778137207 6.0
+570.0198585030594 5247.3828125 4.914987564086914 6.0
+570.0402923669681 5249.146484375 4.913859844207764 6.0
+570.0607261304176 5240.1171875 4.913901329040527 6.0
+570.081159893627 5242.6005859375 4.914194583892822 6.0
+570.1220273188956 5237.43994140625 4.9145612716674805 6.0
+570.1424611811744 5248.40869140625 4.914936542510986 6.0
+570.1628949429942 5253.86962890625 4.915013313293457 6.0
+570.1833286043475 5250.2138671875 4.91303825378418 6.0
+570.2037624654622 5249.9169921875 4.9153666496276855 6.0
+570.2241962263506 5247.9072265625 4.914163589477539 6.0
+570.2446298867726 5250.306640625 4.91547966003418 6.0
+570.265063746956 5243.28759765625 4.915149211883545 6.0
+570.2854975066803 5246.828125 4.914900302886963 6.0
+570.3059312661717 5249.93505859375 4.915421962738037 6.0
+570.326365025423 5236.771484375 4.914146423339844 6.0
+570.3467987842159 5243.26513671875 4.914778232574463 6.0
+570.3672325425432 5237.173828125 4.914569854736328 6.0
+570.3876663006304 5244.43115234375 4.914270877838135 6.0
+570.4285339158887 5250.29443359375 4.91530704498291 6.0
+570.4489676730445 5240.68603515625 4.915065288543701 6.0
+570.4694013297412 5247.82666015625 4.915991306304932 6.0
+570.4898351862066 5240.916015625 4.914759635925293 6.0
+570.5102689421983 5247.90771484375 4.914546966552734 6.0
+570.5307025979637 5244.0400390625 4.914834022521973 6.0
+570.5511364532649 5238.01708984375 4.914853096008301 6.0
+570.5715702083253 5238.4228515625 4.915387153625488 6.0
+570.5920038631593 5252.71484375 4.915927410125732 6.0
+570.6124377175292 5244.595703125 4.915591239929199 6.0
+570.6328714716583 5241.52685546875 4.914645195007324 6.0
+570.673738978534 5239.4326171875 4.914278984069824 6.0
+570.6941727317317 5236.16259765625 4.915248870849609 6.0
+570.7350402367447 5238.71240234375 4.914811611175537 6.0
+570.7554739887782 5242.05908203125 4.915887832641602 6.0
+570.7759077403534 5229.18798828125 4.91407585144043 6.0
+570.7963414916958 5236.28955078125 4.915148735046387 6.0
+570.816775242798 5241.23583984375 4.915957927703857 6.0
+570.8372089934419 5239.79248046875 4.915942192077637 6.0
+570.8576427438529 5242.240234375 4.915799140930176 6.0
+570.878076493791 5230.767578125 4.9144158363342285 6.0
+570.8985102435036 5247.35888671875 4.916306972503662 6.0
+570.9189439927432 5243.1455078125 4.914587497711182 6.0
+570.9393777417572 5247.51171875 4.916309833526611 6.0
+570.9598115903063 5239.34912109375 4.915152549743652 6.0
+570.9802452386211 5243.36669921875 4.915299415588379 6.0
+571.0211128343144 5239.43994140625 4.914857864379883 6.0
+571.0415464814578 5236.56884765625 4.914119243621826 6.0
+571.0619802283763 5241.85791015625 4.914872646331787 6.0
+571.0824140750628 5248.63623046875 4.91422700881958 6.0
+571.1028477212822 5236.82958984375 4.912753582000732 6.0
+571.1232815672629 5241.35888671875 4.914761066436768 6.0
+571.1437153127845 5240.13720703125 4.915038585662842 6.0
+571.1641489580652 5240.5263671875 4.915113925933838 6.0
+571.184582802889 5234.94921875 4.914775848388672 6.0
+571.2050165474793 5242.18505859375 4.9139180183410645 6.0
+571.225450191836 5234.36376953125 4.91318416595459 6.0
+571.2458840357212 5234.728515625 4.912382125854492 6.0
+571.2663177791474 5235.63232421875 4.913367748260498 6.0
+571.2867515225662 5237.71875 4.912871360778809 6.0
+571.3071852652938 5242.94873046875 4.914515495300293 6.0
+571.3276190077886 5240.83642578125 4.9148149490356445 6.0
+571.3480527500433 5223.0048828125 4.913510799407959 6.0
+571.3684865918403 5241.1201171875 4.915246963500977 6.0
+571.388920233403 5227.30859375 4.913694381713867 6.0
+571.4093539747264 5238.7646484375 4.914920806884766 6.0
+571.4297878155921 5233.18896484375 4.915121555328369 6.0
+571.4502214559907 5239.2958984375 4.915009498596191 6.0
+571.4706552961507 5234.677734375 4.915308952331543 6.0
+571.4910889360835 5235.60986328125 4.914648056030273 6.0
+571.5115226755515 5223.435546875 4.913660049438477 6.0
+571.5319565145473 5244.1455078125 4.915205478668213 6.0
+571.5523901535489 5237.1474609375 4.914622783660889 6.0
+571.5728238918527 5242.7705078125 4.914875030517578 6.0
+571.5932577301501 5232.05615234375 4.913689136505127 6.0
+571.6136913677547 5243.38427734375 4.914507865905762 6.0
+571.63412510536 5235.1904296875 4.914139747619629 6.0
+571.6545589424932 5232.32568359375 4.914806842803955 6.0
+571.6749925791664 5230.951171875 4.913539409637451 6.0
+571.6954263156076 5235.69921875 4.915229320526123 6.0
+571.7158601518095 5231.6025390625 4.914361476898193 6.0
+571.7362937875514 5236.17626953125 4.915227890014648 6.0
+571.7567275228284 5228.775390625 4.914784908294678 6.0
+571.777161358099 5234.7197265625 4.914656639099121 6.0
+571.7975950926775 5236.30615234375 4.915009021759033 6.0
+571.8180287272553 5232.271484375 4.91477632522583 6.0
+571.8384625611288 5224.6630859375 4.914308071136475 6.0
+571.8588962950089 5227.3486328125 4.914603233337402 6.0
+571.8793300284233 5230.2734375 4.913954257965088 6.0
+571.8997637613647 5233.37353515625 4.914434432983398 6.0
+571.9201974940806 5230.86962890625 4.914200305938721 6.0
+571.9406313265645 5221.67578125 4.913726329803467 6.0
+571.9610649585738 5227.3544921875 4.914851188659668 6.0
+571.9814986901256 5225.71044921875 4.914095878601074 6.0
+572.001932521438 5226.54248046875 4.913725852966309 6.0
+572.0223661525233 5228.38818359375 4.913887977600098 6.0
+572.0427998831437 5215.9208984375 4.9133758544921875 6.0
+572.0632337135321 5224.01611328125 4.913645267486572 6.0
+572.1041010731351 5226.87890625 4.914827346801758 6.0
+572.1245348025914 5232.10302734375 4.914839744567871 6.0
+572.1449685313419 5238.09765625 4.915654182434082 6.0
+572.1654022600997 5225.10205078125 4.914280414581299 6.0
+572.1858359883918 5222.32958984375 4.913912773132324 6.0
+572.2062697164438 5223.58203125 4.914229869842529 6.0
+572.2471371711654 5220.494140625 4.91434907913208 6.0
+572.2675708980532 5222.39990234375 4.914508819580078 6.0
+572.2880047247163 5219.572265625 4.91437292098999 6.0
+572.308438450913 5222.7802734375 4.914535999298096 6.0
+572.3288720768687 5221.107421875 4.9143218994140625 6.0
+572.3493059026005 5220.828125 4.914013385772705 6.0
+572.3901732526574 5211.22900390625 4.912597179412842 6.0
+572.410607077225 5216.29248046875 4.91359806060791 6.0
+572.4310408013262 5219.74658203125 4.9139814376831055 6.0
+572.4719082488227 5221.0224609375 4.91360330581665 6.0
+572.4923419719853 5219.0068359375 4.912232875823975 6.0
+572.5127755949215 5218.70068359375 4.912930488586426 6.0
+572.5332094173937 5221.88671875 4.913270473480225 6.0
+572.5536431396322 5223.828125 4.913828372955322 6.0
+572.5740769613985 5218.19287109375 4.913388252258301 6.0
+572.5945105829378 5212.103515625 4.913334369659424 6.0
+572.6149443040049 5223.4912109375 4.914611339569092 6.0
+572.6353781248472 5217.0302734375 4.913516044616699 6.0
+572.6558117452223 5231.09912109375 4.915107250213623 6.0
+572.6762454653654 5223.73828125 4.913478374481201 6.0
+572.696679285269 5228.40380859375 4.913776397705078 6.0
+572.7171129047128 5221.2236328125 4.913124084472656 6.0
+572.7375466239173 5222.23876953125 4.9133758544921875 6.0
+572.7579804426641 5215.8828125 4.912219524383545 6.0
+572.7784141609445 5223.2021484375 4.912681579589844 6.0
+572.7988477792242 5218.05859375 4.912899017333984 6.0
+572.8192815967996 5216.17724609375 4.912318229675293 6.0
+572.8397153143815 5223.48486328125 4.913477897644043 6.0
+572.8601489312568 5221.72216796875 4.912906646728516 6.0
+572.880582748141 5228.28857421875 4.913931369781494 6.0
+572.901016364558 5216.97119140625 4.912446022033691 6.0
+572.9214501805036 5217.39111328125 4.912845611572266 6.0
+572.9418838962229 5207.87646484375 4.912497520446777 6.0
+572.9623175117085 5206.3984375 4.912239074707031 6.0
+572.9827513267228 5208.28173828125 4.912563800811768 6.0
+573.0031850412779 5212.21875 4.913223743438721 6.0
+573.0236186555994 5215.4931640625 4.913450717926025 6.0
+573.0440524696824 5209.6767578125 4.913194179534912 6.0
+573.0644861833061 5205.55322265625 4.912537097930908 6.0
+573.1053536096151 5210.02783203125 4.913090705871582 6.0
+573.1257873223076 5203.412109375 4.912187099456787 6.0
+573.1462210347672 5216.66455078125 4.913555145263672 6.0
+573.1666547465211 5210.6904296875 4.913242816925049 6.0
+573.1870884582822 5215.7236328125 4.913201808929443 6.0
+573.2075221695777 5215.1201171875 4.912756443023682 6.0
+573.2279558804003 5213.98876953125 4.912701606750488 6.0
+573.2483895909972 5221.203125 4.9132795333862305 6.0
+573.2688234013622 5212.955078125 4.913022518157959 6.0
+573.2892571112534 5210.11328125 4.912548542022705 6.0
+573.3096907209183 5204.15380859375 4.912300109863281 6.0
+573.3301245301191 5204.49365234375 4.911942005157471 6.0
+573.350558239079 5211.166015625 4.912563323974609 6.0
+573.3709918475797 5200.33447265625 4.912418365478516 6.0
+573.3914256558492 5199.14208984375 4.912012577056885 6.0
+573.4118593636449 5202.95361328125 4.912306785583496 6.0
+573.4322929712143 5202.14453125 4.912330150604248 6.0
+573.4527267783124 5194.9326171875 4.911515235900879 6.0
+573.473160485184 5203.69482421875 4.911691188812256 6.0
+573.4935940918222 5204.13623046875 4.912519931793213 6.0
+573.5140278979961 5198.384765625 4.911643981933594 6.0
+573.5344615036956 5192.66748046875 4.911627769470215 6.0
+573.5548952091704 5193.73095703125 4.911192417144775 6.0
+573.5753290144057 5196.498046875 4.911366939544678 6.0
+573.595762719182 5219.7734375 4.913686752319336 6.0
+573.6366301278031 5191.87060546875 4.9107136726379395 6.0
+573.6570638316407 5192.68017578125 4.911468029022217 6.0
+573.6774975350199 5194.40283203125 4.910445690155029 6.0
+573.6979312381591 5197.703125 4.9116692543029785 6.0
+573.7183649408398 5207.6201171875 4.912863254547119 6.0
+573.7387986432877 5198.37451171875 4.912044525146484 6.0
+573.7592323455028 5199.92236328125 4.912387847900391 6.0
+573.779666047245 5192.859375 4.911794185638428 6.0
+573.8000998485295 5210.599609375 4.913017272949219 6.0
+573.8205334495724 5198.58837890625 4.911863803863525 6.0
+573.8409671503905 5197.22802734375 4.912280559539795 6.0
+573.8614009507437 5200.423828125 4.912384986877441 6.0
+573.8818345508625 5207.80908203125 4.912703514099121 6.0
+573.9022682505092 5195.14306640625 4.911691188812256 6.0
+573.9227020499311 5202.9775390625 4.912222862243652 6.0
+573.9431356488785 5199.078125 4.911920547485352 6.0
+573.9635694476019 5206.39208984375 4.912639141082764 6.0
+573.9840031458589 5200.45947265625 4.9123969078063965 6.0
+574.0248705414342 5195.275390625 4.912271499633789 6.0
+574.0453042387599 5198.068359375 4.912546157836914 6.0
+574.0657378358446 5204.45556640625 4.912748336791992 6.0
+574.0861716324725 5200.52587890625 4.9123215675354 6.0
+574.106605328634 5198.794921875 4.911883354187012 6.0
+574.1270390245554 5197.28662109375 4.912400245666504 6.0
+574.1474727202512 5190.14892578125 4.911708831787109 6.0
+574.1679064154814 5195.52880859375 4.911952495574951 6.0
+574.1883401104715 5186.75537109375 4.910979747772217 6.0
+574.2087738050031 5197.92138671875 4.912092208862305 6.0
+574.229207499302 5201.400390625 4.912574768066406 6.0
+574.2496411931279 5190.13037109375 4.911223411560059 6.0
+574.290508579863 5196.08203125 4.912360191345215 6.0
+574.3109422727575 5194.6826171875 4.911768913269043 6.0
+574.3313759651937 5185.013671875 4.910735607147217 6.0
+574.3518096573971 5190.64501953125 4.911864757537842 6.0
+574.3722434493611 5187.91748046875 4.910822868347168 6.0
+574.3926770408652 5193.2431640625 4.912088871002197 6.0
+574.4131107319045 5182.013671875 4.911092281341553 6.0
+574.4335445227043 5177.48095703125 4.910451889038086 6.0
+574.4539781132771 5196.1015625 4.912186145782471 6.0
+574.474411803385 5188.4208984375 4.911484241485596 6.0
+574.4948455932536 5193.12548828125 4.9117584228515625 6.0
+574.5152791826622 5178.02197265625 4.910533905029297 6.0
+574.5357128718388 5193.68896484375 4.912059783935547 6.0
+574.5561466605432 5194.17333984375 4.9118146896362305 6.0
+574.5765802490205 5191.3359375 4.911275386810303 6.0
+574.5970139370329 5192.02685546875 4.911936283111572 6.0
+574.617447724806 5194.4921875 4.911501884460449 6.0
+574.6378814121199 5185.71533203125 4.910902500152588 6.0
+574.658315099201 5197.81298828125 4.912057399749756 6.0
+574.678748786042 5190.2275390625 4.911506652832031 6.0
+574.6991824724246 5200.10498046875 4.9120988845825195 6.0
+574.7196161583415 5177.078125 4.909907817840576 6.0
+574.7400498440184 5186.775390625 4.911231994628906 6.0
+574.7604835294696 5197.55908203125 4.912002086639404 6.0
+574.7809172144553 5191.49169921875 4.911247730255127 6.0
+574.8013508992008 5181.5556640625 4.910651683807373 6.0
+574.8217845834879 5179.126953125 4.910421848297119 6.0
+574.842218367543 5189.33154296875 4.911120414733887 6.0
+574.8626519511236 5179.78369140625 4.910019397735596 6.0
+574.8830856344794 5189.10205078125 4.911433219909668 6.0
+574.9035193173695 5187.14892578125 4.911244869232178 6.0
+574.9239530000195 5184.7958984375 4.9113054275512695 6.0
+574.9443866822112 5178.29736328125 4.9099812507629395 6.0
+574.96482036417 5188.5791015625 4.911479473114014 6.0
+574.9852540456559 5183.5068359375 4.910671234130859 6.0
+575.0056878271498 5184.36669921875 4.9108734130859375 6.0
+575.0261214079437 5184.17236328125 4.9105305671691895 6.0
+575.0465550884983 5177.806640625 4.910472869873047 6.0
+575.066988868828 5177.205078125 4.910314083099365 6.0
+575.0874224486906 5182.78125 4.910369396209717 6.0
+575.107856128081 5179.7666015625 4.910580158233643 6.0
+575.1282899072467 5176.4521484375 4.910545349121094 6.0
+575.1487234861779 5177.97607421875 4.909647464752197 6.0
+575.169157164637 5182.05615234375 4.910618305206299 6.0
+575.1895909428713 5184.05810546875 4.911381721496582 6.0
+575.2100246206392 5177.3701171875 4.909656524658203 6.0
+575.2304581981662 5180.30908203125 4.909353256225586 6.0
+575.2508919752363 5177.90185546875 4.909669399261475 6.0
+575.2713256520656 5176.43017578125 4.908761501312256 6.0
+575.2917592286685 5181.23291015625 4.910679817199707 6.0
+575.3121930048073 5177.71435546875 4.910040378570557 6.0
+575.3530604559128 5173.400390625 4.909888744354248 6.0
+575.3734940311188 5184.30859375 4.911166191101074 6.0
+575.3939277058525 5173.8603515625 4.909884929656982 6.0
+575.4143614801287 5177.5302734375 4.9102702140808105 6.0
+575.4552287279803 5176.8525390625 4.9100022315979 6.0
+575.4756625013179 5184.64306640625 4.910111427307129 6.0
+575.4960960744284 5179.4521484375 4.910008907318115 6.0
+575.5165297470667 5175.185546875 4.9099884033203125 6.0
+575.5369635194802 5175.96240234375 4.909766674041748 6.0
+575.5573970914265 5182.35791015625 4.910824775695801 6.0
+575.5778307631335 5178.53173828125 4.9099650382995605 6.0
+575.5982644343821 5174.68017578125 4.909951686859131 6.0
+575.6186981053979 5177.99658203125 4.910158157348633 6.0
+575.6391317761736 5171.5849609375 4.909462928771973 6.0
+575.6595654462581 5173.28076171875 4.909727096557617 6.0
+575.6799991163425 5175.92236328125 4.90889310836792 6.0
+575.7004328859548 5184.1650390625 4.910772323608398 6.0
+575.7208665553408 5179.20166015625 4.909610271453857 6.0
+575.7413001242603 5168.75341796875 4.9094696044921875 6.0
+575.7617338927084 5175.8369140625 4.909483432769775 6.0
+575.7821675609302 5175.09375 4.908879280090332 6.0
+575.8026011289185 5167.71923828125 4.908395290374756 6.0
+575.8230348964353 5168.53271484375 4.908167839050293 6.0
+575.8434685637258 5181.48828125 4.910159587860107 6.0
+575.8639021305498 5165.87744140625 4.908169746398926 6.0
+575.8843358971353 5181.85791015625 4.910121917724609 6.0
+575.9047695632617 5174.9853515625 4.910144805908203 6.0
+575.9456368945757 5179.5859375 4.910562515258789 6.0
+575.9660705597707 5167.6904296875 4.910136699676514 6.0
+575.9865041244993 5161.6982421875 4.908492565155029 6.0
+576.0069378889893 5179.400390625 4.910137176513672 6.0
+576.027371553253 5176.89501953125 4.910754680633545 6.0
+576.0478052170511 5167.748046875 4.90990686416626 6.0
+576.0682388803762 5168.9912109375 4.908838748931885 6.0
+576.0886725434757 5170.06591796875 4.909468650817871 6.0
+576.1091063063359 5165.09326171875 4.909661769866943 6.0
+576.1295399687369 5170.78369140625 4.909378528594971 6.0
+576.1499735306716 5163.91259765625 4.906251430511475 6.0
+576.1704072926077 5165.62060546875 4.908257007598877 6.0
+576.1908409538373 5167.67236328125 4.907778263092041 6.0
+576.2112745148406 5176.546875 4.9091291427612305 6.0
+576.2317082756053 5160.96923828125 4.908551216125488 6.0
+576.2521419359109 5180.70263671875 4.909847259521484 6.0
+576.2725754959829 5171.45166015625 4.90983772277832 6.0
+576.2930092558236 5170.33837890625 4.908792972564697 6.0
+576.3134428149569 5171.06005859375 4.909610748291016 6.0
+576.3338764740984 5163.3134765625 4.908511638641357 6.0
+576.3543102327676 5168.861328125 4.908836841583252 6.0
+576.3747437909769 5160.66552734375 4.907789707183838 6.0
+576.3951774489542 5165.99169921875 4.908171653747559 6.0
+576.4156112066994 5169.1552734375 4.90778112411499 6.0
+576.4360447639701 5164.318359375 4.907045841217041 6.0
+576.456478520784 5160.39697265625 4.9065046310424805 6.0
+576.476912177357 5158.79248046875 4.906959533691406 6.0
+576.4973457337037 5175.5048828125 4.908780574798584 6.0
+576.5177794895862 5161.56982421875 4.907230854034424 6.0
+576.5382131450024 5173.62890625 4.908483982086182 6.0
+576.5586468004112 5176.4052734375 4.909471035003662 6.0
+576.5790804551289 5174.4423828125 4.907729625701904 6.0
+576.5995141096064 5171.9921875 4.908731460571289 6.0
+576.6199477638584 5175.27734375 4.910557746887207 6.0
+576.6403814176447 5172.87939453125 4.909924507141113 6.0
+576.6608150711982 5171.83154296875 4.909852504730225 6.0
+576.6812487245115 5167.45068359375 4.908897876739502 6.0
+576.7016824771345 5171.720703125 4.909421443939209 6.0
+576.7221160297486 5184.1962890625 4.91098690032959 6.0
+576.7425496819051 5162.09228515625 4.907756328582764 6.0
+576.7629834335967 5152.6123046875 4.906811237335205 6.0
+576.7834169850539 5159.66943359375 4.907999038696289 6.0
+576.8038507362726 5166.93408203125 4.907127380371094 6.0
+576.8242843870321 5168.47412109375 4.904706954956055 6.0
+576.8447179373179 5157.7392578125 4.9048333168029785 6.0
+576.8651516873797 5164.38232421875 4.905851364135742 6.0
+576.8855853372079 5171.44580078125 4.906295299530029 6.0
+576.9060188865697 5165.04736328125 4.906977653503418 6.0
+576.92645263546 5168.478515625 4.909082889556885 6.0
+576.9468862843569 5176.28857421875 4.90862512588501 6.0
+576.967319932548 5168.9677734375 4.907808780670166 6.0
+576.9877535805135 5169.25830078125 4.909724235534668 6.0
+577.0081872282462 5165.556640625 4.908361911773682 6.0
+577.0490545225402 5167.52197265625 4.908877372741699 6.0
+577.0694881693416 5164.74755859375 4.906763553619385 6.0
+577.0899217154365 5171.29931640625 4.909095287322998 6.0
+577.1103554615402 5159.32861328125 4.905807971954346 6.0
+577.1307891071774 5165.353515625 4.906458377838135 6.0
+577.1512227523417 5164.89697265625 4.906702518463135 6.0
+577.1716563972805 5160.3212890625 4.906283378601074 6.0
+577.1920900417535 5161.7998046875 4.905452728271484 6.0
+577.2125237862201 5160.89208984375 4.90518856048584 6.0
+577.232957329994 5160.447265625 4.9056715965271 6.0
+577.2533909735357 5170.45947265625 4.906017303466797 6.0
+577.2738247168381 5166.09375 4.90619421005249 6.0
+577.3146919020583 5168.947265625 4.90675163269043 6.0
+577.3351256441965 5163.400390625 4.905209064483643 6.0
+577.3555591861077 5167.025390625 4.906589508056641 6.0
+577.375992827554 5164.68603515625 4.907345294952393 6.0
+577.396426568761 5172.919921875 4.90803337097168 6.0
+577.416860109508 5173.50927734375 4.909411907196045 6.0
+577.437293750023 5171.080078125 4.905070781707764 6.0
+577.4577274900657 5170.728515625 4.906164646148682 6.0
+577.4781610298814 5165.8505859375 4.905269622802734 6.0
+577.498594769233 5164.21923828125 4.9053120613098145 6.0
+577.5190284083437 5173.79248046875 4.907687664031982 6.0
+577.5394620472289 5169.15771484375 4.907258987426758 6.0
+577.5598956856484 5169.13525390625 4.907024383544922 6.0
+577.5803293235949 5172.0908203125 4.907637119293213 6.0
+577.6007629613159 5163.14794921875 4.907395839691162 6.0
+577.6211965985713 5178.15087890625 4.908516883850098 6.0
+577.6416302355865 5172.9873046875 4.90790319442749 6.0
+577.6620638723762 5178.75927734375 4.908226490020752 6.0
+577.6824975087002 5170.693359375 4.907297611236572 6.0
+577.7029311447841 5165.89306640625 4.905918598175049 6.0
+577.7233646804088 5165.7998046875 4.907525539398193 6.0
+577.7437984155695 5170.22998046875 4.906959533691406 6.0
+577.7642320507221 5172.04248046875 4.907953262329102 6.0
+577.7846655851827 5174.3154296875 4.908297061920166 6.0
+577.805099319412 5163.826171875 4.906223773956299 6.0
+577.8255329534004 5174.49658203125 4.907470226287842 6.0
+577.8459666869312 5171.744140625 4.9069318771362305 6.0
+577.8664002202277 5178.73779296875 4.9083662033081055 6.0
+577.8868338530519 5166.4326171875 4.907009601593018 6.0
+577.9072675856514 5167.85546875 4.906158447265625 6.0
+577.9277011180093 5165.13232421875 4.906946659088135 6.0
+577.9481347496767 5176.03564453125 4.907131195068359 6.0
+577.9685684813448 5172.30224609375 4.908337593078613 6.0
+578.0094356432746 5174.5380859375 4.907915115356445 6.0
+578.0298693737786 5164.81787109375 4.907113075256348 6.0
+578.0503030040418 5178.16552734375 4.907827854156494 6.0
+578.0707365338458 5164.9794921875 4.907782554626465 6.0
+578.0911702620215 5175.95263671875 4.908256530761719 6.0
+578.1116038911205 5172.61328125 4.907961845397949 6.0
+578.1320374199931 5179.544921875 4.909364223480225 6.0
+578.1524711484017 5168.46240234375 4.908501148223877 6.0
+578.1729047765693 5168.4453125 4.906775951385498 6.0
+578.2137720315222 5182.18505859375 4.908626079559326 6.0
+578.2342056587586 5178.439453125 4.908443450927734 6.0
+578.2546393853045 5179.04931640625 4.908303260803223 6.0
+578.275072911616 5176.82861328125 4.908321857452393 6.0
+578.2955065376882 5166.02880859375 4.907938480377197 6.0
+578.3159402635356 5168.4892578125 4.907903671264648 6.0
+578.336373788683 5163.63427734375 4.907057762145996 6.0
+578.3568074138238 5171.11474609375 4.908641815185547 6.0
+578.3772410382735 5169.685546875 4.907982349395752 6.0
+578.4589755335037 5175.37548828125 4.909374237060547 6.0
+578.4794091565491 5180.47900390625 4.909812927246094 6.0
+578.5202764012574 5179.1416015625 4.909512519836426 6.0
+578.5407101231394 5165.90869140625 4.9089837074279785 6.0
+578.5611437447951 5174.54931640625 4.9091901779174805 6.0
+578.5815772659844 5181.86376953125 4.9083099365234375 6.0
+578.6224446071938 5176.46337890625 4.907382965087891 6.0
+578.6428781274517 5180.90625 4.908401012420654 6.0
+578.6633118472382 5178.52294921875 4.909213066101074 6.0
+578.6837454667984 5185.77783203125 4.910943031311035 6.0
+578.7041789858922 5191.77197265625 4.9112868309021 6.0
+578.7246127047474 5176.7001953125 4.909457683563232 6.0
+578.7450463231435 5182.0361328125 4.909005165100098 6.0
+578.7654798413059 5181.78857421875 4.908114433288574 6.0
+578.785913558997 5178.7841796875 4.909213066101074 6.0
+578.8063471764617 5181.76904296875 4.908480644226074 6.0
+578.82678069346 5175.3212890625 4.90654182434082 6.0
+578.8472144102197 5187.86376953125 4.908255577087402 6.0
+578.8676480265203 5179.45849609375 4.908175945281982 6.0
+578.8880817425816 5184.9619140625 4.908571243286133 6.0
+578.9085152584157 5178.18408203125 4.908276081085205 6.0
+578.928948873785 5184.12939453125 4.90836763381958 6.0
+578.9493825886893 5180.5029296875 4.908109664916992 6.0
+578.9698161033521 5179.041015625 4.908449649810791 6.0
+578.99024971779 5180.77978515625 4.907670497894287 6.0
+579.0106834317558 5185.75439453125 4.911086559295654 6.0
+579.0311170452624 5189.3896484375 4.910653114318848 6.0
+579.0515505585354 5182.841796875 4.909847736358643 6.0
+579.0719842715771 5185.14208984375 4.9101738929748535 6.0
+579.0924177841443 5186.90087890625 4.9090471267700195 6.0
+579.1332851083571 5180.9619140625 4.909176349639893 6.0
+579.1537186197675 5181.912109375 4.909877300262451 6.0
+579.1741522311786 5180.41455078125 4.909511089324951 6.0
+579.194585941892 5183.81689453125 4.909153938293457 6.0
+579.2150194525966 5181.0576171875 4.909235000610352 6.0
+579.2354531626115 5183.44775390625 4.910431861877441 6.0
+579.2763202819333 5188.5771484375 4.909584999084473 6.0
+579.2967539912497 5187.1787109375 4.910019397735596 6.0
+579.337621108476 5183.61181640625 4.90936803817749 6.0
+579.3580548166283 5184.33203125 4.9084954261779785 6.0
+579.3784884243069 5191.2197265625 4.908886909484863 6.0
+579.3989220317599 5190.42333984375 4.909785270690918 6.0
+579.4397892457346 5184.9921875 4.909790992736816 6.0
+579.4602228520162 5177.9013671875 4.908796310424805 6.0
+579.4806564580722 5186.53759765625 4.910009384155273 6.0
+579.5010900638881 5188.71044921875 4.910654544830322 6.0
+579.5215236692457 5184.716796875 4.9109601974487305 6.0
+579.5419572741375 5188.5947265625 4.909383296966553 6.0
+579.5623908787966 5197.794921875 4.911710262298584 6.0
+579.5828244832155 5198.64208984375 4.911661624908447 6.0
+579.6032581871768 5197.23486328125 4.912604808807373 6.0
+579.6236916908965 5196.693359375 4.9102983474731445 6.0
+579.6441253941593 5188.0478515625 4.908978462219238 6.0
+579.6645589971886 5192.33154296875 4.911144733428955 6.0
+579.6849924997514 5189.6123046875 4.909603595733643 6.0
+579.7054262020756 5186.673828125 4.908218860626221 6.0
+579.7258598039407 5193.6650390625 4.9096479415893555 6.0
+579.7462933055649 5186.04150390625 4.909384250640869 6.0
+579.8075941081333 5197.8564453125 4.912391662597656 6.0
+579.8280278083621 5195.4736328125 4.9118242263793945 6.0
+579.8484613081309 5198.97607421875 4.911612510681152 6.0
+579.8688949076604 5207.45849609375 4.912199020385742 6.0
+579.8893286069651 5199.94677734375 4.911777973175049 6.0
+579.9506294023086 5202.99072265625 4.910530090332031 6.0
+579.9710630002155 5199.45166015625 4.910223007202148 6.0
+579.9914965976495 5198.87646484375 4.908409118652344 6.0
+580.0119301946252 5193.7490234375 4.909543037414551 6.0
+580.032363791368 5204.32080078125 4.911208629608154 6.0
+580.0527974878714 5196.3544921875 4.911820888519287 6.0
+580.073230983915 5197.1513671875 4.911256790161133 6.0
+580.0936645794936 5204.181640625 4.912469387054443 6.0
+580.1140982750658 5192.8857421875 4.9114580154418945 6.0
+580.1345317699452 5206.19482421875 4.911933898925781 6.0
+580.1549653645925 5206.97119140625 4.91287088394165 6.0
+580.1753990590005 5201.30419921875 4.912342071533203 6.0
+580.1958325529486 5202.73388671875 4.911688327789307 6.0
+580.2162661466646 5207.28271484375 4.912187576293945 6.0
+580.2366998399084 5207.93603515625 4.912980556488037 6.0
+580.2571333329252 5210.15478515625 4.911451816558838 6.0
+580.277566925477 5206.26318359375 4.912784576416016 6.0
+580.2980006177895 5203.8681640625 4.912271976470947 6.0
+580.3184341098749 5203.98486328125 4.912237644195557 6.0
+580.3388678012561 5209.18359375 4.911833763122559 6.0
+580.3593013926438 5208.29541015625 4.913509845733643 6.0
+580.3797348835651 5212.17578125 4.914114952087402 6.0
+580.4206021642385 5212.18310546875 4.913909435272217 6.0
+580.4410357542292 5205.56103515625 4.912935256958008 6.0
+580.461469343747 5211.9853515625 4.913861274719238 6.0
+580.5023364216322 5219.05712890625 4.913805961608887 6.0
+580.5227701102267 5216.75634765625 4.914097785949707 6.0
+580.5432036983475 5205.8759765625 4.913323402404785 6.0
+580.5636371860091 5220.80908203125 4.913796424865723 6.0
+580.5840708734322 5206.484375 4.914219856262207 6.0
+580.604504460629 5220.9130859375 4.914618968963623 6.0
+580.6249379473593 5219.7646484375 4.914863109588623 6.0
+580.6453716338583 5220.0859375 4.914417743682861 6.0
+580.6658052198836 5228.1611328125 4.916029930114746 6.0
+580.6862389054513 5222.57861328125 4.914261341094971 6.0
+580.7066723910102 5224.505859375 4.914340496063232 6.0
+580.7271059758787 5219.85693359375 4.914210796356201 6.0
+580.767973144917 5212.68212890625 4.914113998413086 6.0
+580.7884067290797 5218.30859375 4.914065837860107 6.0
+580.8088404127848 5225.1376953125 4.915805339813232 6.0
+580.8292738960154 5209.45556640625 4.913389682769775 6.0
+580.8497074790212 5222.37744140625 4.913384914398193 6.0
+580.8701411615621 5215.8291015625 4.9135894775390625 6.0
+580.8905747438621 5219.08935546875 4.9133758544921875 6.0
+580.911008225703 5222.9208984375 4.913581371307373 6.0
+580.9314419073125 5225.740234375 4.913806915283203 6.0
+580.9518754886813 5211.53076171875 4.913379669189453 6.0
+580.9723089695908 5230.83251953125 4.913992881774902 6.0
+580.9927426500362 5227.478515625 4.914446830749512 6.0
+581.0131762302408 5228.12939453125 4.912912845611572 6.0
+581.0336099102205 5216.84375 4.913524627685547 6.0
+581.0540433897331 5231.30810546875 4.915045738220215 6.0
+581.0744769687735 5225.92529296875 4.914400100708008 6.0
+581.0949106475891 5234.53466796875 4.914028167724609 6.0
+581.1357777042795 5231.3671875 4.9140305519104 6.0
+581.156211282163 5226.05810546875 4.913850784301758 6.0
+581.1766448595808 5227.58056640625 4.91335391998291 6.0
+581.197078336525 5232.685546875 4.914995193481445 6.0
+581.2175120132451 5227.32568359375 4.91395902633667 6.0
+581.2583790657518 5231.56396484375 4.913321495056152 6.0
+581.2788127415333 5229.4716796875 4.915770530700684 6.0
+581.2992463168557 5235.1357421875 4.915840148925781 6.0
+581.319679891938 5234.0078125 4.914825916290283 6.0
+581.3401134665619 5229.1962890625 4.915379047393799 6.0
+581.360547040953 5228.32470703125 4.914775848388672 6.0
+581.3809807151047 5235.20263671875 4.915553569793701 6.0
+581.4218477620234 5231.95166015625 4.913925647735596 6.0
+581.442281435011 5231.3740234375 4.9149627685546875 6.0
+581.4627150075394 5229.85302734375 4.915670394897461 6.0
+581.4831484798342 5242.283203125 4.917570114135742 6.0
+581.5035821516576 5233.46923828125 4.915383338928223 6.0
+581.5240157232547 5232.486328125 4.916359901428223 6.0
+581.5444491946182 5239.95068359375 4.916233539581299 6.0
+581.5648828655103 5232.84814453125 4.915714263916016 6.0
+581.5853164359432 5234.5322265625 4.916430473327637 6.0
+581.6057499061426 5234.21484375 4.91577672958374 6.0
+581.6261835761034 5245.78466796875 4.916253566741943 6.0
+581.646617145605 5241.80712890625 4.916429042816162 6.0
+581.667050614873 5234.904296875 4.9140849113464355 6.0
+581.6874842836696 5230.34619140625 4.914551258087158 6.0
+581.7079178520071 5244.49658203125 4.9157938957214355 6.0
+581.7283515201125 5243.34912109375 4.916432857513428 6.0
+581.7487849879763 5250.44921875 4.917977333068848 6.0
+581.7692185553824 5242.84912109375 4.915920734405518 6.0
+581.8100856892561 5262.2138671875 4.918693542480469 6.0
+581.8305192557309 5241.7373046875 4.916339874267578 6.0
+581.8509528217401 5247.2939453125 4.917782783508301 6.0
+581.8713863875091 5245.75 4.917138576507568 6.0
+581.8918199528198 5235.89013671875 4.915284156799316 6.0
+581.9122535178976 5237.51806640625 4.916670322418213 6.0
+581.9326870825025 5238.44873046875 4.9158034324646 6.0
+581.9531206468819 5244.2158203125 4.91640567779541 6.0
+581.9735543107963 5247.32470703125 4.91688346862793 6.0
+581.9939877744691 5239.08984375 4.916447639465332 6.0
+582.0144213379172 5241.42236328125 4.916029453277588 6.0
+582.034855000893 5244.25732421875 4.916475296020508 6.0
+582.0552884634089 5238.72705078125 4.917044639587402 6.0
+582.0757221256936 5250.7138671875 4.918290138244629 6.0
+582.0961556875118 5240.13525390625 4.9164862632751465 6.0
+582.1165891490891 5248.20068359375 4.917271137237549 6.0
+582.1370228104424 5250.44384765625 4.917239189147949 6.0
+582.157456371322 5252.80810546875 4.917178630828857 6.0
+582.1778898317425 5239.5625 4.917220592498779 6.0
+582.1983234919317 5246.98876953125 4.917214870452881 6.0
+582.2187570518872 5243.57763671875 4.916718006134033 6.0
+582.2391905113691 5242.576171875 4.916827201843262 6.0
+582.2596241706269 5248.08203125 4.9179863929748535 6.0
+582.280057729411 5245.5400390625 4.917002201080322 6.0
+582.3004912879696 5239.65478515625 4.9177093505859375 6.0
+582.3209248460626 5254.12841796875 4.917524337768555 6.0
+582.3413584036898 5250.36669921875 4.917761325836182 6.0
+582.3617919613098 5258.833984375 4.918032169342041 6.0
+582.3822255182386 5245.36669921875 4.9161553382873535 6.0
+582.4230927313911 5259.39599609375 4.9188666343688965 6.0
+582.4435262876214 5247.91943359375 4.916962623596191 6.0
+582.4843933986776 5253.48193359375 4.918517589569092 6.0
+582.5048269535109 5248.27734375 4.917836666107178 6.0
+582.5252604083362 5250.25048828125 4.919182300567627 6.0
+582.5456940627046 5249.353515625 4.917887210845947 6.0
+582.5661275166058 5258.03466796875 4.91986083984375 6.0
+582.5865610702676 5249.80712890625 4.917233467102051 6.0
+582.6069947234719 5255.02880859375 4.917349338531494 6.0
+582.6274281764418 5259.740234375 4.91751766204834 6.0
+582.6478617291723 5254.6572265625 4.918456554412842 6.0
+582.6682953814452 5249.7373046875 4.917080879211426 6.0
+582.6887288332509 5255.3720703125 4.917627334594727 6.0
+582.7091623848173 5254.85498046875 4.9174089431762695 6.0
+582.7295960361589 5249.591796875 4.915510654449463 6.0
+582.7704630374355 5246.498046875 4.916912078857422 6.0
+582.790896687613 5251.462890625 4.918327808380127 6.0
+582.8317637870277 5248.8203125 4.918067455291748 6.0
+582.8521973360403 5245.7734375 4.916851997375488 6.0
+582.8726308850528 5242.61767578125 4.917356967926025 6.0
+582.8930644333595 5253.5712890625 4.919184684753418 6.0
+582.9339315292891 5255.97412109375 4.918832778930664 6.0
+582.9543651766653 5262.8447265625 4.919808387756348 6.0
+582.9747986238144 5251.62255859375 4.919172286987305 6.0
+582.9952321704986 5251.70263671875 4.9181623458862305 6.0
+583.0156658169435 5247.56689453125 4.918345928192139 6.0
+583.0360992629285 5246.6796875 4.918700218200684 6.0
+583.0565328086814 5251.38037109375 4.918788433074951 6.0
+583.0769664539621 5258.06201171875 4.919444561004639 6.0
+583.0973998990157 5253.91455078125 4.918665885925293 6.0
+583.1178334438373 5258.22998046875 4.919201374053955 6.0
+583.1382670879539 5251.2392578125 4.91797399520874 6.0
+583.1587005320762 5260.87158203125 4.918722152709961 6.0
+583.1791341757344 5263.58203125 4.920099258422852 6.0
+583.1995677189188 5260.04052734375 4.919888973236084 6.0
+583.220001161877 5251.013671875 4.91942024230957 6.0
+583.2404348043638 5258.6298828125 4.920232772827148 6.0
+583.281301788651 5256.28369140625 4.9192681312561035 6.0
+583.3017354302137 5248.03076171875 4.917459011077881 6.0
+583.3221689713027 5251.619140625 4.917760372161865 6.0
+583.3426024121654 5251.67138671875 4.919081211090088 6.0
+583.3630360527895 5253.17724609375 4.919339179992676 6.0
+583.3834695929545 5252.69921875 4.919118881225586 6.0
+583.4039030328859 5246.2568359375 4.917968273162842 6.0
+583.4243366723531 5249.8642578125 4.918308734893799 6.0
+583.4447702113466 5249.287109375 4.918810844421387 6.0
+583.4652036503467 5248.451171875 4.918400764465332 6.0
+583.4856372886425 5248.16552734375 4.918688774108887 6.0
+583.506070826712 5255.01708984375 4.9190897941589355 6.0
+583.5265044645494 5253.57470703125 4.918919563293457 6.0
+583.5469379019196 5251.978515625 4.918807506561279 6.0
+583.5673714390505 5250.91748046875 4.918949127197266 6.0
+583.5878050757237 5244.49755859375 4.917515754699707 6.0
+583.6082385121554 5243.59521484375 4.917995452880859 6.0
+583.6286720481294 5253.1806640625 4.919748306274414 6.0
+583.6491056838713 5248.5556640625 4.918778896331787 6.0
+583.6695391191461 5256.10791015625 4.919646263122559 6.0
+583.6899726541815 5250.41748046875 4.919490337371826 6.0
+583.7104062889921 5242.548828125 4.918015956878662 6.0
+583.7308397230954 5243.51123046875 4.918651103973389 6.0
+583.7512732572068 5252.79052734375 4.919510364532471 6.0
+583.7717068908532 5247.09619140625 4.918644905090332 6.0
+583.792140424026 5242.1318359375 4.918308258056641 6.0
+583.8125738569724 5236.62255859375 4.917966365814209 6.0
+583.8330074896876 5250.90283203125 4.919099807739258 6.0
+583.8534410216962 5235.14794921875 4.917566776275635 6.0
+583.8738745537121 5247.63525390625 4.918905258178711 6.0
+583.8943080852623 5251.49365234375 4.918819904327393 6.0
+583.9147416163396 5249.818359375 4.9195380210876465 6.0
+583.9351751474242 5245.03515625 4.919225215911865 6.0
+583.9760421079554 5245.0546875 4.917884349822998 6.0
+583.9964757378766 5247.443359375 4.918267250061035 6.0
+584.0169092673314 5260.12109375 4.919958114624023 6.0
+584.0373426963197 5252.17333984375 4.918667793273926 6.0
+584.0577763253023 5240.8046875 4.918053150177002 6.0
+584.0782098535929 5246.6279296875 4.918986797332764 6.0
+584.0986432816426 5247.40673828125 4.9188690185546875 6.0
+584.1190769094683 5249.31005859375 4.919782638549805 6.0
+584.1395104368275 5247.84130859375 4.919519901275635 6.0
+584.1599439639467 5251.07958984375 4.919558525085449 6.0
+584.1803774906075 5241.7412109375 4.918233871459961 6.0
+584.2212446429912 5254.2890625 4.919515609741211 6.0
+584.2416780687199 5241.169921875 4.917057991027832 6.0
+584.2621115939837 5245.294921875 4.918511867523193 6.0
+584.2825452190082 5244.43212890625 4.918581962585449 6.0
+584.3029786438055 5235.9765625 4.91766881942749 6.0
+584.323412168138 5243.224609375 4.918157577514648 6.0
+584.3438457919983 5243.736328125 4.917891979217529 6.0
+584.3642793156323 5250.0234375 4.918598175048828 6.0
+584.4051463617288 5238.93408203125 4.918059349060059 6.0
+584.4255798844315 5244.16162109375 4.918269634246826 6.0
+584.4460133066677 5244.2890625 4.918202877044678 6.0
+584.4664469284326 5241.2333984375 4.918415069580078 6.0
+584.4868804499711 5240.63525390625 4.917882919311523 6.0
+584.507313871276 5235.68310546875 4.917459487915039 6.0
+584.5277474921095 5231.134765625 4.917564868927002 6.0
+584.5481810124838 5238.0263671875 4.918095111846924 6.0
+584.5686146326188 5248.64306640625 4.91822624206543 6.0
+584.5890480525268 5229.7431640625 4.916625499725342 6.0
+584.6094815719698 5239.29248046875 4.917898654937744 6.0
+584.62991509118 5232.78564453125 4.916358947753906 6.0
+584.6503486099173 5233.5009765625 4.916872024536133 6.0
+584.6707820284282 5235.68798828125 4.917038917541504 6.0
+584.691215646475 5227.802734375 4.916797637939453 6.0
+584.7116491640481 5230.4033203125 4.916601657867432 6.0
+584.7320826816285 5230.60009765625 4.91670560836792 6.0
+584.7525161985104 5245.71484375 4.9186177253723145 6.0
+584.772949715385 5242.8984375 4.918165683746338 6.0
+584.7933832315684 5240.525390625 4.917296886444092 6.0
+584.8138168477453 5242.19140625 4.917875289916992 6.0
+584.8342502634623 5230.67529296875 4.916360855102539 6.0
+584.8546838787152 5233.96728515625 4.916648864746094 6.0
+584.8751173937271 5234.15234375 4.916691303253174 6.0
+584.89555080828 5233.66650390625 4.916600704193115 6.0
+584.9159844226015 5238.65478515625 4.916611194610596 6.0
+584.977284963461 5229.04052734375 4.917055606842041 6.0
+584.9977184763775 5232.7421875 4.917145729064941 6.0
+585.0181518888348 5230.9736328125 4.9163289070129395 6.0
+585.0385855010609 5226.7666015625 4.916082859039307 6.0
+585.059019013046 5223.50048828125 4.916251182556152 6.0
+585.0794524245721 5228.21435546875 4.91657829284668 6.0
+585.099886035634 5236.8408203125 4.917020320892334 6.0
+585.120319546455 5229.04638671875 4.916579246520996 6.0
+585.1407529570497 5233.27880859375 4.917235374450684 6.0
+585.1611865671803 5224.763671875 4.915750503540039 6.0
+585.1816200768371 5235.3935546875 4.917413234710693 6.0
+585.2020536862692 5220.99462890625 4.9158406257629395 6.0
+585.2224870954669 5217.93115234375 4.915346145629883 6.0
+585.2429206041925 5221.62890625 4.91594934463501 6.0
+585.2837877207276 5228.54443359375 4.916978359222412 6.0
+585.304221128521 5223.03369140625 4.915787696838379 6.0
+585.3246546358569 5228.19482421875 4.917309284210205 6.0
+585.3450881429599 5226.66845703125 4.916779518127441 6.0
+585.3655216495899 5222.44775390625 4.916539192199707 6.0
+585.3859552559952 5226.423828125 4.91671895980835 6.0
+585.426822167632 5224.00390625 4.9162726402282715 6.0
+585.4472557728732 5218.564453125 4.915672779083252 6.0
+585.46768917788 5219.7236328125 4.915454864501953 6.0
+585.4881226826474 5230.9677734375 4.916061878204346 6.0
+585.5085562869572 5232.35302734375 4.917462348937988 6.0
+585.5289896907998 5216.73779296875 4.916430950164795 6.0
+585.5494232944038 5218.73486328125 4.916768550872803 6.0
+585.5698567975487 5225.63427734375 4.917720794677734 6.0
+585.59029020046 5221.3798828125 4.9167914390563965 6.0
+585.6107238031327 5226.40234375 4.9169535636901855 6.0
+585.6311573053463 5226.90771484375 4.916945457458496 6.0
+585.6515908070942 5224.90673828125 4.9168853759765625 6.0
+585.672024308602 5232.44873046875 4.9175944328308105 6.0
+585.6924578098842 5228.8134765625 4.917498588562012 6.0
+585.7128913107008 5227.025390625 4.91737699508667 6.0
+585.7333248110444 5217.89208984375 4.916746139526367 6.0
+585.7537583113954 5221.708984375 4.916626930236816 6.0
+585.7741918110478 5224.39599609375 4.917641639709473 6.0
+585.7946254104609 5222.4970703125 4.916715621948242 6.0
+585.8150588096469 5225.6875 4.917263031005859 6.0
+585.835492308368 5224.9736328125 4.917577743530273 6.0
+585.8559259068497 5222.96044921875 4.918047904968262 6.0
+585.8763593048716 5221.373046875 4.917083263397217 6.0
+585.8967929026549 5209.08642578125 4.916436672210693 6.0
+585.917226399979 5208.68408203125 4.916052341461182 6.0
+585.9376597970695 5216.17919921875 4.916159629821777 6.0
+585.9580933936959 5211.603515625 4.916463851928711 6.0
+585.9785268900814 5218.26904296875 4.9160284996032715 6.0
+585.9989602860078 5210.9794921875 4.91579008102417 6.0
+586.0193938816956 5215.9697265625 4.916689395904541 6.0
+586.0398272769235 5211.26904296875 4.916855335235596 6.0
+586.0602607719193 5215.0107421875 4.916381359100342 6.0
+586.080694366683 5205.41162109375 4.915687561035156 6.0
+586.1011277609723 5213.19140625 4.916277885437012 6.0
+586.121561254804 5216.61767578125 4.916558742523193 6.0
+586.1419948483963 5215.857421875 4.917130470275879 6.0
+586.1624282417615 5205.17333984375 4.916372299194336 6.0
+586.182861734429 5208.57763671875 4.916068077087402 6.0
+586.2032953270973 5215.73046875 4.916885852813721 6.0
+586.2237288192919 5208.47998046875 4.91587495803833 6.0
+586.2441623112609 5218.83154296875 4.917165279388428 6.0
+586.2850292937947 5207.67138671875 4.915998935699463 6.0
+586.3054627845995 5208.87158203125 4.916480541229248 6.0
+586.3258962751715 5209.89794921875 4.916506767272949 6.0
+586.3463297652706 5216.83740234375 4.9170074462890625 6.0
+586.3871967445448 5207.2783203125 4.915473937988281 6.0
+586.4076302337198 5205.357421875 4.91603946685791 6.0
+586.42806382243 5209.86865234375 4.916548728942871 6.0
+586.4484972106729 5212.45068359375 4.915934085845947 6.0
+586.4689306989094 5207.4755859375 4.9167280197143555 6.0
+586.4893642866882 5208.50732421875 4.9160685539245605 6.0
+586.5302311610722 5205.51904296875 4.9155449867248535 6.0
+586.5506647476868 5209.7490234375 4.915911674499512 6.0
+586.5710981340671 5203.6201171875 4.915253639221191 6.0
+586.591531719976 5195.2529296875 4.914196491241455 6.0
+586.6119652056586 5208.58251953125 4.915793418884277 6.0
+586.6323986908683 5205.37890625 4.9160990715026855 6.0
+586.6528321758524 5206.16796875 4.914881229400635 6.0
+586.6732655606029 5202.62939453125 4.915188312530518 6.0
+586.693699144882 5202.03857421875 4.915283203125 6.0
+586.7141326287019 5205.08203125 4.915262222290039 6.0
+586.734566112289 5201.01416015625 4.915736198425293 6.0
+586.7549994956353 5201.0771484375 4.915499210357666 6.0
+586.7754330785247 5205.7353515625 4.914648532867432 6.0
+586.7958665609476 5205.15673828125 4.915651321411133 6.0
+586.816299943137 5205.30322265625 4.9159393310546875 6.0
+586.8367335250878 5189.21337890625 4.91486120223999 6.0
+586.8571670065794 5197.94775390625 4.9158196449279785 6.0
+586.8776003878302 5208.5966796875 4.917221546173096 6.0
+586.8980339686241 5197.98486328125 4.916079044342041 6.0
+586.9184674489516 5210.9931640625 4.916418552398682 6.0
+586.9389010292725 5194.18115234375 4.915833950042725 6.0
+586.9593344089008 5198.86083984375 4.915910720825195 6.0
+586.9797678882969 5201.39013671875 4.916333198547363 6.0
+587.0002014674537 5191.76416015625 4.915262222290039 6.0
+587.0206348463835 5191.48974609375 4.915567398071289 6.0
+587.0410683246155 5191.62255859375 4.915290355682373 6.0
+587.061501902841 5199.01123046875 4.916088581085205 6.0
+587.0819352803737 5192.80419921875 4.915743827819824 6.0
+587.1023687579072 5198.7568359375 4.916393280029297 6.0
+587.1228023349686 5197.0068359375 4.916058540344238 6.0
+587.14323571157 5200.021484375 4.916292667388916 6.0
+587.1636691879394 5197.1455078125 4.916146278381348 6.0
+587.1841027638366 5199.6181640625 4.916311740875244 6.0
+587.2045362395074 5194.6611328125 4.9159255027771 6.0
+587.2249696149447 5187.0205078125 4.914762496948242 6.0
+587.2454031899106 5205.46435546875 4.9166669845581055 6.0
+587.2658366644173 5190.3857421875 4.91540002822876 6.0
+587.2862701386912 5190.67578125 4.915557861328125 6.0
+587.306703612725 5194.69873046875 4.916318416595459 6.0
+587.3271370863004 5190.58935546875 4.915597438812256 6.0
+587.3475706594036 5198.8623046875 4.915987968444824 6.0
+587.3884375049238 5207.84326171875 4.9169721603393555 6.0
+587.4088709771022 5197.06201171875 4.9155707359313965 6.0
+587.4293044490405 5200.4345703125 4.916126251220703 6.0
+587.4497378205197 5199.0 4.916224956512451 6.0
+587.4701713917602 5191.2412109375 4.915062427520752 6.0
+587.4906048625417 5191.74267578125 4.9155473709106445 6.0
+587.5110382328567 5187.599609375 4.9141740798950195 6.0
+587.5314718031732 5194.70703125 4.915160655975342 6.0
+587.5519052727832 5187.71484375 4.913099765777588 6.0
+587.5723387424005 5185.451171875 4.912704944610596 6.0
+587.5927722115448 5214.4287109375 4.914565563201904 6.0
+587.6132056802307 5197.35498046875 4.914809703826904 6.0
+587.6336392486846 5191.83544921875 4.9141526222229 6.0
+587.6540726166713 5200.39501953125 4.915450572967529 6.0
+587.6745060844187 5180.28173828125 4.914403915405273 6.0
+587.6949396517084 5194.06689453125 4.915129661560059 6.0
+587.7153731187573 5188.24169921875 4.914626598358154 6.0
+587.7358064855798 5196.884765625 4.915565013885498 6.0
+587.7562400519382 5188.47021484375 4.91420841217041 6.0
+587.7766735178229 5193.03759765625 4.915292739868164 6.0
+587.7971068834813 5184.55322265625 4.914292812347412 6.0
+587.8175404489084 5189.4833984375 4.9145426750183105 6.0
+587.8379739138618 5182.5439453125 4.913498401641846 6.0
+587.858407278356 5186.3603515625 4.9148712158203125 6.0
+587.878840842619 5185.841796875 4.91429328918457 6.0
+587.899274306641 5184.8076171875 4.913504600524902 6.0
+587.9197076702039 5179.2587890625 4.914154052734375 6.0
+587.9401412335355 5184.8701171875 4.914144515991211 6.0
+587.9605746963935 5180.86376953125 4.914225101470947 6.0
+587.9810082590266 5178.0751953125 4.913561820983887 6.0
+588.0014416211925 5181.919921875 4.914060592651367 6.0
+588.0218750831191 5177.1455078125 4.913674831390381 6.0
+588.0423085445873 5186.298828125 4.914651870727539 6.0
+588.0627420058227 5178.8623046875 4.914257049560547 6.0
+588.0831754665851 5189.13818359375 4.9153056144714355 6.0
+588.103608927122 5177.744140625 4.9143829345703125 6.0
+588.1240423871932 5183.5625 4.914521217346191 6.0
+588.1444758470243 5177.59228515625 4.913946628570557 6.0
+588.164909306397 5182.40771484375 4.913971900939941 6.0
+588.1853427655369 5174.25048828125 4.913384914398193 6.0
+588.2057762244367 5183.61083984375 4.91415548324585 6.0
+588.2262096826453 5179.21484375 4.912055492401123 6.0
+588.2466431408538 5174.7275390625 4.913911819458008 6.0
+588.2670765985895 5176.21923828125 4.913774490356445 6.0
+588.2875101558675 5181.630859375 4.913477897644043 6.0
+588.3079435129112 5172.646484375 4.913547039031982 6.0
+588.3283770697162 5173.986328125 4.913999080657959 6.0
+588.3488105260622 5176.775390625 4.913060665130615 6.0
+588.3692438821745 5185.9365234375 4.91472864151001 6.0
+588.3896774378154 5168.880859375 4.9137396812438965 6.0
+588.450977802655 5173.83544921875 4.914315223693848 6.0
+588.4714112569054 5174.447265625 4.914798736572266 6.0
+588.4918446109223 5181.01513671875 4.914783954620361 6.0
+588.5122781644677 5182.66455078125 4.914802551269531 6.0
+588.5327116177868 5177.01171875 4.914130210876465 6.0
+588.5531450706403 5175.88330078125 4.913668155670166 6.0
+588.5735785232537 5178.533203125 4.914299964904785 6.0
+588.5940119754086 5170.359375 4.913743495941162 6.0
+588.6144454273308 5180.65185546875 4.914783954620361 6.0
+588.6348788790128 5177.53955078125 4.914548873901367 6.0
+588.6553123300037 5169.955078125 4.914175033569336 6.0
+588.675745880988 5173.67822265625 4.914117336273193 6.0
+588.6961793315131 5172.6025390625 4.913893699645996 6.0
+588.7166126815719 5174.69775390625 4.914468288421631 6.0
+588.7370462313993 5169.25244140625 4.914010047912598 6.0
+588.7574796809859 5178.9296875 4.914429187774658 6.0
+588.7779130301133 5177.1728515625 4.914636135101318 6.0
+588.7983465787693 5171.14306640625 4.913987159729004 6.0
+588.8187799271982 5174.37646484375 4.914244651794434 6.0
+588.839213375395 5177.513671875 4.914368152618408 6.0
+588.859646923127 5176.2265625 4.914748668670654 6.0
+588.8800802706173 5173.24267578125 4.914083003997803 6.0
+588.90051371765 5179.6025390625 4.914937496185303 6.0
+588.9209472642106 5173.4423828125 4.914129257202148 6.0
+588.9413806107768 5167.0634765625 4.913351535797119 6.0
+588.9822476022819 5163.95458984375 4.9126362800598145 6.0
+589.0026809476767 5168.0458984375 4.913275718688965 6.0
+589.0231144926147 5173.0615234375 4.912215709686279 6.0
+589.0435479373118 5170.96435546875 4.912565231323242 6.0
+589.0639812817826 5170.3564453125 4.913437843322754 6.0
+589.0844148255565 5172.1259765625 4.912862777709961 6.0
+589.1048482693295 5164.0849609375 4.912539482116699 6.0
+589.1252817126297 5159.232421875 4.911980628967285 6.0
+589.1457151554714 5168.96875 4.912787914276123 6.0
+589.166148598073 5172.40673828125 4.913596153259277 6.0
+589.1865820402163 5170.16357421875 4.913541316986084 6.0
+589.2070155821275 5168.744140625 4.913049697875977 6.0
+589.2274489238043 5173.81787109375 4.9132843017578125 6.0
+589.247882365009 5168.1025390625 4.91353178024292 6.0
+589.268315905756 5167.2451171875 4.913001537322998 6.0
+589.2887492464943 5156.74560546875 4.9120192527771 6.0
+589.3091827865428 5165.48486328125 4.913351535797119 6.0
+589.3296162263578 5163.119140625 4.913051128387451 6.0
+589.3500495659391 5166.8212890625 4.913491249084473 6.0
+589.3704831050491 5169.60205078125 4.914132118225098 6.0
+589.3909165439327 5166.2685546875 4.913842678070068 6.0
+589.4113498823426 5171.55712890625 4.914066791534424 6.0
+589.4317834205285 5166.50537109375 4.913104057312012 6.0
+589.4522167582472 5163.9150390625 4.913240432739258 6.0
+589.4726501957266 5158.3828125 4.91265869140625 6.0
+589.4930837327483 5163.73779296875 4.912923812866211 6.0
+589.533950505851 5151.7529296875 4.91163444519043 6.0
+589.5543840419414 5158.900390625 4.91240119934082 6.0
+589.5748174775654 5165.87548828125 4.91387939453125 6.0
+589.5952508129485 5160.88134765625 4.913280963897705 6.0
+589.6156843481076 5161.1123046875 4.91304349899292 6.0
+589.6361177828003 5166.06787109375 4.913617134094238 6.0
+589.65655121702 5163.68310546875 4.912991046905518 6.0
+589.6769846510142 5165.0693359375 4.913046360015869 6.0
+589.6974180847756 5161.197265625 4.913434982299805 6.0
+589.7178516180647 5157.73681640625 4.912691593170166 6.0
+589.738284950894 5166.49267578125 4.913085460662842 6.0
+589.7587183834912 5162.4716796875 4.912904739379883 6.0
+589.7791519158491 5163.091796875 4.913191795349121 6.0
+589.799585247747 5161.74560546875 4.913057804107666 6.0
+589.8200186794129 5154.1904296875 4.912729263305664 6.0
+589.8404522106066 5154.87744140625 4.9128217697143555 6.0
+589.8608855415732 5160.22607421875 4.9125165939331055 6.0
+589.9017525023373 5160.9765625 4.912308216094971 6.0
+589.9221858321398 5158.8857421875 4.912129878997803 6.0
+589.9426192617102 5154.9619140625 4.911965370178223 6.0
+589.9630527908084 5165.09716796875 4.91295862197876 6.0
+589.9834861196796 5162.22021484375 4.912746429443359 6.0
+590.0039196480793 5162.36865234375 4.911447525024414 6.0
+590.0243530762527 5153.28125 4.9107489585876465 6.0
+590.0447865041933 5164.7783203125 4.9124979972839355 6.0
+590.0652199316683 5162.39208984375 4.911895751953125 6.0
+590.0856533586702 5155.78564453125 4.91222620010376 6.0
+590.1060867854467 5155.19482421875 4.912009239196777 6.0
+590.126520211983 5159.9248046875 4.9131388664245605 6.0
+590.146953638061 5163.31982421875 4.912836074829102 6.0
+590.1673870636732 5154.951171875 4.911839008331299 6.0
+590.1878204890527 5158.9794921875 4.912928104400635 6.0
+590.208253914192 5164.97412109375 4.912624359130859 6.0
+590.2286872388722 5168.29150390625 4.912903308868408 6.0
+590.2491207633138 5166.09130859375 4.912631511688232 6.0
+590.2695541872963 5160.19873046875 4.91220235824585 6.0
+590.2899875110452 5160.66650390625 4.912790298461914 6.0
+590.3104210343299 5154.64892578125 4.912010192871094 6.0
+590.3308544573738 5151.1845703125 4.9119086265563965 6.0
+590.3717213023046 5162.390625 4.913188457489014 6.0
+590.3921547241916 5158.13916015625 4.912239074707031 6.0
+590.4125882458466 5159.53173828125 4.912611484527588 6.0
+590.4330215672671 5159.5166015625 4.9126296043396 6.0
+590.4534549882155 5159.61572265625 4.912638187408447 6.0
+590.4738885087063 5153.8720703125 4.912121772766113 6.0
+590.4943218289554 5164.2685546875 4.9133148193359375 6.0
+590.514755248747 5158.7783203125 4.912473201751709 6.0
+590.5351887685392 5155.2763671875 4.912099361419678 6.0
+590.555622187625 5155.7333984375 4.912535667419434 6.0
+590.5760555064844 5159.60205078125 4.912857532501221 6.0
+590.5964890251125 5147.6787109375 4.911879062652588 6.0
+590.616922443267 5161.60107421875 4.913268089294434 6.0
+590.6373557611951 5158.83447265625 4.912525653839111 6.0
+590.657789278659 5163.2548828125 4.912978649139404 6.0
+590.6782226956493 5164.08056640625 4.913121700286865 6.0
+590.6986561126469 5151.20068359375 4.911669731140137 6.0
+590.7395229452377 5154.67431640625 4.912280559539795 6.0
+590.7599564610719 5155.0546875 4.912373065948486 6.0
+590.7803897764388 5159.7529296875 4.912418842315674 6.0
+590.8008231915665 5156.43798828125 4.912180423736572 6.0
+590.8212566062357 5161.34716796875 4.9118971824646 6.0
+590.8416900206721 5163.91259765625 4.913017272949219 6.0
+590.8621233348676 5148.46435546875 4.9107842445373535 6.0
+590.8825568483735 5164.06787109375 4.913203716278076 6.0
+590.9029902618786 5144.21533203125 4.911304473876953 6.0
+590.9438570877173 5155.8310546875 4.912548065185547 6.0
+590.9642905000583 5146.927734375 4.9115166664123535 6.0
+590.9847239119263 5153.73291015625 4.911627769470215 6.0
+591.0051573235687 5159.9990234375 4.912235260009766 6.0
+591.0255907349783 5166.65087890625 4.912210941314697 6.0
+591.0460242459158 5162.66552734375 4.912303924560547 6.0
+591.0664575566261 5155.3876953125 4.911426544189453 6.0
+591.0868909668716 5152.93603515625 4.910306453704834 6.0
+591.1073244768777 5153.2216796875 4.910927772521973 6.0
+591.1277578864247 5156.1435546875 4.910858631134033 6.0
+591.148191195738 5165.46923828125 4.9115891456604 6.0
+591.16862470458 5154.8662109375 4.909021854400635 6.0
+591.1890581131956 5161.013671875 4.911838054656982 6.0
+591.2094914215777 5160.89501953125 4.910953998565674 6.0
+591.2299249294883 5156.1845703125 4.910621166229248 6.0
+591.2707916441577 5160.07373046875 4.9118242263793945 6.0
+591.2912251509042 5153.0576171875 4.911211013793945 6.0
+591.3116585574244 5160.2958984375 4.910593509674072 6.0
+591.332091863711 5147.435546875 4.910637855529785 6.0
+591.3525253695261 5149.50927734375 4.910604476928711 6.0
+591.372958775115 5156.025390625 4.91131591796875 6.0
+591.3933922802389 5158.94873046875 4.911455154418945 6.0
+591.4138255851212 5163.8720703125 4.912420749664307 6.0
+591.4342589895459 5149.97900390625 4.911952495574951 6.0
+591.4546924934984 5145.80908203125 4.910834789276123 6.0
+591.4751257974567 5157.0087890625 4.911989688873291 6.0
+591.5159926039778 5155.1015625 4.91138219833374 6.0
+591.5364260067654 5160.7021484375 4.912328720092773 6.0
+591.5568594090946 5151.7568359375 4.911875247955322 6.0
+591.577292811191 5150.7041015625 4.9114990234375 6.0
+591.5977262128145 5165.9091796875 4.91323709487915 6.0
+591.6181596142123 5151.50732421875 4.911537170410156 6.0
+591.6385931153782 5158.37841796875 4.911623954772949 6.0
+591.6590264160695 5151.5361328125 4.911314487457275 6.0
+591.6794598163033 5153.05517578125 4.910478115081787 6.0
+591.6998933162977 5155.94873046875 4.910037040710449 6.0
+591.7407601153682 5167.6748046875 4.911594390869141 6.0
+591.7611935144378 5157.24365234375 4.912292003631592 6.0
+591.7816268130337 5156.50830078125 4.9124603271484375 6.0
+591.8020603114055 5159.74169921875 4.912680149078369 6.0
+591.8224937093037 5157.97021484375 4.9121575355529785 6.0
+591.8429270069755 5155.572265625 4.911384105682373 6.0
+591.8633605041832 5160.96533203125 4.912133693695068 6.0
+591.88379390115 5159.76806640625 4.912148475646973 6.0
+591.9042271976577 5159.0791015625 4.912364959716797 6.0
+591.9246606939341 5161.375 4.912474155426025 6.0
+591.9450940897368 5163.0087890625 4.9129228591918945 6.0
+591.9655274853139 5158.76025390625 4.912851810455322 6.0
+591.9859608806582 5160.29541015625 4.913607120513916 6.0
+592.0063942755296 5151.7841796875 4.911742210388184 6.0
+592.0268276699426 5160.916015625 4.912200927734375 6.0
+592.0472610641227 5148.85498046875 4.911468029022217 6.0
+592.0676944580628 5162.19580078125 4.910940170288086 6.0
+592.0881279515452 5167.47705078125 4.912837505340576 6.0
+592.108561344794 5170.84423828125 4.913293838500977 6.0
+592.1289946375691 5165.4423828125 4.91048526763916 6.0
+592.1494281301202 5159.9619140625 4.910699367523193 6.0
+592.1698615222049 5163.3564453125 4.912231922149658 6.0
+592.1902948140487 5161.10986328125 4.912257194519043 6.0
+592.2107283054356 5161.54541015625 4.912055015563965 6.0
+592.2311615965882 5162.88330078125 4.912811279296875 6.0
+592.2515949872686 5166.82666015625 4.913128852844238 6.0
+592.2924617677127 5164.54638671875 4.912979602813721 6.0
+592.3128951574618 5156.3115234375 4.912868499755859 6.0
+592.333328646986 5171.0712890625 4.914237022399902 6.0
+592.3537619360432 5167.9130859375 4.913768291473389 6.0
+592.3741953246281 5164.05126953125 4.913931846618652 6.0
+592.3946288129882 5153.00634765625 4.912530899047852 6.0
+592.415062101114 5161.3046875 4.913268566131592 6.0
+592.4354955887684 5164.09130859375 4.9131879806518555 6.0
+592.4559289761964 5168.64208984375 4.913722038269043 6.0
+592.4763623631588 5174.8056640625 4.915085315704346 6.0
+592.4967957498811 5171.81884765625 4.914455890655518 6.0
+592.517229136145 5169.20947265625 4.9137420654296875 6.0
+592.5376625221761 5173.705078125 4.914636611938477 6.0
+592.5580959077342 5165.83056640625 4.912550926208496 6.0
+592.5785292930668 5168.6376953125 4.914320468902588 6.0
+592.6193961625613 5175.4130859375 4.914638042449951 6.0
+592.6398294469618 5172.9951171875 4.914786338806152 6.0
+592.6602628308974 5161.5498046875 4.913576126098633 6.0
+592.6806963143608 5174.37451171875 4.914283752441406 6.0
+592.7011295975972 5168.9580078125 4.9137797355651855 6.0
+592.7215630806022 5171.90966796875 4.914280414581299 6.0
+592.7419964631335 5174.91796875 4.913538932800293 6.0
+592.7624297454386 5172.80908203125 4.913783073425293 6.0
+592.7828632272722 5173.19287109375 4.91306209564209 6.0
+592.8032966086466 5174.28857421875 4.913786888122559 6.0
+592.8237298900203 5183.1376953125 4.913755416870117 6.0
+592.8645967513658 5171.75 4.9119133949279785 6.0
+592.8850300313425 5174.330078125 4.912382125854492 6.0
+592.9054635113134 5189.6982421875 4.9145331382751465 6.0
+592.9258967908245 5173.37353515625 4.913606643676758 6.0
+592.9463301698706 5180.97412109375 4.912848949432373 6.0
+592.9667636486847 5169.82763671875 4.913209438323975 6.0
+592.9871969272572 5186.51611328125 4.914456844329834 6.0
+593.007630305372 5189.50537109375 4.915543079376221 6.0
+593.0280637830147 5176.00927734375 4.913806438446045 6.0
+593.048497160431 5170.76220703125 4.913107395172119 6.0
+593.0689305376145 5178.40625 4.914449214935303 6.0
+593.0893639143324 5180.51611328125 4.91402006149292 6.0
+593.1097972908101 5173.30517578125 4.913991451263428 6.0
+593.1302307668302 5184.4189453125 4.914907932281494 6.0
+593.1506640426087 5181.77587890625 4.9151811599731445 6.0
+593.1710974179296 5183.60888671875 4.9143548011779785 6.0
+593.1915308930184 5180.01220703125 4.914916515350342 6.0
+593.21196416764 5169.36376953125 4.913583278656006 6.0
+593.2323975420222 5177.3740234375 4.915006637573242 6.0
+593.2528310159469 5176.40283203125 4.914918899536133 6.0
+593.2732642896299 5184.27099609375 4.915426254272461 6.0
+593.2936976630881 5178.88623046875 4.914312362670898 6.0
+593.3141311360814 5175.1103515625 4.914554119110107 6.0
+593.3549977808943 5183.435546875 4.914399147033691 6.0
+593.3754312529563 5195.16455078125 4.915611743927002 6.0
+593.3958645245439 5182.83447265625 4.914751052856445 6.0
+593.4162979959074 5187.02001953125 4.913654327392578 6.0
+593.4367313668045 5188.779296875 4.914248466491699 6.0
+593.4571647374614 5185.40478515625 4.9140496253967285 6.0
+593.47759810766 5182.9990234375 4.914019584655762 6.0
+593.5184648471186 5179.46630859375 4.913320541381836 6.0
+593.5388982163859 5194.59423828125 4.9145097732543945 6.0
+593.5593315854203 5189.4365234375 4.915205478668213 6.0
+593.579764953749 5182.0849609375 4.914137363433838 6.0
+593.6001983220849 5191.91650390625 4.915335178375244 6.0
+593.6206316899552 5187.07275390625 4.914425373077393 6.0
+593.6410649575846 5187.80224609375 4.914853572845459 6.0
+593.6614984247572 5186.45361328125 4.913913249969482 6.0
+593.6819317914633 5197.4033203125 4.913939476013184 6.0
+593.7023650579358 5193.40234375 4.915677547454834 6.0
+593.7227985241698 5196.39208984375 4.915241718292236 6.0
+593.7432318899446 5197.9140625 4.91568660736084 6.0
+593.76366535548 5200.0556640625 4.915957450866699 6.0
+593.7840986205556 5200.447265625 4.915866374969482 6.0
+593.8045319853991 5197.69921875 4.914592266082764 6.0
+593.8249654500032 5195.3232421875 4.91480827331543 6.0
+593.8453987141474 5201.787109375 4.914092540740967 6.0
+593.8658320778268 5197.37451171875 4.9130377769470215 6.0
+593.8862655412668 5196.00634765625 4.914090633392334 6.0
+593.9066988042468 5194.6298828125 4.914903163909912 6.0
+593.9271321669949 5208.8662109375 4.917051315307617 6.0
+593.9475656295035 5209.99462890625 4.9166669845581055 6.0
+593.967998991553 5191.62890625 4.9133172035217285 6.0
+593.988432253369 5206.57763671875 4.917160987854004 6.0
+594.0088657147135 5199.61474609375 4.915991306304932 6.0
+594.0292990758317 5200.4169921875 4.914104461669922 6.0
+594.0497323364834 5190.08251953125 4.914794921875 6.0
+594.0701657968966 5201.8349609375 4.91576623916626 6.0
+594.0905991568507 5192.13623046875 4.91439962387085 6.0
+594.1110326165654 5203.2451171875 4.916298866271973 6.0
+594.1314658758201 5206.15771484375 4.915820121765137 6.0
+594.1518992348429 5205.69091796875 4.915767669677734 6.0
+594.1723326936335 5209.82373046875 4.917078018188477 6.0
+594.1927659519497 5207.94091796875 4.916359901428223 6.0
+594.2131993100411 5202.80908203125 4.916537761688232 6.0
+594.2336327676603 5210.48291015625 4.917314052581787 6.0
+594.2540660248196 5201.15380859375 4.915289402008057 6.0
+594.2744993817469 5205.78955078125 4.916067600250244 6.0
+594.2949327384413 5215.1533203125 4.91715145111084 6.0
+594.3153660946627 5208.90625 4.916937828063965 6.0
+594.3357994506587 5200.689453125 4.915709018707275 6.0
+594.3562328061817 5213.5439453125 4.917538642883301 6.0
+594.3766661614791 5222.03125 4.9184489250183105 6.0
+594.3970995165437 5225.43115234375 4.9194746017456055 6.0
+594.4175328711426 5216.609375 4.918771743774414 6.0
+594.4379662252686 5217.11865234375 4.918298721313477 6.0
+594.4583996791698 5225.38232421875 4.919777870178223 6.0
+594.4788330328302 5216.62109375 4.918395519256592 6.0
+594.4992662860313 5215.583984375 4.918665885925293 6.0
+594.5196997387684 5217.60595703125 4.918459415435791 6.0
+594.5401330914974 5224.52880859375 4.919104099273682 6.0
+594.5605663435344 5222.9248046875 4.918187618255615 6.0
+594.5809997953402 5218.14013671875 4.91879415512085 6.0
+594.601433146905 5221.958984375 4.91849422454834 6.0
+594.6218663982436 5232.3173828125 4.919556140899658 6.0
+594.6422998488852 5225.0703125 4.918192386627197 6.0
+594.6627331995187 5236.794921875 4.919683933258057 6.0
+594.6831664496931 5228.494140625 4.918280601501465 6.0
+594.7035998994033 5228.71484375 4.918379783630371 6.0
+594.7240332488727 5232.96142578125 4.918675899505615 6.0
+594.7444664981158 5220.87646484375 4.918651103973389 6.0
+594.7648999468947 5225.23583984375 4.919199466705322 6.0
+594.7853332952 5219.19921875 4.918838024139404 6.0
+594.8057667435132 5224.3154296875 4.919143199920654 6.0
+594.8261999911265 5222.51611328125 4.919089317321777 6.0
+594.8466333385004 5223.759765625 4.918827533721924 6.0
+594.8670667856495 5221.412109375 4.918783187866211 6.0
+594.8875000325643 5226.82568359375 4.919483661651611 6.0
+594.907933378774 5220.30517578125 4.918544292449951 6.0
+594.9283668249918 5216.85888671875 4.918885231018066 6.0
+594.9488000707424 5223.982421875 4.919650554656982 6.0
+594.9692334160209 5226.32958984375 4.918749809265137 6.0
+594.9896667610737 5231.10888671875 4.9192352294921875 6.0
+595.0305334502409 5239.5009765625 4.919274806976318 6.0
+595.0509668943632 5230.85009765625 4.919684410095215 6.0
+595.0714001380184 5238.99267578125 4.920252323150635 6.0
+595.0918334812013 5228.724609375 4.918849468231201 6.0
+595.1122669243923 5231.5009765625 4.918755054473877 6.0
+595.1327001668833 5241.01611328125 4.919856548309326 6.0
+595.1531336093685 5241.6748046875 4.919545650482178 6.0
+595.1735669513946 5242.57275390625 4.919527530670166 6.0
+595.1940001929543 5237.39111328125 4.91970682144165 6.0
+595.2144336342753 5243.83544921875 4.9203572273254395 6.0
+595.2348669753701 5239.3115234375 4.920013904571533 6.0
+595.2553002159984 5239.08740234375 4.920042037963867 6.0
+595.2757336561554 5234.890625 4.919470310211182 6.0
+595.296166996086 5238.5068359375 4.919799327850342 6.0
+595.3166003357837 5246.32763671875 4.920218467712402 6.0
+595.3370336750086 5236.8564453125 4.919973850250244 6.0
+595.3574670140079 5234.5830078125 4.919358730316162 6.0
+595.3779003525415 5242.26953125 4.920994281768799 6.0
+595.398333690835 5245.580078125 4.921743392944336 6.0
+595.4187670286701 5238.244140625 4.920260906219482 6.0
+595.4392003662724 5238.14990234375 4.920444488525391 6.0
+595.4596337036346 5237.57080078125 4.920923709869385 6.0
+595.4800670405384 5244.814453125 4.921045303344727 6.0
+595.5005004769773 5233.705078125 4.920153617858887 6.0
+595.5209338131754 5244.05029296875 4.921295166015625 6.0
+595.5413670491471 5245.640625 4.921115875244141 6.0
+595.5618004846474 5239.52294921875 4.919543743133545 6.0
+595.5822338199214 5249.94921875 4.9208903312683105 6.0
+595.602667054729 5231.9765625 4.920292854309082 6.0
+595.6231004893052 5234.8115234375 4.920343399047852 6.0
+595.6435338234078 5239.19140625 4.919647216796875 6.0
+595.663967057284 5244.8076171875 4.920919418334961 6.0
+595.6844004909217 5250.27880859375 4.921266078948975 6.0
+595.7048337238666 5231.9638671875 4.9197163581848145 6.0
+595.7252670568123 5247.970703125 4.921103477478027 6.0
+595.7457004892931 5235.22998046875 4.920041561126709 6.0
+595.7661337215322 5255.41064453125 4.9220991134643555 6.0
+595.7865670533138 5244.00537109375 4.921088218688965 6.0
+595.8070004846231 5236.7001953125 4.920076370239258 6.0
+595.8274337159382 5249.2001953125 4.920992851257324 6.0
+595.8478671465564 5247.609375 4.921167373657227 6.0
+595.8683004771738 5237.26806640625 4.920407295227051 6.0
+595.8887338073182 5239.11279296875 4.920083045959473 6.0
+595.9091671370043 5243.2685546875 4.919872760772705 6.0
+595.9296004664502 5240.2978515625 4.920063018798828 6.0
+595.9500337954378 5255.26025390625 4.921744346618652 6.0
+595.9704671241925 5244.48388671875 4.920816898345947 6.0
+595.9909004527144 5245.92724609375 4.920968055725098 6.0
+596.0113337807634 5248.78125 4.921191692352295 6.0
+596.0317672085876 5238.509765625 4.920320510864258 6.0
+596.0522004359373 5241.7724609375 4.9208197593688965 6.0
+596.0726337630622 5248.60546875 4.9215874671936035 6.0
+596.0930671897222 5244.55908203125 4.921228408813477 6.0
+596.1135004161479 5243.71240234375 4.920583248138428 6.0
+596.1339337421014 5250.818359375 4.92168664932251 6.0
+596.1543671678301 5246.89501953125 4.920868873596191 6.0
+596.1748003933171 5228.36474609375 4.920337200164795 6.0
+596.1952338183473 5246.56884765625 4.921230316162109 6.0
+596.2156671429111 5240.572265625 4.921618938446045 6.0
+596.2361003672413 5251.79443359375 4.921298503875732 6.0
+596.2565337913329 5247.62109375 4.920624256134033 6.0
+596.2769671149654 5244.30126953125 4.920635223388672 6.0
+596.297400338357 5263.7626953125 4.9220452308654785 6.0
+596.3382666839898 5240.0693359375 4.920313835144043 6.0
+596.3587000062253 5247.47265625 4.9211649894714355 6.0
+596.3791333282206 5248.9609375 4.920212268829346 6.0
+596.3995666499904 5255.3779296875 4.9219536781311035 6.0
+596.4199999712946 5241.7958984375 4.92087459564209 6.0
+596.4404332921258 5244.44580078125 4.919447422027588 6.0
+596.4608666127315 5259.44384765625 4.92005729675293 6.0
+596.501733353005 5248.265625 4.921254634857178 6.0
+596.542599991888 5250.82666015625 4.921731948852539 6.0
+596.5630333108566 5248.6484375 4.920712947845459 6.0
+596.5834665295988 5250.06689453125 4.921168804168701 6.0
+596.6038999478769 5245.58251953125 4.920769214630127 6.0
+596.6243332656813 5244.7255859375 4.920411586761475 6.0
+596.6447664832594 5240.6083984375 4.91968297958374 6.0
+596.6651999006062 5273.60205078125 4.923072814941406 6.0
+596.6856332174793 5245.70751953125 4.920841217041016 6.0
+596.7060664338933 5263.94921875 4.922101974487305 6.0
+596.7469331660177 5257.5390625 4.921647071838379 6.0
+596.7673664817339 5258.63818359375 4.921827793121338 6.0
+596.7877997969845 5248.78759765625 4.920949935913086 6.0
+596.8082331117621 5255.6083984375 4.922127723693848 6.0
+596.8286664263142 5249.01953125 4.919557571411133 6.0
+596.8490997404006 5249.06298828125 4.9205756187438965 6.0
+596.8695330544797 5248.9443359375 4.92025899887085 6.0
+596.8899663678676 5253.50537109375 4.9208526611328125 6.0
+596.9103996810227 5252.4931640625 4.920842170715332 6.0
+596.9308329939377 5238.4130859375 4.919338703155518 6.0
+596.9512663063942 5237.95849609375 4.91912841796875 6.0
+596.971699618618 5239.96337890625 4.9184889793396 6.0
+596.9921329303688 5245.2861328125 4.919281482696533 6.0
+597.0125663418949 5255.47802734375 4.921205043792725 6.0
+597.0329995531865 5239.3701171875 4.919894218444824 6.0
+597.053432864006 5248.9267578125 4.921261310577393 6.0
+597.0738662743679 5260.5869140625 4.921983242034912 6.0
+597.0942994844954 5250.6796875 4.921536445617676 6.0
+597.1147327943836 5248.83251953125 4.921031475067139 6.0
+597.1351662038142 5248.220703125 4.920359134674072 6.0
+597.1555994130103 5250.013671875 4.921167373657227 6.0
+597.1760327217344 5241.91748046875 4.92003059387207 6.0
+597.1964661302336 5240.45263671875 4.920102119445801 6.0
+597.2168993382656 5249.40771484375 4.920137882232666 6.0
+597.2373327460591 5244.72119140625 4.920752048492432 6.0
+597.2577660536263 5249.6083984375 4.920245170593262 6.0
+597.278199260727 5245.50439453125 4.920792102813721 6.0
+597.2986326673563 5238.66650390625 4.920619487762451 6.0
+597.3190659739921 5239.66015625 4.919766902923584 6.0
+597.3394992799294 5248.27197265625 4.9213547706604 6.0
+597.3599325858595 5239.9794921875 4.9204840660095215 6.0
+597.3803658910983 5248.671875 4.920623779296875 6.0
+597.4007991963299 5245.4619140625 4.920133113861084 6.0
+597.4212326011038 5236.126953125 4.920116901397705 6.0
+597.4620991094853 5245.89404296875 4.920842170715332 6.0
+597.4825325130878 5243.443359375 4.919976234436035 6.0
+597.502965716696 5236.95361328125 4.920370101928711 6.0
+597.5233990195993 5251.0869140625 4.9211273193359375 6.0
+597.543832322277 5233.1181640625 4.92031192779541 6.0
+597.5642656247219 5250.83740234375 4.921954154968262 6.0
+597.5846989267011 5241.57373046875 4.920907974243164 6.0
+597.6051322284402 5242.13623046875 4.9198126792907715 6.0
+597.6255655299537 5236.32861328125 4.91994047164917 6.0
+597.6459989309951 5235.41650390625 4.920236587524414 6.0
+597.6664321315766 5239.5654296875 4.920539855957031 6.0
+597.686865431926 5244.7744140625 4.920773029327393 6.0
+597.707298832036 5235.7470703125 4.919373989105225 6.0
+597.7277320316862 5238.32958984375 4.919692039489746 6.0
+597.7481653311042 5239.5830078125 4.919715881347656 6.0
+597.7685987300501 5248.29541015625 4.9213480949401855 6.0
+597.789031928769 5246.9658203125 4.920355319976807 6.0
+597.8094652270229 5240.2978515625 4.919979095458984 6.0
+597.8298986250375 5240.18701171875 4.920533180236816 6.0
+597.8503319228257 5246.15283203125 4.920632839202881 6.0
+597.8707651201476 5240.09521484375 4.919170379638672 6.0
+597.891198516998 5246.62353515625 4.919471740722656 6.0
+597.9116318136221 5242.22998046875 4.919509410858154 6.0
+597.9320650100126 5233.52978515625 4.918886661529541 6.0
+597.9524984059317 5242.46337890625 4.919808387756348 6.0
+597.9729317016245 5233.68798828125 4.919205188751221 6.0
+598.0137982918386 5241.37646484375 4.918662071228027 6.0
+598.0342315866001 5241.96484375 4.921136379241943 6.0
+598.0546649808966 5231.1064453125 4.9186553955078125 6.0
+598.0750981747187 5234.12841796875 4.91865873336792 6.0
+598.0955314685489 5240.5947265625 4.918428897857666 6.0
+598.1159648616813 5231.89208984375 4.917969226837158 6.0
+598.136398054572 5228.78857421875 4.918558120727539 6.0
+598.156831347238 5226.6826171875 4.917277812957764 6.0
+598.1772646396712 5241.9658203125 4.916983127593994 6.0
+598.1976979313986 5226.791015625 4.914633274078369 6.0
+598.2181312231332 5234.791015625 4.916275501251221 6.0
+598.2385645144022 5218.2978515625 4.915135860443115 6.0
+598.2794310960016 5236.716796875 4.908336162567139 6.0
+599.219340700547 5190.67431640625 4.87194299697876 6.0
+599.2397738752843 5190.36669921875 4.878612041473389 6.0
+599.260207249783 5201.26025390625 4.879832744598389 6.0
+599.2806405238225 5191.47265625 4.882185459136963 6.0
+599.3010736976285 5198.1884765625 4.883656024932861 6.0
+599.3215070711958 5196.841796875 4.887734413146973 6.0
+599.341940344304 5206.93017578125 4.888411998748779 6.0
+599.3623736171794 5203.14697265625 4.888504981994629 6.0
+599.3828068895818 5205.86083984375 4.890781879425049 6.0
+599.4032401617587 5202.818359375 4.891911029815674 6.0
+599.42367343347 5206.275390625 4.892914772033691 6.0
+599.4441067049411 5209.12939453125 4.895466327667236 6.0
+599.4645399761866 5198.16845703125 4.896428108215332 6.0
+599.4849732469665 5205.9365234375 4.897363662719727 6.0
+599.5054065172735 5201.4384765625 4.897735118865967 6.0
+599.5258397875878 5204.95654296875 4.900582313537598 6.0
+599.5462731572043 5208.2529296875 4.901240348815918 6.0
+599.5667064268127 5201.5556640625 4.90207576751709 6.0
+599.5871395959621 5210.5390625 4.903611660003662 6.0
+599.60757296464 5201.97412109375 4.903750419616699 6.0
+599.6280062330916 5200.28369140625 4.9038190841674805 6.0
+599.6484394013096 5198.708984375 4.904960632324219 6.0
+599.6688727690635 5207.24755859375 4.906466007232666 6.0
+599.6893060363436 5201.70947265625 4.906338691711426 6.0
+599.7097392036303 5213.978515625 4.909002780914307 6.0
+599.7301725704456 5206.92138671875 4.908478260040283 6.0
+599.7506058368017 5203.0205078125 4.90859842300415 6.0
+599.7710390029242 5203.6650390625 4.909362316131592 6.0
+599.7914723685826 5203.54345703125 4.910003185272217 6.0
+599.811905634233 5213.810546875 4.911778926849365 6.0
+599.8323388991921 5202.2197265625 4.910661697387695 6.0
+599.8527721639111 5204.302734375 4.9105939865112305 6.0
+599.8732053284039 5203.83154296875 4.910882472991943 6.0
+599.8936386924324 5197.54248046875 4.910372734069824 6.0
+599.9140719562274 5192.49609375 4.911567687988281 6.0
+599.9345052197823 5211.08349609375 4.913595199584961 6.0
+599.9549384828788 5204.4501953125 4.912562847137451 6.0
+599.9753717455023 5205.41650390625 4.913586139678955 6.0
+599.9958050081332 5198.42333984375 4.913614749908447 6.0
+600.0162383700663 5199.6708984375 4.912402629852295 6.0
+600.0366715319979 5201.55712890625 4.914050102233887 6.0
+600.0571047932244 5196.31201171875 4.9131760597229 6.0
+600.077538154459 5205.21923828125 4.91463041305542 6.0
+600.0979713152192 5202.29150390625 4.913375377655029 6.0
+600.1184045755217 5201.689453125 4.914929389953613 6.0
+600.1592710954283 5206.15478515625 4.9147796630859375 6.0
+600.1797043547922 5200.3271484375 4.915216445922852 6.0
+600.2001377139313 5199.35498046875 4.915586948394775 6.0
+600.2205708728288 5200.23291015625 4.915921688079834 6.0
+600.2410042312695 5199.21533203125 4.915952682495117 6.0
+600.2614374892437 5197.06982421875 4.915618419647217 6.0
+600.2818706469843 5201.419921875 4.915222644805908 6.0
+600.3023040044864 5200.5185546875 4.915663719177246 6.0
+600.3227372615293 5201.97705078125 4.915388107299805 6.0
+600.3431704183313 5196.55810546875 4.9145708084106445 6.0
+600.3636037746764 5207.306640625 4.91498327255249 6.0
+600.384037030788 5204.2001953125 4.915463447570801 6.0
+600.4044702866595 5196.06396484375 4.914130210876465 6.0
+600.4249035420726 5200.197265625 4.915092468261719 6.0
+600.44533679702 5200.50439453125 4.913792610168457 6.0
+600.4657700517273 5193.52490234375 4.91446590423584 6.0
+600.4862034062098 5198.27734375 4.915438175201416 6.0
+600.5066365602252 5195.4453125 4.915420055389404 6.0
+600.5270698140012 5193.2314453125 4.915735244750977 6.0
+600.5475030675516 5198.193359375 4.915581226348877 6.0
+600.5679363206364 5194.29541015625 4.91571569442749 6.0
+600.6088028258673 5198.88916015625 4.916317462921143 6.0
+600.6292360777879 5193.177734375 4.915657997131348 6.0
+600.649669429702 5195.677734375 4.915101051330566 6.0
+600.6701025811562 5199.18212890625 4.91684627532959 6.0
+600.6905358321455 5191.97705078125 4.915043354034424 6.0
+600.7109691828955 5194.78369140625 4.916215419769287 6.0
+600.7518355834763 5230.79248046875 4.921787738800049 6.0
+600.7722689330622 5205.03515625 4.916787624359131 6.0
+600.7927020826537 5199.42333984375 4.916476726531982 6.0
+600.8131353317804 5188.27001953125 4.915772914886475 6.0
+600.8335686804348 5198.9189453125 4.916775703430176 6.0
+600.854001928863 5190.30322265625 4.916046619415283 6.0
+600.8744351768255 5203.126953125 4.918562889099121 6.0
+600.8948684247807 5189.6279296875 4.915526866912842 6.0
+600.9153016720447 5184.263671875 4.9155659675598145 6.0
+600.9357349193087 5193.41845703125 4.915900707244873 6.0
+600.956168165867 5199.80224609375 4.916234493255615 6.0
+600.9766014124325 5191.72412109375 4.915469169616699 6.0
+600.9970347585331 5198.068359375 4.916333198547363 6.0
+601.0174679041593 5197.857421875 4.916826248168945 6.0
+601.0379011497935 5196.84228515625 4.914971351623535 6.0
+601.0583344947227 5185.12255859375 4.914796829223633 6.0
+601.0787676396576 5190.70947265625 4.914360523223877 6.0
+601.0992008838948 5186.1123046875 4.91455078125 6.0
+601.1196342281328 5184.40576171875 4.9145331382751465 6.0
+601.1400673718963 5190.6669921875 4.9138407707214355 6.0
+601.1605006152022 5185.20361328125 4.914051055908203 6.0
+601.1809339582687 5188.123046875 4.9152703285217285 6.0
+601.2013671011082 5194.1875 4.915530204772949 6.0
+601.2218003434828 5192.642578125 4.916494369506836 6.0
+601.2626668275261 5192.1826171875 4.915419101715088 6.0
+601.2831001689701 5194.59814453125 4.915404796600342 6.0
+601.3035333099469 5185.99951171875 4.915116310119629 6.0
+601.3443998911971 5186.93310546875 4.9133219718933105 6.0
+601.3648330312426 5189.9521484375 4.914468288421631 6.0
+601.3852662710487 5179.89013671875 4.913662433624268 6.0
+601.4056996106301 5190.77783203125 4.914097785949707 6.0
+601.4261328497378 5197.72509765625 4.914726257324219 6.0
+601.4465659883863 5170.330078125 4.913254737854004 6.0
+601.4669993268035 5174.716796875 4.913224220275879 6.0
+601.4874325649871 5185.7880859375 4.91470193862915 6.0
+601.507865702697 5179.552734375 4.9142165184021 6.0
+601.5282990401829 5190.59814453125 4.9147748947143555 6.0
+601.5487322774279 5190.98779296875 4.915097236633301 6.0
+601.5691654142138 5184.96044921875 4.914609909057617 6.0
+601.5895987505355 5186.0205078125 4.914668560028076 6.0
+601.6100319868492 5187.693359375 4.914400577545166 6.0
+601.6304653224724 5182.33056640625 4.914520740509033 6.0
+601.6508984580942 5182.5673828125 4.913881778717041 6.0
+601.6713316932437 5192.7275390625 4.915083408355713 6.0
+601.6917650279356 5184.138671875 4.913689136505127 6.0
+601.7121981623932 5184.8349609375 4.9139556884765625 6.0
+601.7326313966114 5181.4365234375 4.914644718170166 6.0
+601.753064730372 5175.78662109375 4.913652420043945 6.0
+601.7734978638982 5182.16162109375 4.913733005523682 6.0
+601.8143644297816 5180.8642578125 4.913653373718262 6.0
+601.8347975623765 5188.685546875 4.9146647453308105 6.0
+601.8552307944992 5191.48291015625 4.914628505706787 6.0
+601.8756640261636 5188.5556640625 4.913681983947754 6.0
+601.8960972578279 5188.1640625 4.914058208465576 6.0
+601.9165304887865 5180.87841796875 4.913954734802246 6.0
+601.9369638197531 5196.50830078125 4.917273044586182 6.0
+601.9573969502526 5179.2626953125 4.9123311042785645 6.0
+601.9778302802806 5179.2705078125 4.912543773651123 6.0
+601.9982635100823 5181.04833984375 4.913392543792725 6.0
+602.0186966396504 5182.60107421875 4.91341495513916 6.0
+602.0391299687471 5177.77392578125 4.913311958312988 6.0
+602.0595631976175 5184.4375 4.912532806396484 6.0
+602.0799963262543 5178.51708984375 4.910798072814941 6.0
+602.1004296544197 5180.263671875 4.913684844970703 6.0
+602.120862882126 5183.0380859375 4.914535045623779 6.0
+602.1412960095986 5178.92431640625 4.911932945251465 6.0
+602.1617293368327 5178.125 4.911229610443115 6.0
+602.1821625638404 5190.73779296875 4.914561748504639 6.0
+602.2025956901489 5173.2626953125 4.912982940673828 6.0
+602.2230290164516 5183.57421875 4.913796901702881 6.0
+602.2434622422952 5170.53369140625 4.913421154022217 6.0
+602.263895467906 5171.703125 4.913365840911865 6.0
+602.2843286930438 5166.90966796875 4.9107184410095215 6.0
+602.3047619179561 5163.1220703125 4.910097122192383 6.0
+602.3251952424034 5189.408203125 4.91546106338501 6.0
+602.3456283666092 5177.501953125 4.912059783935547 6.0
+602.3660615905901 5168.33642578125 4.91089391708374 6.0
+602.3864949140989 5175.38623046875 4.911983966827393 6.0
+602.4069281371485 5173.0283203125 4.911760330200195 6.0
+602.4273612601974 5168.43994140625 4.91071891784668 6.0
+602.4477945827821 5171.72705078125 4.911169528961182 6.0
+602.4682278048931 5164.68603515625 4.910879135131836 6.0
+602.4886609267778 5171.76318359375 4.911367416381836 6.0
+602.5090942484239 5171.244140625 4.911059379577637 6.0
+602.5295274696109 5170.033203125 4.91074275970459 6.0
+602.5499605905643 5171.39599609375 4.910987854003906 6.0
+602.5703939110535 5165.85595703125 4.9101176261901855 6.0
+602.5908271313019 5168.2041015625 4.911059379577637 6.0
+602.6112602510912 5170.28515625 4.910763263702393 6.0
+602.6316935708746 5162.32958984375 4.910026550292969 6.0
+602.6521266899654 5164.41845703125 4.9102888107299805 6.0
+602.6725600088248 5170.45849609375 4.910645961761475 6.0
+602.6929932274506 5164.39697265625 4.909563064575195 6.0
+602.7134263458356 5154.73828125 4.909369468688965 6.0
+602.7338596637637 5176.15380859375 4.910322666168213 6.0
+602.7542928812181 5168.287109375 4.909929275512695 6.0
+602.774726098447 5167.54052734375 4.910131454467773 6.0
+602.795159315443 5166.67333984375 4.910655975341797 6.0
+602.8155925322062 5163.37158203125 4.910909175872803 6.0
+602.8360257484965 5166.63330078125 4.91086483001709 6.0
+602.8564589643283 5160.88671875 4.9098219871521 6.0
+602.8768921799201 5167.24853515625 4.910575866699219 6.0
+602.8973253952863 5166.46240234375 4.9103684425354 6.0
+602.9177587101876 5163.98583984375 4.909863471984863 6.0
+602.9381918248546 5168.423828125 4.90984582901001 6.0
+602.9586250390494 5169.2421875 4.910364151000977 6.0
+602.9790583530194 5154.3212890625 4.908797264099121 6.0
+603.0199246800184 5150.20751953125 4.90898323059082 6.0
+603.0403579930571 5171.10986328125 4.9105916023254395 6.0
+603.0607911056286 5163.0029296875 4.908552646636963 6.0
+603.0812244179615 5162.36767578125 4.908491134643555 6.0
+603.1016576300681 5162.82177734375 4.9115424156188965 6.0
+603.122090741701 5161.51318359375 4.909358978271484 6.0
+603.142524052877 5159.59814453125 4.909252166748047 6.0
+603.1629572640522 5159.77587890625 4.9097580909729 6.0
+603.1833903747611 5162.38037109375 4.909332275390625 6.0
+603.2038236849985 5156.7353515625 4.90841817855835 6.0
+603.2242568950096 5163.01513671875 4.9093499183654785 6.0
+603.2446900047798 5164.69482421875 4.911441326141357 6.0
+603.2651233140932 5166.67236328125 4.909684658050537 6.0
+603.285556523173 5167.0048828125 4.912543773651123 6.0
+603.3059896317864 5162.51416015625 4.909510135650635 6.0
+603.3264229401611 5169.56396484375 4.910970211029053 6.0
+603.3468561483096 5163.6455078125 4.912566184997559 6.0
+603.3672892559844 5158.36376953125 4.911705493927002 6.0
+603.3877225632023 5157.07373046875 4.909017086029053 6.0
+603.4081557704194 5154.43310546875 4.9086151123046875 6.0
+603.4285889771636 5157.9580078125 4.909014701843262 6.0
+603.4490221834494 5157.32177734375 4.908681392669678 6.0
+603.4694553895024 5160.802734375 4.908999443054199 6.0
+603.489888695316 5156.75048828125 4.909154415130615 6.0
+603.5103218006698 5156.52099609375 4.909806251525879 6.0
+603.5307550057914 5152.4951171875 4.908986568450928 6.0
+603.5511883104409 5154.5791015625 4.91098165512085 6.0
+603.5716214148633 5161.9345703125 4.910308361053467 6.0
+603.5920546190537 5168.4951171875 4.91353702545166 6.0
+603.6124879227718 5152.40234375 4.908947467803955 6.0
+603.6329210262629 5170.8544921875 4.9110517501831055 6.0
+603.6533542292891 5162.51806640625 4.912878513336182 6.0
+603.673787532076 5161.49609375 4.913030624389648 6.0
+603.6942206346357 5161.3876953125 4.910166263580322 6.0
+603.7146538367306 5160.82958984375 4.91025447845459 6.0
+603.7350871385861 5155.4501953125 4.908638000488281 6.0
+603.7555203399825 5156.25830078125 4.910195350646973 6.0
+603.775953541146 5157.83544921875 4.912008762359619 6.0
+603.7963867418366 5161.4111328125 4.912145614624023 6.0
+603.8168199425345 5156.3818359375 4.9081830978393555 6.0
+603.8372531425339 5155.392578125 4.9086384773254395 6.0
+603.8576863422932 5161.76416015625 4.911375045776367 6.0
+603.8781195418269 5154.90185546875 4.908769607543945 6.0
+603.8985527411278 5157.408203125 4.910933017730713 6.0
+603.9189859399557 5157.1650390625 4.909609794616699 6.0
+603.9394190383246 5159.001953125 4.911140441894531 6.0
+603.9802855345915 5155.7255859375 4.911983013153076 6.0
+604.000718632029 5159.82470703125 4.912762641906738 6.0
+604.0211519292352 5161.7666015625 4.911250114440918 6.0
+604.0415851259677 5160.8447265625 4.912111759185791 6.0
+604.0620182227067 5161.12646484375 4.910722255706787 6.0
+604.0824515187414 5157.1171875 4.908187389373779 6.0
+604.1028847147827 5154.47705078125 4.908620357513428 6.0
+604.1233179103583 5163.2216796875 4.910750865936279 6.0
+604.1437511054683 5154.78466796875 4.910900115966797 6.0
+604.1641843003381 5159.51025390625 4.912436008453369 6.0
+604.1846175949831 5151.09619140625 4.911342144012451 6.0
+604.2050506893866 5146.4345703125 4.909006118774414 6.0
+604.2459171768132 5156.6748046875 4.912317276000977 6.0
+604.2663502700598 5157.72998046875 4.912209987640381 6.0
+604.286783463067 5146.361328125 4.908841609954834 6.0
+604.3072167556165 5153.611328125 4.910449504852295 6.0
+604.3480830400076 5150.78271484375 4.911608695983887 6.0
+604.3889495227704 5150.330078125 4.911892890930176 6.0
+604.4093826139215 5164.57470703125 4.912339687347412 6.0
+604.4298159043756 5167.0703125 4.912314414978027 6.0
+604.4502490948216 5157.45361328125 4.911068439483643 6.0
+604.4706821848085 5163.2880859375 4.911613464355469 6.0
+604.4911154745641 5155.90625 4.910940647125244 6.0
+604.511548663846 5156.0712890625 4.910750865936279 6.0
+604.5319819529032 5153.1962890625 4.9104485511779785 6.0
+604.5524150414931 5159.767578125 4.911316394805908 6.0
+604.5728482298437 5166.12109375 4.91254997253418 6.0
+604.5932814179687 5169.01025390625 4.912564754486084 6.0
+604.613714605628 5151.57177734375 4.910829067230225 6.0
+604.6341477930473 5156.2275390625 4.911533355712891 6.0
+604.6545809800082 5154.3017578125 4.910655975341797 6.0
+604.6750141667362 5157.572265625 4.9100542068481445 6.0
+604.6954473532242 5158.2421875 4.910375595092773 6.0
+604.7158805392537 5154.201171875 4.910880088806152 6.0
+604.7363137250504 5158.2685546875 4.911025047302246 6.0
+604.7567469103742 5160.845703125 4.911981582641602 6.0
+604.7771801954732 5159.533203125 4.911707401275635 6.0
+604.7976132803378 5163.44091796875 4.910806179046631 6.0
+604.8180464647303 5153.7626953125 4.910848140716553 6.0
+604.838479748898 5159.732421875 4.912290096282959 6.0
+604.8589128325984 5158.18994140625 4.911682605743408 6.0
+604.9202123820651 5162.8642578125 4.912311553955078 6.0
+604.9406456645956 5166.60693359375 4.91273307800293 6.0
+604.9815119285049 5155.087890625 4.911586284637451 6.0
+605.0019452101042 5158.2607421875 4.911381721496582 6.0
+605.0428114721508 5164.046875 4.912069320678711 6.0
+605.0632447525859 5157.2080078125 4.9113688468933105 6.0
+605.0836779327947 5186.13134765625 4.914365768432617 6.0
+605.1041110127699 5163.5048828125 4.912294387817383 6.0
+605.1245442922736 5153.724609375 4.9118804931640625 6.0
+605.1449774715511 5159.1142578125 4.9124579429626465 6.0
+605.1654106503629 5162.26708984375 4.91269063949585 6.0
+605.1858438289346 5162.44970703125 4.91256856918335 6.0
+605.2062770072807 5157.84765625 4.911881923675537 6.0
+605.2267101851612 5170.60107421875 4.913296699523926 6.0
+605.2471434628023 5163.72021484375 4.912371635437012 6.0
+605.2675765399836 5154.94287109375 4.912044525146484 6.0
+605.2880097169327 5163.2841796875 4.912888526916504 6.0
+605.3084428936418 5170.1162109375 4.911890029907227 6.0
+605.3288760698924 5172.89501953125 4.912120819091797 6.0
+605.349309345911 5167.2392578125 4.91058349609375 6.0
+605.3697424214552 5172.763671875 4.911202907562256 6.0
+605.3901755967745 5160.6650390625 4.91106653213501 6.0
+605.4106088718545 5181.189453125 4.914151191711426 6.0
+605.4310419464746 5158.8017578125 4.912103652954102 6.0
+605.4514751208626 5163.150390625 4.9122796058654785 6.0
+605.4719083947857 5153.53271484375 4.911818981170654 6.0
+605.4923414684672 5159.27197265625 4.9116740226745605 6.0
+605.5127746419239 5167.68603515625 4.912473678588867 6.0
+605.5332079149084 5160.4912109375 4.912148952484131 6.0
+605.5536409876659 5167.876953125 4.912430763244629 6.0
+605.5740741599584 5159.0146484375 4.912106990814209 6.0
+605.5945074320189 5168.2080078125 4.912888050079346 6.0
+605.6149406038385 5165.36181640625 4.913334369659424 6.0
+605.6353736751989 5165.4091796875 4.912996768951416 6.0
+605.6558069463208 5160.3203125 4.912919521331787 6.0
+605.6762401172164 5155.56103515625 4.913011074066162 6.0
+605.6966732876463 5166.4384765625 4.913527965545654 6.0
+605.7171064576105 5160.88232421875 4.912878513336182 6.0
+605.7375396275675 5154.58447265625 4.9127302169799805 6.0
+605.757972896834 5159.98583984375 4.913193702697754 6.0
+605.7784059660917 5172.3310546875 4.914294242858887 6.0
+605.8192724034598 5167.1611328125 4.914077281951904 6.0
+605.8397054715606 5158.7939453125 4.912835121154785 6.0
+605.8601386394221 5167.3017578125 4.913754463195801 6.0
+605.8805719068259 5172.51806640625 4.914193630218506 6.0
+605.901004974221 5172.48193359375 4.913265228271484 6.0
+605.9214381409256 5172.150390625 4.912917613983154 6.0
+605.9623044736363 5178.072265625 4.914757251739502 6.0
+605.9827376396352 5169.0673828125 4.913381099700928 6.0
+606.0031708051756 5175.0361328125 4.9140214920043945 6.0
+606.023603970476 5163.681640625 4.913237571716309 6.0
+606.0440371353179 5173.595703125 4.914096355438232 6.0
+606.064470299927 5169.25 4.913736820220947 6.0
+606.0849034643034 5166.68701171875 4.913924217224121 6.0
+606.1053367282075 5173.01123046875 4.914044380187988 6.0
+606.1257697918845 5179.7763671875 4.914590835571289 6.0
+606.1462029550894 5172.51220703125 4.913842678070068 6.0
+606.1666362180695 5180.30859375 4.914278507232666 6.0
+606.187069380816 5177.7763671875 4.914222240447998 6.0
+606.2075024430887 5170.1943359375 4.913749694824219 6.0
+606.2279357051375 5175.31103515625 4.914403915405273 6.0
+606.2483688667198 5178.361328125 4.914708614349365 6.0
+606.2688019282941 5175.64111328125 4.914468765258789 6.0
+606.2892351891787 5178.48486328125 4.915092468261719 6.0
+606.3096683500626 5184.52392578125 4.915490627288818 6.0
+606.3301014102399 5182.4453125 4.914966583251953 6.0
+606.350534670426 5174.015625 4.91452169418335 6.0
+606.3709678301457 5188.87548828125 4.9156718254089355 6.0
+606.3914008896245 5179.16943359375 4.914564609527588 6.0
+606.4118341486464 5187.3447265625 4.914550304412842 6.0
+606.4322673074348 5184.58154296875 4.915150165557861 6.0
+606.4527005659838 5183.912109375 4.91521692276001 6.0
+606.473133624073 5183.060546875 4.915537357330322 6.0
+606.49356678193 5182.38720703125 4.914947509765625 6.0
+606.5140000393149 5181.07568359375 4.915637493133545 6.0
+606.5548662533984 5182.6962890625 4.914961814880371 6.0
+606.5752995098519 5189.73291015625 4.916109561920166 6.0
+606.5957325660784 5185.12158203125 4.915546894073486 6.0
+606.6161657218399 5186.95263671875 4.916322708129883 6.0
+606.6365988773614 5196.1787109375 4.916618347167969 6.0
+606.6570320326573 5192.27001953125 4.91643762588501 6.0
+606.6774651874875 5191.25634765625 4.916085720062256 6.0
+606.6978984420784 5176.3193359375 4.915107727050781 6.0
+606.7183314964423 5192.4033203125 4.916383743286133 6.0
+606.7387646503412 5204.5146484375 4.917725086212158 6.0
+606.7591979037679 5190.29931640625 4.916648864746094 6.0
+606.7796309572004 5187.53857421875 4.916397571563721 6.0
+606.800064110168 5198.244140625 4.917601585388184 6.0
+606.8204973626634 5202.6103515625 4.9179863929748535 6.0
+606.8409304151646 5196.82861328125 4.917553424835205 6.0
+606.8613636669616 5189.50341796875 4.916383743286133 6.0
+606.881796818765 5196.49951171875 4.917196750640869 6.0
+606.902229870102 5197.59375 4.917160511016846 6.0
+606.9226631209749 5204.05126953125 4.917334079742432 6.0
+606.9430962718397 5199.23681640625 4.917508602142334 6.0
+606.9635293222454 5193.42822265625 4.917051792144775 6.0
+606.9839625721797 5200.77001953125 4.9170823097229 6.0
+607.0043957218877 5188.4072265625 4.915483474731445 6.0
+607.0248288713628 5197.57275390625 4.916095733642578 6.0
+607.0452620203723 5191.623046875 4.9146037101745605 6.0
+607.0656951691417 5200.87158203125 4.916395664215088 6.0
+607.0861283176855 5192.1591796875 4.91602087020874 6.0
+607.1065614657564 5199.2783203125 4.917181015014648 6.0
+607.1269946136017 5203.71240234375 4.917621612548828 6.0
+607.1474277609814 5197.4267578125 4.916329860687256 6.0
+607.1882940550349 5206.9326171875 4.917992115020752 6.0
+607.2495934936742 5200.8623046875 4.917090892791748 6.0
+607.270026739192 5198.84423828125 4.916585922241211 6.0
+607.2904597844754 5207.35107421875 4.916930198669434 6.0
+607.3108929292866 5212.30712890625 4.918039321899414 6.0
+607.3313261738731 5210.93603515625 4.917626857757568 6.0
+607.3517593182187 5210.48876953125 4.917856216430664 6.0
+607.3721923621051 5207.5478515625 4.918003082275391 6.0
+607.3926256057603 5209.7373046875 4.9180684089660645 6.0
+607.4130586489482 5218.86572265625 4.919050693511963 6.0
+607.4334917918968 5216.95947265625 4.9187798500061035 6.0
+607.4539250346206 5213.9443359375 4.91813325881958 6.0
+607.47435807687 5212.2705078125 4.918136119842529 6.0
+607.4947912188945 5220.056640625 4.918812274932861 6.0
+607.515224460687 5221.89111328125 4.918482780456543 6.0
+607.5356576020058 5223.00146484375 4.919031620025635 6.0
+607.5560906430983 5224.193359375 4.9190802574157715 6.0
+607.5765238837266 5221.32568359375 4.918696403503418 6.0
+607.5969570241141 5220.41259765625 4.918095111846924 6.0
+607.617390164276 5216.87060546875 4.917559623718262 6.0
+607.6378233039723 5217.64013671875 4.917385578155518 6.0
+607.6582564434284 5220.6259765625 4.917788505554199 6.0
+607.6786896826598 5220.91552734375 4.917228698730469 6.0
+607.6991227214239 5223.36767578125 4.919126987457275 6.0
+607.7195558599487 5220.67333984375 4.918998718261719 6.0
+607.7399890980159 5224.5166015625 4.918781757354736 6.0
+607.7604221358488 5225.048828125 4.918733596801758 6.0
+607.7808552734423 5224.04638671875 4.9188618659973145 6.0
+607.8012885105782 5223.3935546875 4.918569564819336 6.0
+607.8217215474797 5221.86572265625 4.918412685394287 6.0
+607.8421546841419 5231.11083984375 4.9196600914001465 6.0
+607.8625879203464 5232.16943359375 4.920053005218506 6.0
+607.8830209563166 5235.90087890625 4.920359134674072 6.0
+607.9034540918146 5224.89794921875 4.919045448303223 6.0
+607.9238873270879 5231.48681640625 4.918240547180176 6.0
+607.9443203621267 5233.2568359375 4.919350624084473 6.0
+607.9647534966934 5237.20703125 4.919910430908203 6.0
+607.9851867310354 5237.73876953125 4.920027732849121 6.0
+608.0056197649101 5219.2431640625 4.9180073738098145 6.0
+608.0260529985462 5246.52978515625 4.920628547668457 6.0
+608.046486131956 5242.03759765625 4.919979095458984 6.0
+608.0669191651323 5236.67333984375 4.920407772064209 6.0
+608.0873523978371 5247.27880859375 4.920851707458496 6.0
+608.1077855300828 5218.1298828125 4.918291091918945 6.0
+608.1282185620948 5239.7021484375 4.920073986053467 6.0
+608.1486517938683 5242.4912109375 4.919438362121582 6.0
+608.1690849254155 5241.26171875 4.920315265655518 6.0
+608.1895179564963 5240.91796875 4.9203314781188965 6.0
+608.2099511873384 5232.7578125 4.919268608093262 6.0
+608.2303843177215 5230.3369140625 4.919184684753418 6.0
+608.2508173478709 5242.74072265625 4.918071746826172 6.0
+608.2712505777818 5230.65185546875 4.916293144226074 6.0
+608.2916837072335 5240.18212890625 4.919598579406738 6.0
+608.3121167364516 5239.70654296875 4.9192705154418945 6.0
+608.3325499654311 5244.25 4.919301509857178 6.0
+608.3529830939515 5241.859375 4.918948650360107 6.0
+608.3734162220062 5245.08740234375 4.920060157775879 6.0
+608.3938493500536 5243.08740234375 4.919459819793701 6.0
+608.4142824776427 5242.9365234375 4.919071674346924 6.0
+608.4347157049924 5248.421875 4.9211554527282715 6.0
+608.4551487318822 5241.56494140625 4.919305801391602 6.0
+608.47558185854 5240.35791015625 4.919912815093994 6.0
+608.4960150847328 5242.6220703125 4.920673847198486 6.0
+608.5164482109176 5241.78662109375 4.920109748840332 6.0
+608.5368812364104 5250.27294921875 4.920242786407471 6.0
+608.5573144618975 5246.4423828125 4.920799732208252 6.0
+608.5777475869254 5248.517578125 4.920506477355957 6.0
+608.5981806117197 5241.236328125 4.920729160308838 6.0
+608.6186138360426 5251.51416015625 4.921708583831787 6.0
+608.6390469601392 5250.15283203125 4.921517372131348 6.0
+608.6594799840022 5259.85107421875 4.922192573547363 6.0
+608.6799132073938 5243.77392578125 4.920839309692383 6.0
+608.7003462305584 5250.56982421875 4.922039985656738 6.0
+608.720779353258 5247.12890625 4.921606063842773 6.0
+608.7412125757182 5249.23779296875 4.921460151672363 6.0
+608.7616455979514 5256.69287109375 4.922358989715576 6.0
+608.7820788197205 5256.82568359375 4.921936511993408 6.0
+608.8025119412487 5253.8232421875 4.921789646148682 6.0
+608.8229449625505 5252.056640625 4.921422958374023 6.0
+608.8433781833883 5254.55517578125 4.9216437339782715 6.0
+608.8638113039851 5254.26171875 4.921701431274414 6.0
+608.8842444243564 5253.82275390625 4.920758247375488 6.0
+608.9251106639276 5262.3466796875 4.922717094421387 6.0
+608.9659769021091 5251.91259765625 4.922020435333252 6.0
+608.9864100208433 5254.25048828125 4.922361373901367 6.0
+609.0068431391192 5263.06591796875 4.922394752502441 6.0
+609.0272762571622 5249.3525390625 4.921297073364258 6.0
+609.047709374965 5264.6259765625 4.923553466796875 6.0
+609.0681424923096 5261.90478515625 4.923086643218994 6.0
+609.088575709422 5256.841796875 4.922524452209473 6.0
+609.1090087262928 5254.89013671875 4.922321319580078 6.0
+609.129441842706 5251.22412109375 4.922632694244385 6.0
+609.1498750588871 5257.2275390625 4.923110008239746 6.0
+609.1703080745938 5250.26904296875 4.9217305183410645 6.0
+609.1907412900764 5253.4716796875 4.922848701477051 6.0
+609.2111744053254 5256.7451171875 4.922995567321777 6.0
+609.2316074201008 5257.1181640625 4.923216819763184 6.0
+609.2520406346521 5261.8154296875 4.923421382904053 6.0
+609.2724737489698 5250.46826171875 4.922793388366699 6.0
+609.2929067628138 5252.9404296875 4.9228291511535645 6.0
+609.3133399764338 5260.80615234375 4.923970699310303 6.0
+609.3337730895873 5251.25927734375 4.922860622406006 6.0
+609.3542062025008 5253.13916015625 4.922905445098877 6.0
+609.3746393151887 5254.86376953125 4.922762393951416 6.0
+609.395072327643 5263.1279296875 4.923769474029541 6.0
+609.4155054396251 5252.69873046875 4.922453880310059 6.0
+609.4359386511496 5251.33837890625 4.922650337219238 6.0
+609.4563717626734 5261.70556640625 4.923569679260254 6.0
+609.4768047737234 5250.6220703125 4.922492980957031 6.0
+609.4972379843166 5255.83447265625 4.923488140106201 6.0
+609.5381041047949 5255.69677734375 4.923111438751221 6.0
+609.5585373146896 5256.18798828125 4.923367500305176 6.0
+609.5789704241179 5259.52392578125 4.923351764678955 6.0
+609.5994036333068 5259.52685546875 4.925586700439453 6.0
+609.6198366420358 5252.5634765625 4.924773693084717 6.0
+609.6402697505328 5253.77685546875 4.9226298332214355 6.0
+609.6607029587904 5249.95361328125 4.922360897064209 6.0
+609.6811359668209 5255.2490234375 4.9228835105896 6.0
+609.7015690743865 5262.31396484375 4.923435211181641 6.0
+609.72200228148 5265.56298828125 4.923497676849365 6.0
+609.7424352883463 5254.3876953125 4.922698974609375 6.0
+609.7628683949806 5250.22119140625 4.922745704650879 6.0
+609.7833016013756 5249.462890625 4.922372817993164 6.0
+609.8037346073106 5263.23974609375 4.925343036651611 6.0
+609.8241677130136 5259.27587890625 4.925531387329102 6.0
+609.8446009182444 5259.609375 4.9256911277771 6.0
+609.8854670280198 5259.560546875 4.924360752105713 6.0
+609.9059002325521 5252.021484375 4.924713134765625 6.0
+609.9263333366252 5260.6728515625 4.925906181335449 6.0
+609.9467664404656 5247.79345703125 4.921700954437256 6.0
+609.967199543833 5265.90576171875 4.926161766052246 6.0
+609.9876326469748 5257.8369140625 4.92476224899292 6.0
+610.0080657498766 5259.85888671875 4.9232282638549805 6.0
+610.0284988523199 5260.66748046875 4.92542839050293 6.0
+610.0693650562753 5252.93359375 4.923262119293213 6.0
+610.0897981568487 5254.234375 4.924476623535156 6.0
+610.130664359167 5263.1357421875 4.925533771514893 6.0
+610.1510974597477 5267.1484375 4.924806118011475 6.0
+610.1715304600948 5253.66943359375 4.924034595489502 6.0
+610.2123967596199 5242.51513671875 4.9209370613098145 6.0
+610.2328297590357 5261.1787109375 4.924975872039795 6.0
+610.2736960566981 5249.0234375 4.922835826873779 6.0
+610.2941291551833 5257.2265625 4.922565937042236 6.0
+610.3145622532029 5256.73681640625 4.92309045791626 6.0
+610.3349953509824 5266.755859375 4.924504280090332 6.0
+610.355428548537 5253.70166015625 4.924322128295898 6.0
+610.375861645618 5267.3037109375 4.924895763397217 6.0
+610.3962946424726 5260.8779296875 4.924564361572266 6.0
+610.4167278388632 5258.93359375 4.923353672027588 6.0
+610.4371609352456 5249.2490234375 4.923006534576416 6.0
+610.4575939309361 5253.20458984375 4.9232354164123535 6.0
+610.4780271266281 5258.91015625 4.924236297607422 6.0
+610.5188932168385 5258.623046875 4.922384738922119 6.0
+610.5393264113663 5251.810546875 4.923351764678955 6.0
+610.5597595056533 5251.3779296875 4.92284631729126 6.0
+610.6006256933106 5259.14697265625 4.923579692840576 6.0
+610.6210587866663 5261.642578125 4.924272060394287 6.0
+610.6414917797956 5257.28564453125 4.9237060546875 6.0
+610.6619249724608 5264.77783203125 4.924399375915527 6.0
+610.6823580648852 5256.90576171875 4.924020767211914 6.0
+610.7027910570832 5251.35302734375 4.922927379608154 6.0
+610.7232242488171 5250.8818359375 4.922873497009277 6.0
+610.7436573403102 5251.6171875 4.923239231109619 6.0
+610.7640904315776 5249.80908203125 4.922699928283691 6.0
+610.7845235223795 5255.345703125 4.923648357391357 6.0
+610.8049566129412 5253.24267578125 4.9227728843688965 6.0
+610.8253897030445 5234.31884765625 4.921484470367432 6.0
+610.8458227931478 5242.12939453125 4.922485828399658 6.0
+610.8662558827782 5258.50341796875 4.923573017120361 6.0
+610.8866889719502 5248.900390625 4.922982692718506 6.0
+610.9071220608894 5250.17578125 4.9230122566223145 6.0
+610.9275551495884 5238.06884765625 4.922532558441162 6.0
+610.9479883378299 5246.1298828125 4.922689914703369 6.0
+610.968421325837 5240.6376953125 4.922557830810547 6.0
+610.9888544136047 5243.8896484375 4.9230637550354 6.0
+611.0092876011477 5251.556640625 4.922908306121826 6.0
+611.0297205882234 5252.04345703125 4.923450946807861 6.0
+611.0705868614386 5245.32080078125 4.922074794769287 6.0
+611.0910198475831 5249.58984375 4.923496246337891 6.0
+611.1114529332554 5248.28076171875 4.923133373260498 6.0
+611.1318861189357 5244.419921875 4.922982215881348 6.0
+611.1523191041488 5249.03857421875 4.923141956329346 6.0
+611.1727522888905 5241.037109375 4.922781467437744 6.0
+611.1931853736387 5252.560546875 4.923083305358887 6.0
+611.213618457914 5248.34228515625 4.923424243927002 6.0
+611.2340515417309 5255.04052734375 4.923342227935791 6.0
+611.2544846255478 5253.70703125 4.923489093780518 6.0
+611.2749177086662 5249.892578125 4.923746585845947 6.0
+611.2953507917773 5244.11279296875 4.922632694244385 6.0
+611.31578387443 5250.0673828125 4.922292232513428 6.0
+611.3362169568427 5247.97314453125 4.92323637008667 6.0
+611.3566500390298 5248.298828125 4.923028945922852 6.0
+611.3770831207512 5245.0830078125 4.923160076141357 6.0
+611.3975162022398 5245.408203125 4.922427654266357 6.0
+611.4179492832554 5240.8408203125 4.922616958618164 6.0
+611.4383823640455 5250.93115234375 4.923557281494141 6.0
+611.4588154445955 5247.462890625 4.923373699188232 6.0
+611.47924852492 5239.8349609375 4.922580718994141 6.0
+611.4996816047787 5237.37353515625 4.922005653381348 6.0
+611.5201145844039 5242.16748046875 4.922689437866211 6.0
+611.5405477635577 5236.486328125 4.923121929168701 6.0
+611.5609808424852 5236.24267578125 4.9228315353393555 6.0
+611.5814140211733 5237.87744140625 4.922850608825684 6.0
+611.6018469994015 5241.6337890625 4.923549175262451 6.0
+611.6222800776304 5236.34521484375 4.922253131866455 6.0
+611.6427132551544 5237.86572265625 4.923154830932617 6.0
+611.6631462326841 5244.9716796875 4.923542022705078 6.0
+611.6835793097489 5240.5986328125 4.922729969024658 6.0
+611.7040124865744 5243.0224609375 4.9232001304626465 6.0
+611.7244454629399 5232.8486328125 4.9221601486206055 6.0
+611.7448785390734 5235.45849609375 4.922449111938477 6.0
+611.7653117149675 5235.27490234375 4.922451019287109 6.0
+611.7857447904025 5232.66748046875 4.922916889190674 6.0
+611.8061777656039 5240.01513671875 4.923208236694336 6.0
+611.8266109405668 5236.763671875 4.922805309295654 6.0
+611.8470440150704 5246.7197265625 4.9233903884887695 6.0
+611.8674769893405 5237.3818359375 4.922636985778809 6.0
+611.887910163372 5239.56103515625 4.9232258796691895 6.0
+611.9083432369443 5237.0576171875 4.9226226806640625 6.0
+611.9287764102846 5229.70849609375 4.921902656555176 6.0
+611.9492093833833 5230.30908203125 4.922263145446777 6.0
+611.9696424560243 5237.18310546875 4.923487663269043 6.0
+611.9900756284333 5243.7431640625 4.923784255981445 6.0
+612.0105086006006 5228.91650390625 4.923165798187256 6.0
+612.0309416723103 5240.23388671875 4.9240827560424805 6.0
+612.0513747437872 5235.10009765625 4.923158645629883 6.0
+612.0718078150239 5234.43359375 4.922155380249023 6.0
+612.0922408858023 5230.6845703125 4.9221696853637695 6.0
+612.1126739563479 5235.9833984375 4.9222331047058105 6.0
+612.1331070266533 5236.306640625 4.920851230621338 6.0
+612.1535400965004 5234.40380859375 4.922130584716797 6.0
+612.1944062354887 5233.17431640625 4.922615051269531 6.0
+612.2148393044044 5236.76123046875 4.923287868499756 6.0
+612.2352723730874 5235.97412109375 4.923149585723877 6.0
+612.2557054415302 5229.3515625 4.9222612380981445 6.0
+612.2761385095146 5236.98095703125 4.9232001304626465 6.0
+612.2965716772669 5239.189453125 4.922428607940674 6.0
+612.3170046447776 5226.34765625 4.921778678894043 6.0
+612.3374378118315 5232.33447265625 4.922451972961426 6.0
+612.3578708786517 5218.31201171875 4.921311378479004 6.0
+612.3783038452311 5231.314453125 4.922624588012695 6.0
+612.3987370113537 5232.23974609375 4.922577381134033 6.0
+612.4191700772426 5236.78662109375 4.923505783081055 6.0
+612.4396030428907 5228.63818359375 4.922030925750732 6.0
+612.4600362080819 5222.453125 4.921335220336914 6.0
+612.4804692730395 5226.8447265625 4.921534061431885 6.0
+612.5009022377562 5237.375 4.922566890716553 6.0
+612.5213354020161 5230.4580078125 4.922316551208496 6.0
+612.5417684660424 5220.5751953125 4.921045303344727 6.0
+612.5622014298278 5231.26025390625 4.922079086303711 6.0
+612.5826345931564 5228.13671875 4.922694206237793 6.0
+612.6030676562514 5221.49755859375 4.9208478927612305 6.0
+612.6235007191062 5236.80712890625 4.923135757446289 6.0
+612.6439337815027 5225.25537109375 4.921597480773926 6.0
+612.6643668436664 5227.85888671875 4.921593189239502 6.0
+612.705232967055 5220.873046875 4.9216508865356445 6.0
+612.7256660282874 5230.572265625 4.921265602111816 6.0
+612.7460991892804 5219.9326171875 4.921618461608887 6.0
+612.7665321498134 5222.9912109375 4.920859336853027 6.0
+612.7869652101144 5214.6943359375 4.9207611083984375 6.0
+612.8073983701761 5228.35888671875 4.922451496124268 6.0
+612.8278313300107 5224.42236328125 4.92153787612915 6.0
+612.8482643893803 5219.21826171875 4.9207916259765625 6.0
+612.8686975482779 5227.4873046875 4.921803951263428 6.0
+612.8891305071811 5220.7939453125 4.92049503326416 6.0
+612.9095635656195 5227.65185546875 4.920840263366699 6.0
+612.9299967238185 5228.078125 4.9218878746032715 6.0
+612.9504296815576 5227.8369140625 4.921950340270996 6.0
+612.9708627390646 5221.52587890625 4.920732498168945 6.0
+612.9912958963323 5225.80517578125 4.921231746673584 6.0
+613.0117288531401 5210.54150390625 4.919806480407715 6.0
+613.0321619099414 5216.453125 4.919486999511719 6.0
+613.0525950660522 5230.57666015625 4.9214959144592285 6.0
+613.0730280221615 5221.3310546875 4.921042442321777 6.0
+613.1138942332109 5217.23681640625 4.920690536499023 6.0
+613.1343272881568 5218.51220703125 4.9211554527282715 6.0
+613.1956264515902 5229.11962890625 4.921943187713623 6.0
+613.2160595053647 5223.0078125 4.921566963195801 6.0
+613.2364925589136 5213.3740234375 4.920688152313232 6.0
+613.2569256122297 5219.40673828125 4.92099666595459 6.0
+613.2773587650736 5226.07470703125 4.921252250671387 6.0
+613.2977917176904 5217.5517578125 4.9203290939331055 6.0
+613.3182247698423 5235.47412109375 4.922889709472656 6.0
+613.3386579219878 5212.31787109375 4.920425891876221 6.0
+613.3590908736733 5206.076171875 4.919612884521484 6.0
+613.3795239248939 5205.12158203125 4.919610500335693 6.0
+613.399957076108 5224.04248046875 4.921054840087891 6.0
+613.4203900268622 5219.13720703125 4.920681476593018 6.0
+613.4408230771514 5217.314453125 4.919178009033203 6.0
+613.4612561274334 5209.5595703125 4.919414520263672 6.0
+613.4816891772571 5212.90185546875 4.919449329376221 6.0
+613.502122226615 5217.23974609375 4.92066764831543 6.0
+613.5225552759657 5211.0927734375 4.919582366943359 6.0
+613.542988324858 5212.81103515625 4.920230388641357 6.0
+613.5634214732854 5210.4189453125 4.919515609741211 6.0
+613.583854421704 5201.16943359375 4.9182329177856445 6.0
+613.604287469665 5206.859375 4.918885707855225 6.0
+613.6247206173939 5212.34326171875 4.918112754821777 6.0
+613.6451536646491 5209.15185546875 4.919173240661621 6.0
+613.665586611678 5209.54541015625 4.918326377868652 6.0
+613.6860197584756 5200.1826171875 4.917707920074463 6.0
+613.7064528050323 5212.67138671875 4.918466091156006 6.0
+613.7268857511299 5210.95361328125 4.917774677276611 6.0
+613.7473188969961 5212.37158203125 4.917490005493164 6.0
+613.7677519423887 5210.9453125 4.918256759643555 6.0
+613.7881848877878 5209.2705078125 4.918317794799805 6.0
+613.8086180327227 5211.236328125 4.9186530113220215 6.0
+613.829051077184 5216.90283203125 4.9191765785217285 6.0
+613.8494840214189 5201.9091796875 4.917453765869141 6.0
+613.8699171654225 5210.7548828125 4.9186177253723145 6.0
+613.9107831524889 5215.1337890625 4.918174743652344 6.0
+613.931216295794 5211.72607421875 4.917663097381592 6.0
+613.9516493383926 5204.21630859375 4.917925834655762 6.0
+613.9720824809992 5213.005859375 4.919004440307617 6.0
+613.9925154231387 5200.6611328125 4.9182634353637695 6.0
+614.0129484650388 5205.51611328125 4.918017387390137 6.0
+614.0333816064813 5215.54248046875 4.919232368469238 6.0
+614.0538145476894 5206.92138671875 4.918300628662109 6.0
+614.0742475886582 5220.89697265625 4.920093536376953 6.0
+614.0946807291693 5200.20947265625 4.918379783630371 6.0
+614.1151137696725 5209.2939453125 4.919434547424316 6.0
+614.1355467097164 5200.2421875 4.918227672576904 6.0
+614.1559797492955 5211.232421875 4.919621467590332 6.0
+614.1764127886418 5199.67236328125 4.917869567871094 6.0
+614.1968458277479 5197.76904296875 4.918089866638184 6.0
+614.2172789666292 5207.9912109375 4.918992519378662 6.0
+614.2377119050434 5196.28564453125 4.917969226837158 6.0
+614.2581449432182 5198.2119140625 4.917840957641602 6.0
+614.2785780811682 5201.83349609375 4.918155193328857 6.0
+614.2990110186511 5198.89111328125 4.916754722595215 6.0
+614.3194440561274 5211.11328125 4.9190826416015625 6.0
+614.3398771929133 5206.3359375 4.917888164520264 6.0
+614.3603101296976 5202.19921875 4.917964935302734 6.0
+614.3807432660105 5194.38330078125 4.917376518249512 6.0
+614.4011763020972 5198.2158203125 4.917194843292236 6.0
+614.4216092377173 5201.11669921875 4.917141914367676 6.0
+614.442042373099 5196.93408203125 4.917038917541504 6.0
+614.4624754082542 5204.18798828125 4.9167585372924805 6.0
+614.4829084431694 5196.7685546875 4.91523551940918 6.0
+614.5033414776262 5195.56005859375 4.916608810424805 6.0
+614.5237745118502 5199.2626953125 4.917617321014404 6.0
+614.5442075458413 5202.1533203125 4.917869567871094 6.0
+614.5646405793595 5194.603515625 4.916431427001953 6.0
+614.5850736126522 5187.88671875 4.9178466796875 6.0
+614.6055066457047 5194.74658203125 4.918010234832764 6.0
+614.6259396785317 5202.9892578125 4.917239189147949 6.0
+614.646372710893 5190.65966796875 4.916562080383301 6.0
+614.6668057430215 5192.689453125 4.915846824645996 6.0
+614.6872388746779 5185.52001953125 4.916450500488281 6.0
+614.7281049372978 5194.509765625 4.915741443634033 6.0
+614.7485379682621 5192.77099609375 4.915707111358643 6.0
+614.76897089876 5198.818359375 4.916574478149414 6.0
+614.7894040290194 5185.05419921875 4.916528701782227 6.0
+614.8098370590524 5193.552734375 4.916552543640137 6.0
+614.830269988619 5194.1904296875 4.9169745445251465 6.0
+614.850703117947 5189.443359375 4.9175920486450195 6.0
+614.8711360470479 5193.48291015625 4.918301582336426 6.0
+614.9120022043135 5188.4033203125 4.918261528015137 6.0
+614.9324351324831 5184.8056640625 4.917484760284424 6.0
+614.9528681601878 5188.40283203125 4.91763162612915 6.0
+614.9733012876532 5183.68017578125 4.916498184204102 6.0
+614.9937342148914 5185.572265625 4.917106628417969 6.0
+615.0141672418977 5187.62109375 4.915868759155273 6.0
+615.0346003684317 5191.5751953125 4.91549825668335 6.0
+615.0550333947394 5179.8525390625 4.915924549102783 6.0
+615.0754663208136 5181.69189453125 4.915600299835205 6.0
+615.0958994466491 5173.6591796875 4.915131092071533 6.0
+615.1163324720255 5180.46484375 4.91549015045166 6.0
+615.136765596937 5184.4326171875 4.917201995849609 6.0
+615.1571985218397 5182.36865234375 4.915369987487793 6.0
+615.1776315462848 5186.939453125 4.916340351104736 6.0
+615.1980646704978 5186.24462890625 4.91767692565918 6.0
+615.2184975944692 5187.27880859375 4.9175496101379395 6.0
+615.238930617983 5188.90625 4.917885780334473 6.0
+615.2593637412647 5181.26416015625 4.915356636047363 6.0
+615.2797966643047 5174.3369140625 4.915639400482178 6.0
+615.3002296868872 5176.09228515625 4.915464878082275 6.0
+615.3206628092375 5172.6181640625 4.916352272033691 6.0
+615.3410957313463 5182.2822265625 4.916513442993164 6.0
+615.3615287532302 5181.93603515625 4.915789604187012 6.0
+615.3819618746493 5175.81298828125 4.914731979370117 6.0
+615.4228278167793 5178.89892578125 4.916213035583496 6.0
+615.4841268775344 5164.2685546875 4.9147138595581055 6.0
+615.5045599970908 5173.87744140625 4.915363788604736 6.0
+615.5454260354963 5173.94189453125 4.9141845703125 6.0
+615.5658590543462 5179.09521484375 4.914775848388672 6.0
+615.586291972737 5170.6650390625 4.915528297424316 6.0
+615.6067250908964 5173.8935546875 4.915772438049316 6.0
+615.6271581088222 5179.6455078125 4.917112350463867 6.0
+615.6475910262743 5183.412109375 4.917479991912842 6.0
+615.6680241435024 5174.78369140625 4.916286945343018 6.0
+615.6884571604896 5171.525390625 4.916615009307861 6.0
+615.7088900770177 5172.220703125 4.917560577392578 6.0
+615.7293231933145 5178.87744140625 4.916294097900391 6.0
+615.7497562093777 5171.74267578125 4.917047023773193 6.0
+615.7701891252 5159.63037109375 4.915462017059326 6.0
+615.81105525569 5166.5615234375 4.9162421226501465 6.0
+615.8519212850224 5176.15380859375 4.9165191650390625 6.0
+615.8723542994558 5165.88330078125 4.916202545166016 6.0
+615.8927873131834 5173.68603515625 4.916311264038086 6.0
+615.9132203269182 5172.7060546875 4.916927337646484 6.0
+615.9336533401802 5170.29248046875 4.9157843589782715 6.0
+615.9540864532173 5165.4140625 4.915628433227539 6.0
+615.9745194660209 5157.80029296875 4.914028644561768 6.0
+615.994952378358 5169.93017578125 4.914303302764893 6.0
+616.0153854904565 5170.85546875 4.915607929229736 6.0
+616.0358185023288 5164.53271484375 4.914735794067383 6.0
+616.0766845251346 5164.84423828125 4.913697242736816 6.0
+616.0971175360755 5173.2060546875 4.916377067565918 6.0
+616.11755044655 5161.10107421875 4.914401531219482 6.0
+616.1584165670283 5162.22119140625 4.9150309562683105 6.0
+616.178849476797 5168.26220703125 4.916088104248047 6.0
+616.1992825861089 5174.298828125 4.915957927703857 6.0
+616.2197155951872 5153.35107421875 4.91414737701416 6.0
+616.2401485040318 5164.07275390625 4.914409637451172 6.0
+616.2605816126379 5163.32080078125 4.913745880126953 6.0
+616.2810145207841 5163.8173828125 4.913717746734619 6.0
+616.3014475286909 5161.28369140625 4.9132256507873535 6.0
+616.321880636373 5164.20703125 4.914222240447998 6.0
+616.3423135435878 5163.263671875 4.913437366485596 6.0
+616.383179657314 5169.02685546875 4.915434837341309 6.0
+616.4036126638312 5170.24365234375 4.915266990661621 6.0
+616.4240456698753 5168.65380859375 4.915075302124023 6.0
+616.444478675694 5173.849609375 4.915816783905029 6.0
+616.4649116812798 5169.68310546875 4.915926456451416 6.0
+616.4853446866255 5176.0947265625 4.91504430770874 6.0
+616.5057776915128 5162.01220703125 4.913938045501709 6.0
+616.5262106961673 5153.580078125 4.912368297576904 6.0
+616.5466438003496 5167.759765625 4.913865566253662 6.0
+616.5670767045376 5163.826171875 4.913125038146973 6.0
+616.5875097082608 5155.1611328125 4.913103103637695 6.0
+616.6079428115117 5154.1669921875 4.911460876464844 6.0
+616.6283757147685 5161.45068359375 4.9123334884643555 6.0
+616.6488087175603 5168.0546875 4.913634777069092 6.0
+616.6692418201128 5163.12890625 4.912438869476318 6.0
+616.6896747224382 5150.04931640625 4.9116315841674805 6.0
+616.7101077242987 5154.34716796875 4.911951065063477 6.0
+616.7305408259199 5164.25244140625 4.913201332092285 6.0
+616.750973727314 5150.41455078125 4.913101673126221 6.0
+616.7714068282439 5159.24560546875 4.914674282073975 6.0
+616.791839828933 5159.27685546875 4.913991451263428 6.0
+616.8122728293965 5149.27783203125 4.912895202636719 6.0
+616.8327058296272 5163.734375 4.913562297821045 6.0
+616.853138829385 5159.1484375 4.913756370544434 6.0
+616.8735718289172 5166.56640625 4.914836406707764 6.0
+616.8940048282166 5155.13720703125 4.914172172546387 6.0
+616.9144378272758 5148.61181640625 4.913827419281006 6.0
+616.934870725876 5154.01416015625 4.913690090179443 6.0
+616.9553038242448 5148.64111328125 4.913082599639893 6.0
+616.9757368223727 5153.24462890625 4.914257049560547 6.0
+616.9961697200415 5154.15283203125 4.914034366607666 6.0
+617.016602817479 5154.8388671875 4.914392471313477 6.0
+617.0574687116459 5149.890625 4.913971424102783 6.0
+617.0779018081521 5155.24658203125 4.914292335510254 6.0
+617.1187679004579 5158.26513671875 4.914649963378906 6.0
+617.1392007960312 5158.97607421875 4.914614200592041 6.0
+617.1596337913652 5154.876953125 4.914441108703613 6.0
+617.1800668864744 5158.9111328125 4.914216041564941 6.0
+617.2004997813492 5152.44091796875 4.913766384124756 6.0
+617.2209327757519 5152.50537109375 4.913990020751953 6.0
+617.2413658699297 5159.11865234375 4.9143524169921875 6.0
+617.2617987638732 5144.33447265625 4.913351058959961 6.0
+617.2822317575774 5160.98876953125 4.915311813354492 6.0
+617.3026648508239 5161.7236328125 4.915085315704346 6.0
+617.3230977438361 5145.5947265625 4.913445949554443 6.0
+617.3435307363761 5151.35595703125 4.914441108703613 6.0
+617.3639638289242 5144.88037109375 4.913825035095215 6.0
+617.3843968209985 5148.263671875 4.9134602546691895 6.0
+617.4048297128465 5159.7421875 4.914975643157959 6.0
+617.4252628044633 5158.93408203125 4.914464473724365 6.0
+617.4456957956136 5160.9296875 4.915063858032227 6.0
+617.466128686523 5154.4296875 4.914299964904785 6.0
+617.4865617772084 5155.5546875 4.914148807525635 6.0
+617.5069947674201 5152.69677734375 4.913619518280029 6.0
+617.5274277574063 5149.94775390625 4.913955211639404 6.0
+617.5478607471596 5155.587890625 4.915021896362305 6.0
+617.5682936366793 5152.75537109375 4.9150896072387695 6.0
+617.6091597147824 5150.05615234375 4.913111686706543 6.0
+617.6295926033636 5155.3857421875 4.914999008178711 6.0
+617.6500256914878 5147.5927734375 4.914313316345215 6.0
+617.6704586793785 5157.3876953125 4.91541862487793 6.0
+617.6908915672684 5155.12060546875 4.914982795715332 6.0
+617.7113246544541 5153.72216796875 4.915424823760986 6.0
+617.7317576416463 5153.40087890625 4.914802074432373 6.0
+617.7521906283655 5148.33935546875 4.914068698883057 6.0
+617.7726236148592 5148.49658203125 4.914058685302734 6.0
+617.79305660112 5161.134765625 4.9152302742004395 6.0
+617.813489586908 5155.62353515625 4.91530704498291 6.0
+617.8543555577999 5154.96044921875 4.914786338806152 6.0
+617.8747885428893 5152.60302734375 4.915673732757568 6.0
+617.8952216275211 5150.17822265625 4.914608955383301 6.0
+617.9156545119185 5156.15380859375 4.914634704589844 6.0
+617.9360875960774 5157.83056640625 4.9152727127075195 6.0
+617.95652058001 5151.32958984375 4.915151596069336 6.0
+617.9769534634761 5149.2998046875 4.914079189300537 6.0
+617.9973865467036 5144.501953125 4.914018630981445 6.0
+618.0178195297049 5160.86767578125 4.915274143218994 6.0
+618.0382524122397 5166.7958984375 4.916549205780029 6.0
+618.0586854947687 5162.18701171875 4.915816307067871 6.0
+618.0791184768386 5155.26904296875 4.915440559387207 6.0
+618.0995513584421 5153.5283203125 4.9147796630859375 6.0
+618.1199844400398 5157.978515625 4.915431022644043 6.0
+618.1404174211784 5155.83837890625 4.915890693664551 6.0
+618.1608503020834 5151.8193359375 4.914700031280518 6.0
+618.1812833827498 5150.591796875 4.91501522064209 6.0
+618.2017163629571 5164.05126953125 4.91505765914917 6.0
+618.2221493429315 5144.71923828125 4.914597034454346 6.0
+618.2425823226658 5158.630859375 4.915050983428955 6.0
+618.2630153021746 5152.66015625 4.914104461669922 6.0
+618.2834482812177 5154.85986328125 4.913846492767334 6.0
+618.3038812600207 5155.0146484375 4.914463043212891 6.0
+618.3243142385982 5154.59130859375 4.915291786193848 6.0
+618.34474721671 5157.46533203125 4.9144062995910645 6.0
+618.3651801948145 5156.1318359375 4.915006637573242 6.0
+618.3856131724606 5156.505859375 4.914400577545166 6.0
+618.4060462496418 5160.0830078125 4.914871692657471 6.0
+618.4264791268142 5166.03466796875 4.915705680847168 6.0
+618.446912103529 5146.57275390625 4.913883209228516 6.0
+618.4673451800045 5156.328125 4.915240287780762 6.0
+618.4877780562529 5159.38671875 4.915175914764404 6.0
+618.5082110320363 5152.56103515625 4.914610385894775 6.0
+618.5286441075878 5152.46435546875 4.914679050445557 6.0
+618.5490769828975 5158.1533203125 4.915809154510498 6.0
+618.5695099579825 5150.89208984375 4.913688659667969 6.0
+618.5899430328282 5157.9755859375 4.914763927459717 6.0
+618.6103759072139 5150.431640625 4.9143967628479 6.0
+618.6308088813676 5158.9365234375 4.915555000305176 6.0
+618.6512419550563 5158.2548828125 4.9154462814331055 6.0
+618.6716748287363 5156.322265625 4.914857387542725 6.0
+618.6921078019586 5155.6015625 4.915381908416748 6.0
+618.7125408749416 5150.0126953125 4.915233135223389 6.0
+618.7534068199893 5163.337890625 4.916202545166016 6.0
+618.7738397920475 5162.24853515625 4.916119575500488 6.0
+618.8147057352253 5153.4794921875 4.91486120223999 6.0
+618.8351387063449 5149.2197265625 4.914246559143066 6.0
+618.8555716774717 5153.6767578125 4.914190292358398 6.0
+618.9168705882839 5158.76318359375 4.915341854095459 6.0
+618.9373035580138 5173.73876953125 4.916683197021484 6.0
+618.9577365275036 5165.45654296875 4.915469646453857 6.0
+618.978169396767 5162.1259765625 4.9150896072387695 6.0
+618.9986024655664 5163.4521484375 4.915596008300781 6.0
+619.0190354341321 5164.0439453125 4.915285587310791 6.0
+619.039468302457 5159.66552734375 4.915018558502197 6.0
+619.059901370325 5162.3310546875 4.9155120849609375 6.0
+619.0803343381849 5158.60986328125 4.914780616760254 6.0
+619.1007673055865 5173.95751953125 4.91648530960083 6.0
+619.1416332394583 5175.16943359375 4.91700553894043 6.0
+619.162066305922 5169.6123046875 4.916505336761475 6.0
+619.1824991721587 5164.97265625 4.9161810874938965 6.0
+619.202932138156 5167.34326171875 4.915605068206787 6.0
+619.2233652039286 5173.8916015625 4.916518211364746 6.0
+619.2437981692347 5168.6123046875 4.915589332580566 6.0
+619.2642310343072 5162.06884765625 4.914761066436768 6.0
+619.2846640991411 5174.84765625 4.91597843170166 6.0
+619.3050970635159 5176.50927734375 4.916149616241455 6.0
+619.3255299276498 5173.3759765625 4.916121959686279 6.0
+619.3459629917925 5171.4150390625 4.915391445159912 6.0
+619.3663959552359 5173.078125 4.916190147399902 6.0
+619.3868288186786 5167.58447265625 4.9149956703186035 6.0
+619.4072618816499 5174.31787109375 4.916316986083984 6.0
+619.448127706899 5182.21337890625 4.916651248931885 6.0
+619.4685607689462 5170.99560546875 4.915513515472412 6.0
+619.4889937309927 5174.02099609375 4.916208267211914 6.0
+619.5298596539142 5172.94921875 4.916620254516602 6.0
+619.5502926147965 5176.96826171875 4.916348457336426 6.0
+619.5707256754395 5184.30908203125 4.917576313018799 6.0
+619.5911585358554 5179.70068359375 4.91714334487915 6.0
+619.6115914960392 5178.3994140625 4.9163923263549805 6.0
+619.6320244559829 5177.021484375 4.916444301605225 6.0
+619.6524574154682 5188.7431640625 4.918190956115723 6.0
+619.6728903747207 5179.35546875 4.916131973266602 6.0
+619.6933233337331 5183.8212890625 4.917360305786133 6.0
+619.71375629252 5181.5869140625 4.917029857635498 6.0
+619.7341892508412 5185.4150390625 4.917567729949951 6.0
+619.7546222089222 5191.55224609375 4.917897701263428 6.0
+619.7750551667777 5188.2578125 4.917974472045898 6.0
+619.7954881244004 5189.92529296875 4.918120384216309 6.0
+619.815921181551 5190.6640625 4.918248653411865 6.0
+619.8363540384744 5191.22802734375 4.918136119842529 6.0
+619.8567869951657 5182.505859375 4.917794227600098 6.0
+619.8772200516178 5194.4287109375 4.918405532836914 6.0
+619.8976529076099 5200.68359375 4.918757915496826 6.0
+619.9385189188906 5204.2353515625 4.919312953948975 6.0
+619.9589517741842 5196.3720703125 4.918433666229248 6.0
+619.9793848290137 5192.578125 4.918392181396484 6.0
+619.9998177838352 5192.73486328125 4.918406009674072 6.0
+620.0202506381975 5196.81201171875 4.918483257293701 6.0
+620.0406836920884 5187.7939453125 4.917876243591309 6.0
+620.0611166459857 5194.4638671875 4.918087005615234 6.0
+620.0815495994175 5196.53515625 4.918750762939453 6.0
+620.1019825526164 5196.86279296875 4.918670177459717 6.0
+620.1224155055752 5191.44091796875 4.91843843460083 6.0
+620.1428484580756 5192.28515625 4.918772220611572 6.0
+620.1632814105687 5199.97705078125 4.918895244598389 6.0
+620.1837143626035 5197.57470703125 4.919190406799316 6.0
+620.2041473141726 5202.02587890625 4.9196014404296875 6.0
+620.2245802657417 5196.68896484375 4.919109344482422 6.0
+620.2450132168378 5198.95947265625 4.918631553649902 6.0
+620.2654461677084 5196.6123046875 4.918716907501221 6.0
+620.2858791183389 5196.2548828125 4.9189605712890625 6.0
+620.3063120687439 5198.10595703125 4.918910980224609 6.0
+620.3267450186831 5212.09033203125 4.920222759246826 6.0
+620.3471779686224 5204.9052734375 4.919726371765137 6.0
+620.3676109180888 5214.0009765625 4.919561862945557 6.0
+620.3880439670975 5211.359375 4.91823148727417 6.0
+620.4084768160974 5208.1611328125 4.919443130493164 6.0
+620.4289097646397 5197.8310546875 4.918388366699219 6.0
+620.4493428129499 5199.79638671875 4.918824195861816 6.0
+620.4697756610258 5201.97412109375 4.919284343719482 6.0
+620.5106416560084 5203.9912109375 4.918117046356201 6.0
+620.5310745033785 5208.86376953125 4.919836044311523 6.0
+620.5515074500581 5206.69482421875 4.9193291664123535 6.0
+620.5719404967385 5211.58154296875 4.919943332672119 6.0
+620.5923733429518 5215.841796875 4.920515060424805 6.0
+620.6128062889256 5218.16650390625 4.920363903045654 6.0
+620.6332393346747 5206.99755859375 4.919826984405518 6.0
+620.653672280183 5211.7265625 4.9198479652404785 6.0
+620.674105125232 5211.9072265625 4.920286655426025 6.0
+620.6945381702826 5211.0146484375 4.920374393463135 6.0
+620.7354039589773 5214.91162109375 4.920948505401611 6.0
+620.7558370030965 5225.0546875 4.921849727630615 6.0
+620.7762699467421 5216.10595703125 4.920165061950684 6.0
+620.7967029901629 5216.00634765625 4.9206671714782715 6.0
+620.8171358333493 5222.96923828125 4.921757698059082 6.0
+620.8375687762964 5218.5556640625 4.921041965484619 6.0
+620.8580018187859 5218.7861328125 4.92114782333374 6.0
+620.878434661041 5211.78271484375 4.920474529266357 6.0
+620.8988676030567 5216.37353515625 4.920668125152588 6.0
+620.9193006448477 5219.1083984375 4.9206085205078125 6.0
+620.9397334861715 5228.18212890625 4.922152042388916 6.0
+620.9601664272559 5225.83740234375 4.921601295471191 6.0
+620.9805994681155 5223.71337890625 4.921633720397949 6.0
+621.0010323087408 5222.44140625 4.921635627746582 6.0
+621.0214652491268 5231.5634765625 4.9221696853637695 6.0
+621.0418981890543 5231.1943359375 4.921599864959717 6.0
+621.0623311287491 5221.70361328125 4.920466423034668 6.0
+621.1031970074328 5234.4541015625 4.922341823577881 6.0
+621.1236299461962 5232.81298828125 4.9227705001831055 6.0
+621.1440628847195 5235.75634765625 4.922232151031494 6.0
+621.164495923018 5228.0703125 4.921700477600098 6.0
+621.1849287610821 5227.142578125 4.9212727546691895 6.0
+621.2053617989077 5225.71142578125 4.921096324920654 6.0
+621.2462275734069 5232.40576171875 4.921968936920166 6.0
+621.2666606103012 5235.46923828125 4.921880722045898 6.0
+621.2870935467363 5235.45361328125 4.922601222991943 6.0
+621.3075263831706 5237.46875 4.921967029571533 6.0
+621.3279594191335 5236.92138671875 4.9224700927734375 6.0
+621.3483923548702 5234.09765625 4.922286033630371 6.0
+621.3688251903732 5225.0380859375 4.922016143798828 6.0
+621.3892582254048 5251.7197265625 4.924091339111328 6.0
+621.4096911604429 5233.24462890625 4.922492027282715 6.0
+621.4301239950146 5239.3505859375 4.922544956207275 6.0
+621.4709899632217 5245.1279296875 4.922662258148193 6.0
+621.4914228970956 5232.85693359375 4.921492099761963 6.0
+621.5118558304966 5234.4892578125 4.9221577644348145 6.0
+621.5322887636721 5250.55908203125 4.923826694488525 6.0
+621.5527216966148 5237.71630859375 4.921323776245117 6.0
+621.5731547290852 5237.4755859375 4.920967102050781 6.0
+621.5935875615614 5248.349609375 4.922571659088135 6.0
+621.6140205935662 5241.03857421875 4.921234130859375 6.0
+621.6344535253447 5246.13330078125 4.921501636505127 6.0
+621.6548863566568 5241.4296875 4.920751571655273 6.0
+621.6753193879704 5247.3759765625 4.92126989364624 6.0
+621.6957522188095 5244.6669921875 4.921593189239502 6.0
+621.7161851494238 5243.68115234375 4.9228596687316895 6.0
+621.7366181797988 5248.0439453125 4.922642707824707 6.0
+621.7774839396297 5240.07373046875 4.922529220581055 6.0
+621.7979169690807 5243.67529296875 4.9223127365112305 6.0
+621.81834979829 5249.14404296875 4.9235663414001465 6.0
+621.8387827272745 5247.3447265625 4.923723220825195 6.0
+621.8592157557869 5257.0576171875 4.924820899963379 6.0
+621.879648584305 5251.86669921875 4.924007892608643 6.0
+621.9000815123582 5242.849609375 4.923607349395752 6.0
+621.9205145399465 5250.98828125 4.9243316650390625 6.0
+621.940947367526 5249.30126953125 4.9241156578063965 6.0
+621.9613802948807 5242.86962890625 4.923511028289795 6.0
+621.9818133217632 5252.32666015625 4.923821926116943 6.0
+622.0022462484194 5245.94384765625 4.9241156578063965 6.0
+622.0226791748428 5248.908203125 4.923621654510498 6.0
+622.0431121008005 5247.0185546875 4.923954010009766 6.0
+622.063545026751 5254.0703125 4.923607349395752 6.0
+622.083977952243 5243.2861328125 4.922678470611572 6.0
+622.1248438025214 5256.86083984375 4.923635482788086 6.0
+622.1452768270829 5252.90673828125 4.924020767211914 6.0
+622.1657096514027 5253.458984375 4.9238786697387695 6.0
+622.1861425757306 5246.1171875 4.923426151275635 6.0
+622.2065755995936 5244.75439453125 4.922699928283691 6.0
+622.2270084229822 5246.43994140625 4.923426628112793 6.0
+622.2678743693104 5251.60302734375 4.923648834228516 6.0
+622.2883071920005 5247.6142578125 4.923253536224365 6.0
+622.3087401144658 5252.072265625 4.923514366149902 6.0
+622.3291730366982 5254.0263671875 4.923236846923828 6.0
+622.3496059584577 5251.30029296875 4.923128604888916 6.0
+622.3700389799924 5246.646484375 4.9232025146484375 6.0
+622.3904718015256 5257.21728515625 4.923076629638672 6.0
+622.4109047223537 5259.25732421875 4.923532485961914 6.0
+622.4313377431899 5250.80322265625 4.922845363616943 6.0
+622.451770563559 5248.07275390625 4.922524929046631 6.0
+622.4722034839215 5254.84375 4.923581123352051 6.0
+622.4926365038264 5263.65966796875 4.924560070037842 6.0
+622.5130694234977 5255.48291015625 4.9240403175354 6.0
+622.5335022426952 5256.7626953125 4.924129009246826 6.0
+622.5539352619016 5248.1767578125 4.92300271987915 6.0
+622.5743681806416 5244.03857421875 4.922916889190674 6.0
+622.5948009991407 5255.3408203125 4.923458576202393 6.0
+622.6152340174158 5255.037109375 4.922733306884766 6.0
+622.6356669352244 5257.314453125 4.923305511474609 6.0
+622.656099753025 5269.19921875 4.924096584320068 6.0
+622.6765327703688 5251.95751953125 4.922480583190918 6.0
+622.696965687479 5266.173828125 4.923264026641846 6.0
+622.7173985043482 5258.21533203125 4.922506332397461 6.0
+622.7378315207607 5257.4921875 4.922270774841309 6.0
+622.7582644371723 5263.62548828125 4.922679424285889 6.0
+622.7786974531118 5264.57763671875 4.923673152923584 6.0
+622.7991302688242 5254.955078125 4.9226555824279785 6.0
+622.8195631840717 5254.6142578125 4.923619270324707 6.0
+622.8399961993127 5257.294921875 4.923602104187012 6.0
+622.8604290140938 5250.921875 4.923246383666992 6.0
+622.8808619288757 5259.04931640625 4.923899173736572 6.0
+622.9012949431853 5263.41015625 4.923559665679932 6.0
+622.9217277570351 5256.21533203125 4.923165798187256 6.0
+622.9421606708856 5253.1552734375 4.923492908477783 6.0
+622.962593684264 5259.2333984375 4.923131465911865 6.0
+622.9830265976489 5252.32958984375 4.922997951507568 6.0
+623.0034594105673 5253.5048828125 4.923027038574219 6.0
+623.0238924230143 5250.96923828125 4.922214984893799 6.0
+623.0443253354679 5261.845703125 4.923020839691162 6.0
+623.064758147455 5269.34814453125 4.924105167388916 6.0
+623.0851911594364 5260.45703125 4.923346042633057 6.0
+623.1056239709578 5252.4013671875 4.920173645019531 6.0
+623.1260568820144 5256.689453125 4.920981407165527 6.0
+623.1464898930644 5256.91943359375 4.921218395233154 6.0
+623.1669227036546 5256.0185546875 4.923093795776367 6.0
+623.187355714239 5251.31396484375 4.922652721405029 6.0
+623.2077886243642 5257.24658203125 4.924071311950684 6.0
+623.228221434023 5250.66162109375 4.922946929931641 6.0
+623.2486544436833 5255.68505859375 4.923312187194824 6.0
+623.2690873531028 5267.03955078125 4.924209117889404 6.0
+623.2895201620631 5264.86767578125 4.924227714538574 6.0
+623.3099531707849 5254.14453125 4.923348426818848 6.0
+623.3303860792803 5259.595703125 4.923702716827393 6.0
+623.35081898731 5252.93603515625 4.9228901863098145 6.0
+623.3712518953398 5265.5595703125 4.924468994140625 6.0
+623.3916848028966 5259.48046875 4.922893524169922 6.0
+623.4121177102279 5259.529296875 4.92402982711792 6.0
+623.4325506173191 5251.9873046875 4.923940658569336 6.0
+623.4529835241847 5252.783203125 4.924052715301514 6.0
+623.4734164305846 5258.85693359375 4.9236979484558105 6.0
+623.5142822429116 5259.73095703125 4.923931121826172 6.0
+623.534715148613 5249.61865234375 4.922877311706543 6.0
+623.5551481540751 5254.62255859375 4.923125743865967 6.0
+623.5755809590773 5264.0830078125 4.923845291137695 6.0
+623.5960139640811 5260.24853515625 4.923490047454834 6.0
+623.6164468686111 5251.9892578125 4.923149585723877 6.0
+623.6368796729148 5255.1923828125 4.923105239868164 6.0
+623.6573126769872 5246.3291015625 4.922662258148193 6.0
+623.6777455805859 5260.908203125 4.923488616943359 6.0
+623.6981783841911 5253.3447265625 4.922894477844238 6.0
+623.7186113873322 5265.865234375 4.9237823486328125 6.0
+623.7390441902389 5256.5087890625 4.92305850982666 6.0
+623.7594770929063 5260.2490234375 4.9241042137146 6.0
+623.7799100953489 5250.72216796875 4.9226250648498535 6.0
+623.800342897317 5264.4951171875 4.924497604370117 6.0
+623.8207757990604 5259.54443359375 4.923956871032715 6.0
+623.8412088008045 5262.13623046875 4.92401123046875 6.0
+623.8616417020748 5245.6591796875 4.922557353973389 6.0
+623.8820745028861 5252.81298828125 4.923147201538086 6.0
+623.9025075036989 5247.21142578125 4.9225921630859375 6.0
+623.922940404038 5255.56884765625 4.923315525054932 6.0
+623.963806204265 5254.66748046875 4.923127174377441 6.0
+623.9842391036727 5254.533203125 4.922488212585449 6.0
+624.0046721030885 5250.32958984375 4.922882556915283 6.0
+624.02510490227 5251.13720703125 4.922468185424805 6.0
+624.0455378009792 5247.23974609375 4.921624660491943 6.0
+624.0659707994637 5250.61865234375 4.922049045562744 6.0
+624.0864035977138 5258.1953125 4.922429084777832 6.0
+624.1068364957246 5254.04248046875 4.922509670257568 6.0
+624.1272694932777 5246.2177734375 4.921836853027344 6.0
+624.1477022908293 5253.71875 4.922863960266113 6.0
+624.1681351879088 5257.07177734375 4.922667503356934 6.0
+624.1885681847634 5262.08056640625 4.923191070556641 6.0
+624.2090009813837 5258.33642578125 4.922451496124268 6.0
+624.2294338777647 5252.4541015625 4.921512603759766 6.0
+624.249866873688 5252.4033203125 4.921670436859131 6.0
+624.270299669377 5251.31494140625 4.921961784362793 6.0
+624.2907325648266 5251.984375 4.921888828277588 6.0
+624.3111655600514 5247.642578125 4.921789646148682 6.0
+624.3315984550427 5251.04052734375 4.921728134155273 6.0
+624.3520312497931 5250.39892578125 4.922050952911377 6.0
+624.3724642440866 5249.61767578125 4.922004222869873 6.0
+624.3928971381465 5246.75341796875 4.921494007110596 6.0
+624.4133300321992 5271.17236328125 4.922947406768799 6.0
+624.4337629255606 5251.7734375 4.921043395996094 6.0
+624.454195818922 5246.884765625 4.92096471786499 6.0
+624.4746287120433 5265.0185546875 4.922727584838867 6.0
+624.4950616047063 5251.53369140625 4.9217529296875 6.0
+624.5154943971356 5248.28076171875 4.920030117034912 6.0
+624.5359273893264 5245.619140625 4.92033052444458 6.0
+624.5563602812908 5247.88623046875 4.920660972595215 6.0
+624.5767930730217 5249.73974609375 4.921468734741211 6.0
+624.5972260642811 5249.41455078125 4.922130584716797 6.0
+624.6176589555471 5253.0224609375 4.92139196395874 6.0
+624.6380917463466 5243.6650390625 4.920440673828125 6.0
+624.6585247369076 5240.95068359375 4.920904636383057 6.0
+624.6789576272422 5254.42333984375 4.9223408699035645 6.0
+624.6993905171112 5247.12939453125 4.920932769775391 6.0
+624.7198234069729 5258.2841796875 4.92199182510376 6.0
+624.7402562963762 5245.822265625 4.920217037200928 6.0
+624.7606892855401 5246.64111328125 4.920110702514648 6.0
+624.8015549631818 5240.859375 4.9193830490112305 6.0
+624.8219879514145 5246.01171875 4.920570373535156 6.0
+624.9037195022684 5253.43408203125 4.921002388000488 6.0
+624.9241522893426 5243.34033203125 4.919512748718262 6.0
+624.9445852761783 5240.8408203125 4.919896125793457 6.0
+625.02631682028 5244.6083984375 4.920042514801025 6.0
+625.0467496057245 5243.52783203125 4.91910457611084 6.0
+625.0671825909303 5250.59521484375 4.922058582305908 6.0
+625.1080482601901 5243.404296875 4.920827388763428 6.0
+625.1489140285121 5251.51806640625 4.921250343322754 6.0
+625.1693470123282 5247.4482421875 4.921440601348877 6.0
+625.1897798959035 5247.0537109375 4.920395851135254 6.0
+625.2102126790196 5249.15771484375 4.920379161834717 6.0
+625.2510785445484 5245.35791015625 4.92115592956543 6.0
+625.2715114269668 5241.6279296875 4.920389652252197 6.0
+625.2919443091523 5242.748046875 4.920068264007568 6.0
+625.3123771910978 5251.57666015625 4.921206474304199 6.0
+625.3328100725848 5241.18408203125 4.920280933380127 6.0
+625.3532429540719 5233.46044921875 4.919386863708496 6.0
+625.373675835086 5236.373046875 4.92022180557251 6.0
+625.3941087158746 5246.8076171875 4.9206156730651855 6.0
+625.4145416961983 5232.88623046875 4.919661998748779 6.0
+625.4349744765132 5237.14453125 4.919268608093262 6.0
+625.4554073566032 5242.64501953125 4.92037296295166 6.0
+625.4758403362284 5234.64111328125 4.920139789581299 6.0
+625.496273115612 5228.26220703125 4.919309139251709 6.0
+625.5167059947707 5238.68310546875 4.920067310333252 6.0
+625.5371389736974 5239.37060546875 4.919676303863525 6.0
+625.5575717523825 5232.6435546875 4.919449329376221 6.0
+625.5780047306107 5233.29248046875 4.919424533843994 6.0
+625.5984376086053 5243.30517578125 4.920043468475342 6.0
+625.6188703865919 5234.64697265625 4.919707298278809 6.0
+625.6393033641216 5239.509765625 4.919938087463379 6.0
+625.6597362414177 5234.32275390625 4.919351100921631 6.0
+625.6801691182409 5238.32080078125 4.9198150634765625 6.0
+625.7006019950713 5235.697265625 4.9191670417785645 6.0
+625.7210348714361 5236.0791015625 4.919826507568359 6.0
+625.7414677477936 5231.09619140625 4.91842794418335 6.0
+625.7619006236928 5234.86669921875 4.919270992279053 6.0
+625.7823334993591 5236.6435546875 4.91959810256958 6.0
+625.8027662745517 5230.51904296875 4.919090747833252 6.0
+625.8231992497531 5244.01708984375 4.919442176818848 6.0
+625.8436321247209 5242.3173828125 4.919617652893066 6.0
+625.864064899215 5236.6220703125 4.918234825134277 6.0
+625.8844978734851 5246.1845703125 4.9204607009887695 6.0
+625.9049307475216 5232.22607421875 4.918220520019531 6.0
+625.9253635213172 5236.89794921875 4.918303966522217 6.0
+625.966229367994 5236.4013671875 4.919672012329102 6.0
+625.9866623410926 5233.4326171875 4.917829513549805 6.0
+626.0070951137313 5229.2958984375 4.91828727722168 6.0
+626.027527986138 5229.8544921875 4.918708324432373 6.0
+626.0479609583053 5238.154296875 4.919547080993652 6.0
+626.0683937302456 5232.2333984375 4.920022010803223 6.0
+626.0888266019538 5230.56982421875 4.918989658355713 6.0
+626.1092595731898 5233.7431640625 4.9193925857543945 6.0
+626.1296923441987 5231.01025390625 4.919315814971924 6.0
+626.1501252152084 5225.13525390625 4.918105602264404 6.0
+626.1705581857459 5230.4208984375 4.919240474700928 6.0
+626.1909909560563 5236.61767578125 4.9194488525390625 6.0
+626.2114238259019 5232.39599609375 4.919336795806885 6.0
+626.2318567957409 5225.0048828125 4.918471336364746 6.0
+626.2522896651208 5239.62353515625 4.920657634735107 6.0
+626.2727224344999 5218.53759765625 4.917987823486328 6.0
+626.2931554034076 5221.58154296875 4.918267250061035 6.0
+626.313588272089 5211.01416015625 4.915308475494385 6.0
+626.334021240531 5218.56640625 4.918454647064209 6.0
+626.354454008746 5222.83935546875 4.9188737869262695 6.0
+626.374886876496 5223.3359375 4.918654918670654 6.0
+626.3953198442396 5229.81396484375 4.919576644897461 6.0
+626.4157526115232 5229.9755859375 4.918922424316406 6.0
+626.4361854785748 5219.34814453125 4.918427467346191 6.0
+626.4566183453862 5219.5146484375 4.9188127517700195 6.0
+626.4770512119721 5223.17578125 4.918973922729492 6.0
+626.4974840783252 5225.29296875 4.919216632843018 6.0
+626.5179169442126 5216.43896484375 4.915577411651611 6.0
+626.5587825755138 5220.4189453125 4.918193340301514 6.0
+626.5792155406962 5225.63818359375 4.918186187744141 6.0
+626.5996484056523 5220.794921875 4.919628620147705 6.0
+626.6200812703755 5223.431640625 4.917861461639404 6.0
+626.640514134866 5215.21728515625 4.91532039642334 6.0
+626.6609469988834 5222.73486328125 4.917845249176025 6.0
+626.6813798629082 5218.71875 4.914791107177734 6.0
+626.70181272646 5227.85595703125 4.918229103088379 6.0
+626.7222455897863 5226.671875 4.9175944328308105 6.0
+626.7426785528805 5216.1015625 4.914854526519775 6.0
+626.7631114157339 5217.89453125 4.916730880737305 6.0
+626.7835441783609 5221.92626953125 4.916642665863037 6.0
+626.8039771405238 5209.0693359375 4.913925647735596 6.0
+626.8244100026786 5214.67626953125 4.914050102233887 6.0
+626.8448427643743 5218.376953125 4.917287349700928 6.0
+626.8652757258387 5219.255859375 4.916130542755127 6.0
+626.8857085870623 5213.04638671875 4.9156646728515625 6.0
+626.9061413480595 5212.140625 4.914844036102295 6.0
+626.9265743088254 5216.2763671875 4.914501190185547 6.0
+626.9470071691176 5214.63232421875 4.914368152618408 6.0
+626.9674399294163 5221.791015625 4.915301322937012 6.0
+626.9878728892509 5215.00634765625 4.91585636138916 6.0
+627.0083057490774 5220.5146484375 4.918044090270996 6.0
+627.0287385084448 5212.37158203125 4.914567470550537 6.0
+627.0491714675809 5219.01171875 4.914727210998535 6.0
+627.0696043262433 5208.21044921875 4.913974761962891 6.0
+627.090037184913 5221.23583984375 4.914218902587891 6.0
+627.1104700433498 5209.55419921875 4.913125991821289 6.0
+627.1309029013137 5219.259765625 4.916008472442627 6.0
+627.151335759052 5213.84228515625 4.9137372970581055 6.0
+627.1717686165575 5208.2431640625 4.912623882293701 6.0
+627.1922014738229 5218.57080078125 4.916414260864258 6.0
+627.2126343308628 5209.7490234375 4.911994457244873 6.0
+627.2330671876698 5204.3662109375 4.912815570831299 6.0
+627.2535000442367 5210.06640625 4.913687705993652 6.0
+627.273933000346 5209.11669921875 4.913122177124023 6.0
+627.2943657562209 5207.8681640625 4.912302017211914 6.0
+627.3147986120894 5207.84326171875 4.9133453369140625 6.0
+627.3352315675002 5209.52294921875 4.912014007568359 6.0
+627.3556643226766 5200.88134765625 4.9115824699401855 6.0
+627.3760971776137 5213.60498046875 4.91383695602417 6.0
+627.3965301320932 5207.0849609375 4.913258075714111 6.0
+627.4169628865711 5206.7470703125 4.913852214813232 6.0
+627.4373957405769 5203.30078125 4.912902355194092 6.0
+627.4578286945907 5212.69921875 4.913695335388184 6.0
+627.4782614481373 5204.10986328125 4.912726402282715 6.0
+627.4986943014446 5207.4912109375 4.912935256958008 6.0
+627.5191272545271 5196.498046875 4.912430763244629 6.0
+627.559992959752 5203.8623046875 4.913029670715332 6.0
+627.5804258121352 5207.2138671875 4.912400722503662 6.0
+627.6008586640528 5204.54833984375 4.912923812866211 6.0
+627.6212915157303 5197.43798828125 4.912053108215332 6.0
+627.641724367415 5197.34619140625 4.911177635192871 6.0
+627.6621572186268 5198.0927734375 4.911634922027588 6.0
+627.6825900696131 5207.91943359375 4.912691593170166 6.0
+627.7030229201337 5196.525390625 4.911050319671631 6.0
+627.7234557706543 5199.12548828125 4.9113922119140625 6.0
+627.7438887209355 5197.978515625 4.911498546600342 6.0
+627.7643214707568 5199.6455078125 4.911416053771973 6.0
+627.7847543203388 5200.068359375 4.9114484786987305 6.0
+627.805187269696 5200.94189453125 4.912078380584717 6.0
+627.8256200190517 5189.771484375 4.9103617668151855 6.0
+627.8460527677089 5200.69677734375 4.9124755859375 6.0
+627.8664857163603 5197.310546875 4.911741256713867 6.0
+627.8869185647854 5192.4482421875 4.91157865524292 6.0
+627.9073515127384 5201.609375 4.912533283233643 6.0
+627.9482171081909 5189.62060546875 4.911407947540283 6.0
+627.9686500554453 5195.9208984375 4.911284923553467 6.0
+627.9890828027055 5198.87255859375 4.912317752838135 6.0
+628.0095156495008 5193.447265625 4.910732746124268 6.0
+628.029948595824 5186.771484375 4.909989356994629 6.0
+628.0503813421528 5189.17919921875 4.911195755004883 6.0
+628.0912471338743 5196.30908203125 4.911153793334961 6.0
+628.1116799795054 5190.291015625 4.910330295562744 6.0
+628.1321127246702 5193.396484375 4.91061544418335 6.0
+628.1525456695963 5187.82568359375 4.9097208976745605 6.0
+628.1729785142961 5187.83740234375 4.910569667816162 6.0
+628.1934112587624 5177.70751953125 4.909684181213379 6.0
+628.21384420299 5186.82177734375 4.909937858581543 6.0
+628.2342770467585 5196.24560546875 4.912168502807617 6.0
+628.2547097905262 5198.83251953125 4.911905765533447 6.0
+628.2751427338226 5185.45654296875 4.911166667938232 6.0
+628.2955755771254 5184.18701171875 4.91109037399292 6.0
+628.3160085199634 5180.93359375 4.9101409912109375 6.0
+628.3364412625597 5187.53857421875 4.910863876342773 6.0
+628.3568741049312 5187.5478515625 4.91048526763916 6.0
+628.3773070470706 5184.71533203125 4.910183906555176 6.0
+628.3977397889685 5191.08544921875 4.909797191619873 6.0
+628.4386055718496 5177.8994140625 4.907728672027588 6.0
+628.4590383128161 5194.4619140625 4.908415794372559 6.0
+628.4794711535578 5175.46728515625 4.9064435958862305 6.0
+628.4999039942995 5181.80908203125 4.907881259918213 6.0
+628.5203368345683 5176.765625 4.908647537231445 6.0
+628.5612025144219 5181.908203125 4.908186435699463 6.0
+628.5816353537593 5180.24609375 4.908829212188721 6.0
+628.6225011319839 5175.8486328125 4.9094014167785645 6.0
+628.6429338708549 5179.5068359375 4.908552646636963 6.0
+628.6633667092683 5169.65478515625 4.907641887664795 6.0
+628.7042323856222 5180.22509765625 4.90854024887085 6.0
+628.7246653233378 5166.73291015625 4.907082557678223 6.0
+628.7450981605871 5188.103515625 4.908902168273926 6.0
+628.7655308978283 5183.18310546875 4.909400939941406 6.0
+628.7859638348455 5172.46484375 4.906759738922119 6.0
+628.8063966713962 5170.98486328125 4.907043933868408 6.0
+628.8268294079389 5175.3271484375 4.907647609710693 6.0
+628.8472623440248 5182.29150390625 4.908058166503906 6.0
+628.867695179877 5172.91162109375 4.9071364402771 6.0
+628.8881279157213 5179.552734375 4.9090471267700195 6.0
+628.9085608511086 5176.56005859375 4.908873558044434 6.0
+628.9289936862624 5172.1923828125 4.908535957336426 6.0
+628.9494265209432 5177.05224609375 4.9096574783325195 6.0
+628.9698593556313 5172.89404296875 4.908668518066406 6.0
+628.9902921900866 5168.248046875 4.908308506011963 6.0
+629.010725024069 5176.50439453125 4.909207820892334 6.0
+629.0311578580586 5171.0830078125 4.908290386199951 6.0
+629.0515906915825 5173.3828125 4.908905029296875 6.0
+629.0720236248671 5170.32177734375 4.907486915588379 6.0
+629.0924564579254 5167.42578125 4.908341407775879 6.0
+629.1128891907429 5169.11328125 4.907751560211182 6.0
+629.1333221233363 5167.9765625 4.907177925109863 6.0
+629.1946206194771 5157.6240234375 4.906308174133301 6.0
+629.2150534511384 5163.57421875 4.907501220703125 6.0
+629.2559191135224 5161.240234375 4.906490802764893 6.0
+629.2967846747488 5153.28515625 4.906576156616211 6.0
+630.1958363732629 5573.96435546875 4.65647554397583 7.0
+630.2367021112004 5578.306640625 4.656500339508057 7.0
+630.2571348298225 5572.84716796875 4.656740665435791 7.0
+630.2775676482051 5578.77783203125 4.657589912414551 7.0
+630.298000566363 5572.41015625 4.656551361083984 7.0
+630.3184332840538 5576.94091796875 4.657535076141357 7.0
+630.338866101738 5572.22509765625 4.657388687133789 7.0
+630.3592990189645 5574.49658203125 4.6587042808532715 7.0
+630.3797317361896 5575.9306640625 4.6588544845581055 7.0
+630.4001645529424 5564.19482421875 4.65656042098999 7.0
+630.4410302859906 5576.58154296875 4.658434867858887 7.0
+630.4614630020515 5566.75537109375 4.65666389465332 7.0
+630.481895917881 5564.47021484375 4.657548427581787 7.0
+630.502328733477 5574.62060546875 4.659341812133789 7.0
+630.5227614488322 5570.26416015625 4.65922737121582 7.0
+630.5431943637304 5568.4560546875 4.658351898193359 7.0
+630.5636270786272 5569.99658203125 4.659220218658447 7.0
+630.5840599932853 5577.5947265625 4.659731388092041 7.0
+630.6453584354094 5566.8994140625 4.6589436531066895 7.0
+630.7066568754381 5565.65283203125 4.659491062164307 7.0
+630.7475224008085 5573.01806640625 4.660191059112549 7.0
+630.7679553131384 5568.60302734375 4.658969879150391 7.0
+630.7883881252419 5560.2099609375 4.657076358795166 7.0
+630.8088208371119 5559.82275390625 4.659036636352539 7.0
+630.8292537487432 5564.92578125 4.658740997314453 7.0
+630.8496865601483 5565.650390625 4.6587042808532715 7.0
+630.8701193710876 5563.44580078125 4.658841133117676 7.0
+630.8905521820197 5567.89990234375 4.659759998321533 7.0
+630.9109849924935 5562.31591796875 4.659201145172119 7.0
+630.9314179029607 5563.28125 4.660384654998779 7.0
+630.951850612968 5565.03076171875 4.660117149353027 7.0
+630.9722834227432 5562.77783203125 4.65935754776001 7.0
+630.9927163325119 5565.77392578125 4.660609245300293 7.0
+631.0131491418215 5577.4677734375 4.661233901977539 7.0
+631.0335818508975 5570.19384765625 4.660531044006348 7.0
+631.0540147597349 5568.50390625 4.659490585327148 7.0
+631.0744475683459 5568.04296875 4.660060405731201 7.0
+631.0948802767234 5564.91650390625 4.660022735595703 7.0
+631.1153131846295 5568.0390625 4.659451961517334 7.0
+631.1357459925421 5568.28759765625 4.660649299621582 7.0
+631.1561787002211 5567.93603515625 4.659369468688965 7.0
+631.1766116076615 5562.98876953125 4.660036563873291 7.0
+631.197044314642 5568.73486328125 4.659521102905273 7.0
+631.217477221624 5552.51904296875 4.658641815185547 7.0
+631.2379100281323 5578.474609375 4.661341190338135 7.0
+631.2583427344143 5565.13427734375 4.659973621368408 7.0
+631.2787756406979 5562.43701171875 4.6603193283081055 7.0
+631.2992084465077 5557.54638671875 4.659095287322998 7.0
+631.3196411520912 5563.3583984375 4.660190582275391 7.0
+631.3400740574434 5561.1435546875 4.660484790802002 7.0
+631.3605068625548 5569.4638671875 4.661622524261475 7.0
+631.4013724720935 5563.44580078125 4.660643100738525 7.0
+631.4218052765063 5573.0556640625 4.660923480987549 7.0
+631.4422380806936 5564.21142578125 4.660468578338623 7.0
+631.4626708844153 5564.42236328125 4.661258697509766 7.0
+631.4831036881296 5564.83251953125 4.660834789276123 7.0
+631.5035365916192 5573.36181640625 4.661183834075928 7.0
+631.5239693946351 5567.55224609375 4.661925792694092 7.0
+631.5444020976574 5559.42138671875 4.661144733428955 7.0
+631.5648350002157 5562.57470703125 4.661193370819092 7.0
+631.5852678027732 5558.1455078125 4.659648895263672 7.0
+631.6057005048569 5563.9296875 4.66059684753418 7.0
+631.6261334067167 5564.53076171875 4.660550594329834 7.0
+631.6465662085684 5570.34912109375 4.660414218902588 7.0
+631.666998909961 5563.31494140625 4.660553932189941 7.0
+631.6874318111222 5560.56494140625 4.658687114715576 7.0
+631.7078646120499 5562.978515625 4.660525321960449 7.0
+631.7282973127367 5570.18896484375 4.6614670753479 7.0
+631.7487302131995 5566.11669921875 4.660750389099121 7.0
+631.7691630134213 5567.1484375 4.661531925201416 7.0
+631.7895959131856 5570.8515625 4.66121768951416 7.0
+631.8100286129484 5568.037109375 4.661107540130615 7.0
+631.830461412479 5570.70654296875 4.661609649658203 7.0
+631.8508942117696 5575.54931640625 4.66167688369751 7.0
+631.8713270106018 5571.07470703125 4.661780834197998 7.0
+631.8917598094267 5569.96875 4.661304950714111 7.0
+631.9121926077933 5566.71240234375 4.660565376281738 7.0
+631.9326254061598 5563.44580078125 4.6610918045043945 7.0
+631.9530582040607 5572.92578125 4.662031173706055 7.0
+631.9734910019542 5571.80615234375 4.66137170791626 7.0
+632.0143565965845 5566.48291015625 4.661431312561035 7.0
+632.0347894935549 5567.94287109375 4.661104202270508 7.0
+632.0552221902908 5576.5390625 4.6627278327941895 7.0
+632.0756549870275 5572.0234375 4.661719799041748 7.0
+632.0960878832921 5569.01904296875 4.662008285522461 7.0
+632.1165205793295 5571.7783203125 4.662069320678711 7.0
+632.1369534751284 5570.236328125 4.661940574645996 7.0
+632.1573862704681 5575.72900390625 4.662014484405518 7.0
+632.1778189658071 5572.65771484375 4.661716461181641 7.0
+632.1982518609075 5573.78173828125 4.663200378417969 7.0
+632.2186846557815 5579.0732421875 4.662534236907959 7.0
+632.2595502445911 5582.484375 4.663049697875977 7.0
+632.2799830387667 5572.2626953125 4.661998271942139 7.0
+632.3004157327086 5573.947265625 4.6626362800598145 7.0
+632.3208486261792 5576.0224609375 4.662725448608398 7.0
+632.3412814196563 5580.08203125 4.662939071655273 7.0
+632.3617142126677 5582.9892578125 4.663417816162109 7.0
+632.382147005439 5582.9970703125 4.663804531097412 7.0
+632.4025797982176 5587.68505859375 4.663294792175293 7.0
+632.4434453826034 5580.7099609375 4.662692070007324 7.0
+632.4638781746835 5578.3916015625 4.6635966300964355 7.0
+632.4843110662987 5586.06494140625 4.664582252502441 7.0
+632.504743857673 5594.0712890625 4.664064884185791 7.0
+632.525176548821 5584.8720703125 4.663178443908691 7.0
+632.5456094397377 5582.92529296875 4.6634907722473145 7.0
+632.5660422304136 5591.00244140625 4.664361000061035 7.0
+632.7090717584288 5579.59326171875 4.664056777954102 7.0
+634.5888876243262 5664.10986328125 4.675057888031006 7.0
+634.609320491254 5661.60693359375 4.675250053405762 7.0
+634.6297531579548 5652.8974609375 4.674657821655273 7.0
+634.6501859244236 5660.23388671875 4.6754608154296875 7.0
+634.670618790653 5666.22021484375 4.676168918609619 7.0
+634.6910514566553 5663.095703125 4.675368309020996 7.0
+635.2427362501985 5676.81787109375 4.677574157714844 7.0
+635.2631689096816 5671.265625 4.6768879890441895 7.0
+635.283601768926 5676.40478515625 4.677951812744141 7.0
+635.3244671867287 5673.1005859375 4.676819324493408 7.0
+635.3449000452747 5667.41064453125 4.676942825317383 7.0
+635.3653328038272 5675.31494140625 4.677783489227295 7.0
+635.3857654619133 5670.005859375 4.6771440505981445 7.0
+635.4061983197607 5677.666015625 4.678004741668701 7.0
+635.4266310773819 5670.9228515625 4.677389144897461 7.0
+635.4470638347702 5673.3232421875 4.677551746368408 7.0
+635.4674965919185 5671.068359375 4.676856517791748 7.0
+635.4879293488411 5683.42236328125 4.677984714508057 7.0
+635.5083621057638 5676.3056640625 4.677082061767578 7.0
+635.5492276184377 5684.76171875 4.678255081176758 7.0
+635.5696604744298 5689.7763671875 4.6788787841796875 7.0
+635.5900932304139 5666.2763671875 4.676692008972168 7.0
+635.6105258859388 5688.1884765625 4.678811550140381 7.0
+635.6309587412252 5672.234375 4.678027629852295 7.0
+635.6513914962852 5675.6865234375 4.677852153778076 7.0
+635.6718241513445 5675.95263671875 4.677852630615234 7.0
+635.6922570059396 5678.50634765625 4.678191184997559 7.0
+635.7126897602939 5685.56396484375 4.678920269012451 7.0
+635.7331224146546 5674.1533203125 4.677793979644775 7.0
+635.753555268544 5680.00146484375 4.67827033996582 7.0
+635.7739880224399 5686.85302734375 4.679656982421875 7.0
+635.7944206758693 5681.72119140625 4.678718566894531 7.0
+635.8148535293003 5686.1083984375 4.678741455078125 7.0
+635.8352862822576 5688.94921875 4.678884506225586 7.0
+635.8557190349893 5683.51806640625 4.678046703338623 7.0
+635.8761517877138 5685.6123046875 4.678872108459473 7.0
+635.8965845402126 5687.01171875 4.678990364074707 7.0
+635.9170172922459 5681.6015625 4.678830623626709 7.0
+635.9374500442791 5676.08154296875 4.678776264190674 7.0
+635.9578827958394 5673.75732421875 4.678201675415039 7.0
+635.978315547407 5687.8974609375 4.6795477867126465 7.0
+635.9987482987344 5672.427734375 4.678503036499023 7.0
+636.0191810496035 5676.77001953125 4.678640365600586 7.0
+636.0396138004726 5678.54638671875 4.678857803344727 7.0
+636.0600465511015 5683.6201171875 4.678850173950195 7.0
+636.1213448013732 5681.6767578125 4.679162502288818 7.0
+636.1417776510789 5682.25244140625 4.678859233856201 7.0
+636.162210400551 5681.73583984375 4.6795477867126465 7.0
+636.1826430497822 5671.3515625 4.678653240203857 7.0
+636.2030758987894 5682.6708984375 4.6793131828308105 7.0
+636.223508647563 5681.6298828125 4.679473876953125 7.0
+636.2439412960957 5694.41455078125 4.680748462677002 7.0
+636.2643741444044 5682.07666015625 4.679803848266602 7.0
+636.2848068924795 5678.31298828125 4.678788185119629 7.0
+636.3052395403138 5687.63037109375 4.679561614990234 7.0
+636.325672387924 5678.13427734375 4.678953647613525 7.0
+636.3461051353006 5696.0107421875 4.680755615234375 7.0
+636.407403376259 5691.61572265625 4.680548191070557 7.0
+636.4482688689095 5688.70654296875 4.679401397705078 7.0
+636.468701615122 5683.61376953125 4.680057048797607 7.0
+636.5095671063755 5686.84375 4.679922580718994 7.0
+636.5504325969305 5668.5625 4.678230285644531 7.0
+636.5708653419788 5692.109375 4.679083347320557 7.0
+636.5912980865614 5682.15185546875 4.679012298583984 7.0
+636.6117309311376 5679.32080078125 4.678931713104248 7.0
+636.6321635752538 5688.92578125 4.680709362030029 7.0
+636.6525963193708 5676.74658203125 4.679195404052734 7.0
+636.6730291632484 5685.5791015625 4.679723262786865 7.0
+636.693461806899 5678.79541015625 4.679821968078613 7.0
+636.7138946500781 5680.4521484375 4.679943561553955 7.0
+636.7343273932638 5688.89501953125 4.6805739402771 7.0
+636.7547600362159 5693.54541015625 4.680882930755615 7.0
+636.7751928789367 5688.32080078125 4.680540561676025 7.0
+636.7956256214165 5681.23193359375 4.679588317871094 7.0
+636.8160582636701 5678.7421875 4.679544448852539 7.0
+636.8364911056851 5679.16015625 4.679253101348877 7.0
+636.8569238474738 5689.62255859375 4.680281639099121 7.0
+636.8773564890289 5682.015625 4.679766654968262 7.0
+636.8977893303527 5674.7666015625 4.67921257019043 7.0
+636.9182220714356 5674.1953125 4.679284572601318 7.0
+636.938654812293 5688.4560546875 4.680559158325195 7.0
+636.959087553143 5679.2841796875 4.680112361907959 7.0
+636.9795202935347 5687.59375 4.681145668029785 7.0
+636.9999531336944 5676.150390625 4.679500579833984 7.0
+637.0408185135384 5680.47021484375 4.680332660675049 7.0
+637.0612513529995 5681.6943359375 4.680178642272949 7.0
+637.0816840924526 5681.37109375 4.680685520172119 7.0
+637.1021167316794 5677.58447265625 4.6797404289245605 7.0
+637.1225495704421 5678.4853515625 4.680183410644531 7.0
+637.1429823091967 5692.5791015625 4.681390285491943 7.0
+637.163414947725 5686.64111328125 4.680682182312012 7.0
+637.1838477857891 5686.9130859375 4.681210041046143 7.0
+637.2042805238452 5680.47802734375 4.6805877685546875 7.0
+637.224713161675 5679.5859375 4.680415630340576 7.0
+637.2451459992735 5675.35546875 4.680069446563721 7.0
+637.2655786366377 5672.15625 4.679541110992432 7.0
+637.2860114737632 5686.91455078125 4.680757999420166 7.0
+637.3064442106624 5683.16259765625 4.680731296539307 7.0
+637.3268768473208 5685.71142578125 4.680929183959961 7.0
+637.3473096837552 5684.89892578125 4.680294036865234 7.0
+637.3677424199559 5681.63037109375 4.680147171020508 7.0
+637.388175055923 5687.794921875 4.680769443511963 7.0
+637.4086078918845 5677.23193359375 4.679834365844727 7.0
+637.4290406273867 5687.8212890625 4.680454730987549 7.0
+637.4494733628817 5683.3115234375 4.68031644821167 7.0
+637.4699060979183 5681.3544921875 4.679508209228516 7.0
+637.5107715675185 5694.658203125 4.681427001953125 7.0
+637.5312043020895 5682.96875 4.680570125579834 7.0
+637.5516370361947 5685.5625 4.681025505065918 7.0
+637.5720698702935 5680.04345703125 4.680747985839844 7.0
+637.5925025041652 5685.88818359375 4.681271553039551 7.0
+637.6129352378048 5680.48193359375 4.681074142456055 7.0
+637.653800804379 5680.1640625 4.681033611297607 7.0
+637.6742334373193 5692.09765625 4.682168006896973 7.0
+637.6946662700211 5682.65673828125 4.681654453277588 7.0
+637.7150990024966 5683.99267578125 4.680870056152344 7.0
+637.7355316347384 5693.4091796875 4.681728839874268 7.0
+637.7559644667417 5684.169921875 4.681441307067871 7.0
+637.7763971987515 5680.39697265625 4.680871486663818 7.0
+637.7968298302949 5690.37939453125 4.681853294372559 7.0
+637.8172626615997 5679.7509765625 4.680689811706543 7.0
+637.837695392911 5680.4970703125 4.681230068206787 7.0
+637.8581281237566 5678.21484375 4.680248737335205 7.0
+637.878560854595 5671.43701171875 4.680387496948242 7.0
+637.8989935852078 5689.7197265625 4.681849956512451 7.0
+637.9194263153549 5676.1474609375 4.680856227874756 7.0
+637.9398590454948 5681.37158203125 4.681834697723389 7.0
+637.9602916754084 5684.78515625 4.6817145347595215 7.0
+637.9807245050906 5677.58154296875 4.681097030639648 7.0
+638.001157234532 5680.38525390625 4.680907249450684 7.0
+638.0215899637478 5680.45654296875 4.681576728820801 7.0
+638.0420226927308 5684.91650390625 4.681687355041504 7.0
+638.0624554214737 5688.90087890625 4.681465148925781 7.0
+638.0828881502239 5678.4638671875 4.680562496185303 7.0
+638.1033209785091 5685.5673828125 4.681540012359619 7.0
+638.1237536065528 5679.0361328125 4.681416988372803 7.0
+638.1441864346052 5669.32373046875 4.679812431335449 7.0
+638.164619162184 5682.85009765625 4.681086540222168 7.0
+638.1850517897692 5673.7822265625 4.681046962738037 7.0
+638.2259173440107 5671.65869140625 4.680744647979736 7.0
+638.2463499708902 5686.24609375 4.6816487312316895 7.0
+638.2667827975456 5677.53466796875 4.681284427642822 7.0
+638.3076481501485 5670.38671875 4.68030309677124 7.0
+638.3280809761054 5681.0537109375 4.681180477142334 7.0
+638.3485137018288 5672.36669921875 4.680521011352539 7.0
+638.3689463273113 5682.8701171875 4.681500434875488 7.0
+638.3893791525697 5678.3408203125 4.6809163093566895 7.0
+638.4098118778202 5675.2529296875 4.68104362487793 7.0
+638.430244702613 5683.81982421875 4.681394577026367 7.0
+638.4506773274043 5681.11376953125 4.681670665740967 7.0
+638.4711100517234 5666.7431640625 4.680373191833496 7.0
+638.5528409473918 5674.73974609375 4.680961608886719 7.0
+638.5732736707869 5691.07666015625 4.682568550109863 7.0
+638.5937063939418 5675.41015625 4.6812357902526855 7.0
+638.6141391168712 5681.849609375 4.681112289428711 7.0
+638.6345718395678 5683.50146484375 4.681980609893799 7.0
+638.6550045622571 5677.07763671875 4.680919170379639 7.0
+638.6754373844888 5680.95361328125 4.681682586669922 7.0
+638.6958700064861 5678.5341796875 4.681411266326904 7.0
+638.7163028284776 5681.10693359375 4.681426048278809 7.0
+638.73673555001 5675.75146484375 4.680793285369873 7.0
+638.7571681715417 5678.02587890625 4.68087911605835 7.0
+638.7776009928348 5669.4833984375 4.680092811584473 7.0
+638.7980337136687 5676.2060546875 4.681350231170654 7.0
+638.8184663345019 5677.1025390625 4.681142330169678 7.0
+638.8388991550964 5683.87158203125 4.682003021240234 7.0
+638.8593318754647 5677.40185546875 4.681286334991455 7.0
+638.9206300353981 5671.6962890625 4.679714679718018 7.0
+638.941062754835 5679.12353515625 4.681057453155518 7.0
+638.9614954742647 5675.5703125 4.680274486541748 7.0
+638.981928193236 5676.4296875 4.681323528289795 7.0
+639.0023610122007 5676.294921875 4.680303573608398 7.0
+639.0227936309384 5674.00634765625 4.680111408233643 7.0
+639.0432263492112 5671.6162109375 4.679999828338623 7.0
+639.0636591674847 5671.40771484375 4.680874824523926 7.0
+639.0840918855174 5670.94189453125 4.680863857269287 7.0
+639.1045245033238 5677.2998046875 4.680947303771973 7.0
+639.1249573208916 5679.88525390625 4.682109355926514 7.0
+639.1453900384658 5676.8369140625 4.681131839752197 7.0
+639.1658226555737 5670.35009765625 4.680915832519531 7.0
+639.1862554724503 5665.31884765625 4.680142879486084 7.0
+639.206688089318 5671.12451171875 4.681190490722656 7.0
+639.2271208057282 5674.69775390625 4.6814703941345215 7.0
+639.2475536221318 5659.16455078125 4.679729461669922 7.0
+639.2679862383084 5668.3583984375 4.68002462387085 7.0
+639.2884190542536 5670.12451171875 4.680912494659424 7.0
+639.3292843852032 5672.48486328125 4.680750370025635 7.0
+639.3497172006828 5674.6171875 4.6808881759643555 7.0
+639.3701499156887 5673.017578125 4.680951118469238 7.0
+639.3905825304682 5673.40087890625 4.680449485778809 7.0
+639.431448059564 5677.32861328125 4.680389881134033 7.0
+639.4518806738706 5678.2744140625 4.681650638580322 7.0
+639.4723134877204 5676.3955078125 4.680840492248535 7.0
+639.4927462015621 5672.65087890625 4.681144714355469 7.0
+639.5131789151783 5668.50244140625 4.680324077606201 7.0
+639.5336116285616 5667.16162109375 4.680673599243164 7.0
+639.5540443417121 5678.5 4.681513786315918 7.0
+639.5744771546233 5673.23583984375 4.680234909057617 7.0
+639.5949097673074 5670.677734375 4.68075704574585 7.0
+639.6153424797521 5682.0927734375 4.681005954742432 7.0
+639.6357752922049 5675.34765625 4.681375503540039 7.0
+639.6562080041913 5656.61328125 4.679413795471191 7.0
+639.6766406161769 5657.52392578125 4.679971694946289 7.0
+639.6970734279239 5668.974609375 4.6796770095825195 7.0
+639.7175061394446 5666.22900390625 4.680408954620361 7.0
+639.7583715617802 5670.7119140625 4.68009090423584 7.0
+639.7788042726024 5673.1015625 4.681140899658203 7.0
+639.799236883191 5664.31982421875 4.679345607757568 7.0
+639.8196696935411 5656.9150390625 4.678934574127197 7.0
+639.8401024038976 5671.61474609375 4.679024696350098 7.0
+639.8605351137812 5667.1474609375 4.680489540100098 7.0
+639.8809678236721 5664.16064453125 4.6798014640808105 7.0
+639.9014004333294 5671.51806640625 4.680368900299072 7.0
+639.9218332425153 5668.84619140625 4.68004035949707 7.0
+639.9422659517077 5667.3935546875 4.679864883422852 7.0
+639.9626985606665 5658.76611328125 4.679474830627441 7.0
+639.9831313693867 5660.4462890625 4.67976188659668 7.0
+640.0035640781134 5666.57861328125 4.680477619171143 7.0
+640.0239967863745 5666.177734375 4.6805925369262695 7.0
+640.0444294946283 5653.90625 4.6786723136901855 7.0
+640.0852949102191 5656.46533203125 4.679013252258301 7.0
+640.1057276177744 5662.19775390625 4.6796793937683105 7.0
+640.1261603248713 5675.27685546875 4.6805739402771 7.0
+640.146593131969 5666.744140625 4.679134845733643 7.0
+640.1670258388258 5658.82080078125 4.679138660430908 7.0
+640.1874584456891 5659.24072265625 4.679004669189453 7.0
+640.2078912520883 5657.24560546875 4.678900718688965 7.0
+640.2283239582466 5656.2802734375 4.679215908050537 7.0
+640.2487565644115 5664.32470703125 4.678947448730469 7.0
+640.2896220758048 5654.66845703125 4.67857027053833 7.0
+640.3100546812711 5648.74853515625 4.678329944610596 7.0
+640.3304874865062 5650.1435546875 4.677909851074219 7.0
+640.3509201915003 5657.45556640625 4.679372787475586 7.0
+640.371352796501 5651.3154296875 4.677885055541992 7.0
+640.3917856010376 5653.62353515625 4.678852558135986 7.0
+640.4122183053332 5660.19287109375 4.6777167320251465 7.0
+640.4326511096369 5654.00341796875 4.678937911987305 7.0
+640.4530837137063 5649.986328125 4.6777753829956055 7.0
+640.4735164173035 5664.54541015625 4.679895401000977 7.0
+640.4939491209079 5658.05419921875 4.679102897644043 7.0
+640.5143818242796 5654.38720703125 4.67840051651001 7.0
+640.5348145274111 5650.083984375 4.679104804992676 7.0
+640.5552472305499 5652.91552734375 4.677507400512695 7.0
+640.575679933223 5648.779296875 4.678152084350586 7.0
+640.596112635656 5650.6767578125 4.678433418273926 7.0
+640.6165453380963 5650.79736328125 4.679071426391602 7.0
+640.6369780403038 5653.82177734375 4.678807258605957 7.0
+640.6778434437801 5662.17822265625 4.679266452789307 7.0
+640.698276145522 5646.8564453125 4.676931858062744 7.0
+640.7187089467916 5653.82666015625 4.677855491638184 7.0
+640.7391416478349 5652.01953125 4.677278518676758 7.0
+640.7800070494486 5649.8603515625 4.677145004272461 7.0
+640.8004397500263 5652.62744140625 4.677098751068115 7.0
+640.8208723501375 5649.265625 4.676826000213623 7.0
+640.841305150243 5651.78564453125 4.677111625671387 7.0
+640.8617378501222 5648.59716796875 4.678184509277344 7.0
+640.8821704500006 5645.11181640625 4.676293849945068 7.0
+640.9230359485882 5645.400390625 4.677638530731201 7.0
+640.9434685477609 5644.41015625 4.677514553070068 7.0
+640.9639013464766 5648.84228515625 4.676850318908691 7.0
+640.9843340451916 5634.08154296875 4.67696475982666 7.0
+641.0047668436673 5648.794921875 4.676839351654053 7.0
+641.0251994419159 5638.671875 4.675180912017822 7.0
+641.0456321399324 5648.09423828125 4.6777849197387695 7.0
+641.0660649379424 5644.41162109375 4.676730155944824 7.0
+641.0864975354925 5645.69140625 4.6776275634765625 7.0
+641.1069302328106 5635.6962890625 4.676895618438721 7.0
+641.1273630301221 5642.63818359375 4.676771640777588 7.0
+641.1477956272065 5637.84619140625 4.676840782165527 7.0
+641.1682283240589 5635.87158203125 4.675234794616699 7.0
+641.2090938170586 5633.8037109375 4.675059795379639 7.0
+641.2295264132117 5635.29443359375 4.675644874572754 7.0
+641.2499592093591 5644.705078125 4.676210880279541 7.0
+641.2703918050465 5639.0341796875 4.675797939300537 7.0
+641.2908246007355 5641.22802734375 4.677358627319336 7.0
+641.3112572961836 5638.32763671875 4.674753189086914 7.0
+641.3316898914054 5636.16943359375 4.676192283630371 7.0
+641.3521226863959 5631.19091796875 4.675663471221924 7.0
+641.3725553811455 5634.564453125 4.676951885223389 7.0
+641.3929879759016 5636.50244140625 4.677011966705322 7.0
+641.4134207701936 5629.26953125 4.6760172843933105 7.0
+641.4338534644776 5638.94384765625 4.677260398864746 7.0
+641.4542860585352 5625.75634765625 4.6747589111328125 7.0
+641.4747188521287 5631.64599609375 4.676576614379883 7.0
+641.4951515457142 5633.4716796875 4.67665958404541 7.0
+641.5155841393062 5632.6416015625 4.676263332366943 7.0
+641.536016932434 5632.33544921875 4.675870418548584 7.0
+641.576882418216 5629.59375 4.675805568695068 7.0
+641.5973150108766 5633.7587890625 4.675901412963867 7.0
+641.6381804954945 5632.5947265625 4.676222801208496 7.0
+641.6586131874501 5623.5185546875 4.675345420837402 7.0
+641.6790457791794 5629.48046875 4.674807548522949 7.0
+641.6994785709103 5629.09765625 4.675302982330322 7.0
+641.7199112621747 5617.4794921875 4.674199104309082 7.0
+641.7403438534311 5632.74169921875 4.674959659576416 7.0
+641.7607766444635 5624.83642578125 4.674015522003174 7.0
+641.781209335255 5620.697265625 4.673870086669922 7.0
+641.8016419258201 5617.64306640625 4.674053192138672 7.0
+641.822074716154 5632.02099609375 4.674196243286133 7.0
+641.8425074064871 5622.1640625 4.673927307128906 7.0
+641.8629399963465 5629.30029296875 4.67408561706543 7.0
+641.8833727862147 5628.18408203125 4.6740217208862305 7.0
+641.9038053758486 5630.2177734375 4.674685955047607 7.0
+641.9242381652439 5619.9248046875 4.673442363739014 7.0
+641.9651034433482 5615.9013671875 4.671929836273193 7.0
+641.9855362322778 5618.55029296875 4.672898769378662 7.0
+642.0264016092115 5616.64794921875 4.67223596572876 7.0
+642.0468342974491 5634.0546875 4.673948287963867 7.0
+642.0672669854539 5622.7470703125 4.672805309295654 7.0
+642.0876996732259 5617.0947265625 4.672328948974609 7.0
+642.1081323609906 5617.79248046875 4.674035549163818 7.0
+642.1285650482969 5619.98779296875 4.673933029174805 7.0
+642.1489977355959 5629.98388671875 4.674072742462158 7.0
+642.1694305224373 5616.71630859375 4.671695232391357 7.0
+642.1898631092772 5627.07421875 4.6730241775512695 7.0
+642.2102958961113 5615.6865234375 4.672534942626953 7.0
+642.2307285824863 5621.1455078125 4.673590183258057 7.0
+642.2511611686277 5619.2451171875 4.673337936401367 7.0
+642.2715939547634 5618.00830078125 4.673763751983643 7.0
+642.2920266404399 5609.90966796875 4.671537399291992 7.0
+642.3124592261156 5612.26806640625 4.673518657684326 7.0
+642.3328920115528 5610.67724609375 4.67234468460083 7.0
+642.3737572819737 5612.83935546875 4.672162055969238 7.0
+642.3941900667123 5620.58642578125 4.671985626220703 7.0
+642.4146227514575 5614.74658203125 4.671176910400391 7.0
+642.4350553359691 5615.80908203125 4.67242431640625 7.0
+642.4554881202421 5614.490234375 4.671450138092041 7.0
+642.4759208042888 5601.34814453125 4.671304702758789 7.0
+642.4963534881026 5607.46240234375 4.67274808883667 7.0
+642.5167861716764 5612.00244140625 4.673684597015381 7.0
+642.5372188552574 5613.21240234375 4.673367023468018 7.0
+642.5780842217137 5612.244140625 4.673030853271484 7.0
+642.5985169045962 5611.38916015625 4.673104763031006 7.0
+642.6189495872459 5611.6806640625 4.67293119430542 7.0
+642.6393822696555 5618.06298828125 4.674245834350586 7.0
+642.6598149520723 5618.60595703125 4.6740922927856445 7.0
+642.6802476340235 5615.43896484375 4.673397541046143 7.0
+642.7006803159675 5616.00439453125 4.673757076263428 7.0
+642.7211129976859 5613.953125 4.673564434051514 7.0
+642.7619783606497 5605.9931640625 4.6715312004089355 7.0
+642.7824111416703 5611.810546875 4.672631740570068 7.0
+642.8028438226902 5608.4033203125 4.670597076416016 7.0
+642.8232764034692 5609.44482421875 4.671822547912598 7.0
+642.8437091840242 5600.6904296875 4.671337127685547 7.0
+642.8641418643456 5607.2841796875 4.672208786010742 7.0
+642.8845744444261 5597.642578125 4.669741630554199 7.0
+642.9050072245154 5604.16650390625 4.670659065246582 7.0
+642.9254399043712 5612.69873046875 4.672179698944092 7.0
+642.9458724837532 5601.9013671875 4.670074462890625 7.0
+642.966305263144 5602.205078125 4.6717095375061035 7.0
+643.0071706214512 5607.59326171875 4.672358512878418 7.0
+643.0276033003756 5593.6806640625 4.672194480895996 7.0
+643.0480359788344 5599.35498046875 4.672336101531982 7.0
+643.0684687572866 5598.79345703125 4.671154499053955 7.0
+643.0889013355118 5595.58349609375 4.671812057495117 7.0
+643.1093340135048 5609.22265625 4.673269748687744 7.0
+643.1297667914914 5614.3232421875 4.673173904418945 7.0
+643.1501993690181 5601.69091796875 4.672157287597656 7.0
+643.1706320465455 5605.59130859375 4.671044826507568 7.0
+643.1910648238336 5598.38720703125 4.671689510345459 7.0
+643.2114974008946 5598.37255859375 4.672248363494873 7.0
+643.2319300777235 5602.1396484375 4.671783447265625 7.0
+643.2727954309084 5604.5458984375 4.67262077331543 7.0
+643.2932281072717 5587.94921875 4.671714782714844 7.0
+643.3136608833956 5604.94677734375 4.671835422515869 7.0
+643.3340934592925 5595.65771484375 4.672987937927246 7.0
+643.3545262349508 5589.40771484375 4.671885013580322 7.0
+643.3749589103827 5602.6259765625 4.67395544052124 7.0
+643.3953914858139 5605.08740234375 4.673635482788086 7.0
+643.4158242610065 5590.7734375 4.671674728393555 7.0
+643.4362569359728 5598.4814453125 4.6735029220581055 7.0
+643.4566895107055 5592.92578125 4.6715264320373535 7.0
+643.4771222851996 5596.42236328125 4.67366886138916 7.0
+643.4975549597002 5597.791015625 4.672106742858887 7.0
+643.5179875339672 5592.75 4.672677516937256 7.0
+643.5384203079957 5594.24853515625 4.671261310577393 7.0
+643.5588529817978 5597.71875 4.672308921813965 7.0
+643.5792856553671 5593.68212890625 4.670791149139404 7.0
+643.5997183286963 5585.14599609375 4.669984340667725 7.0
+643.6405836751364 5598.44482421875 4.670599937438965 7.0
+643.661016348 5595.6962890625 4.672550201416016 7.0
+643.681449020638 5589.54248046875 4.670078277587891 7.0
+643.7018817930439 5592.703125 4.671954154968262 7.0
+643.7223144654417 5591.49365234375 4.67025899887085 7.0
+643.7427470373805 5593.322265625 4.670218467712402 7.0
+643.7631798093207 5591.30224609375 4.67173957824707 7.0
+643.7836124810201 5596.86669921875 4.671393871307373 7.0
+643.804045052726 5595.6923828125 4.672728538513184 7.0
+643.8244778239678 5589.873046875 4.67063570022583 7.0
+643.8449103952007 5593.66552734375 4.672350883483887 7.0
+643.8653430662089 5590.23388671875 4.6697587966918945 7.0
+643.885775836985 5590.7529296875 4.671205520629883 7.0
+643.9062084075194 5591.326171875 4.671530246734619 7.0
+643.9266410778291 5592.16064453125 4.670910835266113 7.0
+643.9470738481396 5603.20361328125 4.673049449920654 7.0
+643.9675064182084 5590.23388671875 4.671346187591553 7.0
+643.9879391880531 5596.74462890625 4.671595096588135 7.0
+644.0083718576643 5598.82568359375 4.672144889831543 7.0
+644.0288044270346 5590.58544921875 4.672369003295898 7.0
+644.0492371964137 5592.353515625 4.671395301818848 7.0
+644.0696698653264 5588.47265625 4.67102575302124 7.0
+644.0901025342318 5591.00146484375 4.672270774841309 7.0
+644.1105352029117 5595.63232421875 4.672360897064209 7.0
+644.1309678715916 5585.88916015625 4.672797203063965 7.0
+644.1514005397985 5581.7626953125 4.6701507568359375 7.0
+644.4578906422539 5594.24169921875 4.673463821411133 7.0
+644.4783233076741 5582.71484375 4.670710563659668 7.0
+644.4987558728608 5601.1044921875 4.672403812408447 7.0
+644.5191886378088 5586.90625 4.671457290649414 7.0
+644.5396212025298 5594.466796875 4.672998428344727 7.0
+644.560053967245 5582.54296875 4.671455383300781 7.0
+644.5804866315011 5596.259765625 4.672975063323975 7.0
+644.6009191957564 5588.2646484375 4.671729564666748 7.0
+644.6213519597804 5592.1708984375 4.671602725982666 7.0
+644.6417846235636 5586.9140625 4.672274112701416 7.0
+644.662217287354 5594.65771484375 4.672494888305664 7.0
+644.6826499509043 5588.62158203125 4.6719560623168945 7.0
+644.7030826142291 5591.703125 4.672299385070801 7.0
+644.723515277321 5590.19140625 4.672463417053223 7.0
+644.7643806030319 5594.640625 4.672070503234863 7.0
+644.7848132654253 5583.72119140625 4.6717023849487305 7.0
+644.8052460278122 5591.453125 4.672554016113281 7.0
+644.8256785899721 5595.8955078125 4.673933029174805 7.0
+644.8461113521334 5591.48779296875 4.672410011291504 7.0
+644.8869765755153 5587.580078125 4.671992778778076 7.0
+644.9074093369782 5598.20263671875 4.6737751960754395 7.0
+644.9278419982002 5600.0908203125 4.673477649688721 7.0
+644.9482745594287 5590.59765625 4.672223091125488 7.0
+644.9687073201931 5590.65185546875 4.672366619110107 7.0
+645.0095725414794 5593.763671875 4.672894477844238 7.0
+645.0300053017781 5594.54345703125 4.67267370223999 7.0
+645.0504379620688 5592.22705078125 4.672616481781006 7.0
+645.070870622134 5579.5673828125 4.67106819152832 7.0
+645.0913032817334 5594.2783203125 4.672679424285889 7.0
+645.1117359415584 5586.45703125 4.672727108001709 7.0
+645.1526012600589 5596.875 4.67348051071167 7.0
+645.1730339191854 5596.9833984375 4.6720476150512695 7.0
+645.1934665780864 5599.65966796875 4.673038959503174 7.0
+645.2138992367545 5606.82080078125 4.673880577087402 7.0
+645.2343318954154 5591.125 4.6732659339904785 7.0
+645.2547646536186 5601.779296875 4.673762321472168 7.0
+645.2751972118203 5605.1962890625 4.674500465393066 7.0
+645.2956298697827 5591.06640625 4.673019886016846 7.0
+645.3160626277531 5598.810546875 4.673300266265869 7.0
+645.3364951852564 5604.2607421875 4.674253463745117 7.0
+645.3569278427531 5595.58203125 4.6733479499816895 7.0
+645.377360600025 5604.63525390625 4.674806594848633 7.0
+645.3977931570626 5607.0859375 4.674710750579834 7.0
+645.4182258140936 5596.62353515625 4.67425012588501 7.0
+645.438658570667 5586.5146484375 4.673418045043945 7.0
+645.4590911272389 5608.36572265625 4.675780773162842 7.0
+645.4795238835723 5602.98388671875 4.674985408782959 7.0
+645.4999565396793 5615.5595703125 4.675975799560547 7.0
+645.5203890957855 5610.90234375 4.675786018371582 7.0
+645.5408218516532 5614.2294921875 4.674548149108887 7.0
+645.5612545072945 5613.1572265625 4.676426410675049 7.0
+645.581687162703 5608.02001953125 4.675336837768555 7.0
+645.6021198178714 5607.78173828125 4.67555046081543 7.0
+645.6225524730471 5612.4609375 4.675159931182861 7.0
+645.64298512799 5608.23828125 4.676159381866455 7.0
+645.6634177826927 5603.66552734375 4.674626350402832 7.0
+645.6838504371699 5611.48486328125 4.676165580749512 7.0
+645.7042830916471 5610.296875 4.6762566566467285 7.0
+645.7247158458849 5601.40625 4.674752712249756 7.0
+645.7451483998957 5607.349609375 4.6767473220825195 7.0
+645.786013707213 5615.78076171875 4.6769585609436035 7.0
+645.8064463607589 5609.18310546875 4.675335884094238 7.0
+645.8268791140654 5619.81591796875 4.677218914031982 7.0
+645.8473117671456 5611.8916015625 4.6758341789245605 7.0
+645.8677443199922 5614.59326171875 4.677055835723877 7.0
+645.8881770728331 5615.908203125 4.6769914627075195 7.0
+645.9086096254468 5613.04638671875 4.675933361053467 7.0
+645.9290422778286 5621.59130859375 4.67811393737793 7.0
+645.9494750299709 5620.50146484375 4.6771135330200195 7.0
+645.969907582119 5621.9326171875 4.678152084350586 7.0
+645.9903402340351 5615.158203125 4.676331043243408 7.0
+646.0312055371614 5620.83935546875 4.677568435668945 7.0
+646.0516382886126 5620.53466796875 4.677234649658203 7.0
+646.07207093959 5621.73681640625 4.678150177001953 7.0
+646.0925035905748 5624.35595703125 4.677922248840332 7.0
+646.1129362415595 5627.7431640625 4.678563117980957 7.0
+646.1333688920713 5620.380859375 4.677109718322754 7.0
+646.1538015425904 5617.47119140625 4.67793607711792 7.0
+646.1742341928766 5625.05859375 4.677321910858154 7.0
+646.1946668429227 5619.13330078125 4.679754257202148 7.0
+646.2150994927433 5620.98583984375 4.678028106689453 7.0
+646.2355321425639 5625.34033203125 4.678459167480469 7.0
+646.2559647921444 5622.224609375 4.6776041984558105 7.0
+646.2763974414993 5628.26611328125 4.678333282470703 7.0
+646.2968301906221 5625.47216796875 4.678877353668213 7.0
+646.3172627397362 5635.5234375 4.67938232421875 7.0
+646.3376954886262 5637.6171875 4.680505752563477 7.0
+646.3989934341225 5653.58056640625 4.68142032623291 7.0
+646.4398586302632 5650.6923828125 4.681808948516846 7.0
+646.460291377989 5649.7783203125 4.680704116821289 7.0
+646.4807240257142 5633.375 4.680310249328613 7.0
+646.5011565731984 5650.9853515625 4.681215763092041 7.0
+646.5215893204586 5643.1259765625 4.680661201477051 7.0
+646.5420219674852 5639.60498046875 4.679961681365967 7.0
+646.5624545145038 5635.349609375 4.680639266967773 7.0
+646.5828872612983 5638.8828125 4.680784225463867 7.0
+646.6033198078585 5645.76953125 4.680760860443115 7.0
+646.6237525541801 5656.4443359375 4.681651592254639 7.0
+646.6441852005082 5635.98681640625 4.679571151733398 7.0
+646.6646178463707 5638.123046875 4.680194854736328 7.0
+646.6850504922259 5645.81591796875 4.680615425109863 7.0
+646.7054831380883 5640.033203125 4.680825233459473 7.0
+646.7259157834851 5651.447265625 4.680376052856445 7.0
+646.7463484288746 5648.900390625 4.681137561798096 7.0
+646.7667810740386 5648.74169921875 4.680328369140625 7.0
+646.7872137192026 5649.61181640625 4.681842803955078 7.0
+646.8280790085919 5650.04296875 4.68143367767334 7.0
+646.8485116530574 5646.45263671875 4.680767059326172 7.0
+646.9098095855152 5665.67236328125 4.683217525482178 7.0
+646.9302423292756 5653.412109375 4.681197166442871 7.0
+646.950674872809 5642.8154296875 4.68117094039917 7.0
+646.9711076163367 5647.92041015625 4.682329177856445 7.0
+646.991540259638 5657.6953125 4.68328857421875 7.0
+647.0119728027057 5657.5947265625 4.683511257171631 7.0
+647.0324055455421 5653.01953125 4.683181285858154 7.0
+647.0528381883705 5658.40869140625 4.6839447021484375 7.0
+647.0732707309726 5658.55615234375 4.683496952056885 7.0
+647.0937034733361 5663.60107421875 4.6844563484191895 7.0
+647.1141361157061 5655.1376953125 4.683572769165039 7.0
+647.1345687576104 5667.2802734375 4.68450403213501 7.0
+647.1958665828497 5658.521484375 4.683910846710205 7.0
+647.2162993242819 5661.5048828125 4.68369722366333 7.0
+647.2367319654877 5662.5 4.684971332550049 7.0
+647.2775972474337 5654.90771484375 4.684327125549316 7.0
+647.2980298881666 5666.33544921875 4.6862616539001465 7.0
+647.3184626286748 5671.0693359375 4.686367511749268 7.0
+647.3593278092158 5658.47802734375 4.685194969177246 7.0
+647.3797605490254 5665.42529296875 4.685708999633789 7.0
+647.4001930890663 5655.8466796875 4.683806419372559 7.0
+647.4206257286351 5670.7041015625 4.686258792877197 7.0
+647.4410584682118 5656.87255859375 4.684209823608398 7.0
+647.461491007547 5678.025390625 4.686603546142578 7.0
+647.4819236466574 5671.2158203125 4.685302257537842 7.0
+647.5023563855357 5673.990234375 4.685126781463623 7.0
+647.5227889244125 5659.1123046875 4.683622360229492 7.0
+647.5432216630506 5670.0673828125 4.685126781463623 7.0
+647.5636543016954 5665.6904296875 4.68577766418457 7.0
+647.5840868398664 5675.2392578125 4.686188220977783 7.0
+647.6249522159924 5678.728515625 4.686280727386475 7.0
+647.6453848536985 5670.68017578125 4.686036109924316 7.0
+647.6658174914119 5679.0712890625 4.686351299285889 7.0
+647.6862501288924 5669.7353515625 4.685483932495117 7.0
+647.7066827661329 5673.45556640625 4.686673641204834 7.0
+647.7475480403955 5674.78173828125 4.68522834777832 7.0
+647.7679806771703 5677.6005859375 4.685115337371826 7.0
+647.7884134137203 5681.96875 4.687219619750977 7.0
+647.8088459500359 5671.19873046875 4.685423851013184 7.0
+647.8292786863458 5685.95703125 4.686526298522949 7.0
+647.8497112226614 5673.7939453125 4.684652328491211 7.0
+647.8701438585122 5680.6279296875 4.687080383300781 7.0
+647.8905765943564 5682.07861328125 4.685821056365967 7.0
+647.9110091299735 5692.35400390625 4.688449382781982 7.0
+647.9314417653586 5684.06982421875 4.686354637145996 7.0
+647.9518745005043 5684.9580078125 4.6868367195129395 7.0
+647.9723070356558 5683.16015625 4.68669319152832 7.0
+647.9927396705752 5681.00244140625 4.686451435089111 7.0
+648.0131724054881 5682.74951171875 4.687234878540039 7.0
+648.0336049399411 5684.455078125 4.685626983642578 7.0
+648.0540375743949 5679.39794921875 4.685791492462158 7.0
+648.0744703088421 5685.83642578125 4.686526298522949 7.0
+648.0949028428295 5676.26513671875 4.686160087585449 7.0
+648.1153355768183 5687.32177734375 4.686464309692383 7.0
+648.1357682105663 5686.91845703125 4.687643527984619 7.0
+648.1562008440887 5675.2333984375 4.68656063079834 7.0
+648.1766334776039 5677.056640625 4.686359405517578 7.0
+648.1970661108935 5681.6572265625 4.6865715980529785 7.0
+648.2174987439503 5687.09716796875 4.6873321533203125 7.0
+648.237931377007 5683.45458984375 4.687570095062256 7.0
+648.2583640098237 5682.94287109375 4.687897205352783 7.0
+648.3196619071241 5687.986328125 4.688094615936279 7.0
+648.4013925344552 5688.00830078125 4.688204288482666 7.0
+648.4218251658749 5688.9365234375 4.687617301940918 7.0
+648.4626904282632 5695.04052734375 4.687851905822754 7.0
+648.4831230592172 5689.326171875 4.688390254974365 7.0
+648.5035555901777 5693.09912109375 4.686985492706299 7.0
+648.5239883206741 5695.658203125 4.688393592834473 7.0
+648.5444208511617 5688.01220703125 4.688002586364746 7.0
+648.5648534814245 5699.65869140625 4.688178062438965 7.0
+648.5852862116881 5693.494140625 4.688882350921631 7.0
+648.6057187417173 5694.18310546875 4.68869686126709 7.0
+648.6261513715071 5693.9423828125 4.687675476074219 7.0
+648.6670167306293 5691.3515625 4.688835144042969 7.0
+648.6874493599607 5694.53076171875 4.68831205368042 7.0
+648.7078819890594 5695.89111328125 4.689517498016357 7.0
+648.7487472467838 5693.9560546875 4.68953275680542 7.0
+648.7896125040425 5692.94091796875 4.6880717277526855 7.0
+648.8100452324434 5688.56005859375 4.688210487365723 7.0
+648.8304777606099 5694.78369140625 4.688774585723877 7.0
+648.8509103885372 5697.875 4.688516139984131 7.0
+648.8713431164724 5702.72216796875 4.690309047698975 7.0
+648.8917756441733 5694.2998046875 4.689785003662109 7.0
+648.9122082716349 5695.43017578125 4.6893463134765625 7.0
+648.9326409988716 5691.65234375 4.68950891494751 7.0
+648.9530735261069 5705.84814453125 4.689925670623779 7.0
+648.9735061531028 5696.70556640625 4.690270900726318 7.0
+648.9939388801067 5700.05615234375 4.6898088455200195 7.0
+649.0143714068763 5698.68798828125 4.6890716552734375 7.0
+649.0348041334073 5691.49365234375 4.68927526473999 7.0
+649.055236759712 5700.82666015625 4.690389156341553 7.0
+649.0756692860159 5696.62109375 4.690568447113037 7.0
+649.0961020120812 5691.69189453125 4.688350677490234 7.0
+649.1165346379203 5697.08740234375 4.6896514892578125 7.0
+649.1369672637593 5695.5810546875 4.688613414764404 7.0
+649.1573998893582 5692.18505859375 4.689727783203125 7.0
+649.1982651398721 5702.1552734375 4.690243244171143 7.0
+649.2186977650053 5703.611328125 4.690133094787598 7.0
+649.239130389913 5700.74951171875 4.689872741699219 7.0
+649.25956291482 5701.953125 4.689687728881836 7.0
+649.2799956394883 5703.861328125 4.690232753753662 7.0
+649.3208608881396 5699.26123046875 4.689781188964844 7.0
+649.3412935123415 5689.40185546875 4.689053058624268 7.0
+649.3617261363179 5693.94287109375 4.689016342163086 7.0
+649.3821588600549 5696.6044921875 4.689161777496338 7.0
+649.4025913837977 5701.81103515625 4.689599990844727 7.0
+649.4230240073084 5703.61279296875 4.690962791442871 7.0
+649.4434567305871 5697.61376953125 4.689221382141113 7.0
+649.4638892538569 5697.1201171875 4.690134525299072 7.0
+649.484321876902 5694.982421875 4.689302921295166 7.0
+649.5047545997077 5707.92041015625 4.690883159637451 7.0
+649.5251871222863 5692.46044921875 4.689051628112793 7.0
+649.5456197448657 5704.65771484375 4.691441059112549 7.0
+649.566052467213 5693.96044921875 4.689429759979248 7.0
+649.5864849895515 5702.79541015625 4.690763473510742 7.0
+649.606917711666 5702.9228515625 4.6903510093688965 7.0
+649.6273503335397 5698.501953125 4.689530372619629 7.0
+649.6477829551877 5699.3515625 4.690440654754639 7.0
+649.6682155768358 5700.4140625 4.691093921661377 7.0
+649.688648198251 5705.24755859375 4.691232681274414 7.0
+649.709080819659 5701.57763671875 4.690796375274658 7.0
+649.7295134408414 5700.6435546875 4.691291332244873 7.0
+649.7499460617837 5697.7470703125 4.690670967102051 7.0
+649.7703786825004 5702.46875 4.691450595855713 7.0
+649.7908113032172 5703.10595703125 4.691164016723633 7.0
+649.8112439237011 5693.447265625 4.6905317306518555 7.0
+649.8316765439449 5709.0849609375 4.6919965744018555 7.0
+649.852109164196 5693.73193359375 4.689713001251221 7.0
+649.872541784207 5698.427734375 4.690476417541504 7.0
+649.8929745039932 5712.92626953125 4.692496299743652 7.0
+649.9134070237778 5692.98388671875 4.690706729888916 7.0
+649.9338396433304 5700.65380859375 4.690763473510742 7.0
+649.9542723626437 5701.77587890625 4.6912007331848145 7.0
+649.9747048819627 5695.5087890625 4.690381050109863 7.0
+649.9951375010423 5694.96044921875 4.690543174743652 7.0
+650.0360027387505 5697.30517578125 4.691205978393555 7.0
+650.0564353573718 5699.79345703125 4.691671848297119 7.0
+650.0768680757537 5701.939453125 4.692057132720947 7.0
+650.0973005941414 5702.84130859375 4.69133996963501 7.0
+650.1177332122897 5705.9853515625 4.6923933029174805 7.0
+650.1585984481353 5700.77978515625 4.691521167755127 7.0
+650.1790311658187 5692.25341796875 4.692046642303467 7.0
+650.1994637832759 5693.3642578125 4.691680431365967 7.0
+650.2198964005001 5705.9111328125 4.692172527313232 7.0
+650.2403290177172 5700.32373046875 4.691457748413086 7.0
+650.2607616349414 5703.02099609375 4.6915082931518555 7.0
+650.2811942517001 5703.11328125 4.691099166870117 7.0
+650.3016268684514 5699.89990234375 4.691943645477295 7.0
+650.32205948521 5697.978515625 4.691224098205566 7.0
+650.3629248177895 5700.22705078125 4.691592693328857 7.0
+650.3833573338488 5699.98095703125 4.691564559936523 7.0
+650.403789949909 5709.73681640625 4.692220687866211 7.0
+650.4242226657298 5692.93408203125 4.690943241119385 7.0
+650.4446551813235 5696.13134765625 4.691385269165039 7.0
+650.4650878969187 5694.248046875 4.6914448738098145 7.0
+650.4855204122723 5689.87744140625 4.6901535987854 7.0
+650.5059530274011 5703.9501953125 4.691981792449951 7.0
+650.5263857425307 5700.96142578125 4.691797733306885 7.0
+650.5468182574186 5701.640625 4.691320419311523 7.0
+650.5672508723146 5701.255859375 4.691634654998779 7.0
+650.5876835867384 5703.326171875 4.691484451293945 7.0
+650.608116101168 5694.89306640625 4.691071033477783 7.0
+650.6285487155983 5706.8251953125 4.692157745361328 7.0
+650.6489814295637 5705.98779296875 4.693002700805664 7.0
+650.6694139437532 5706.80908203125 4.692506313323975 7.0
+650.689846557485 5701.7373046875 4.692157745361328 7.0
+650.7102792712103 5691.28466796875 4.691495895385742 7.0
+650.7307118847093 5708.373046875 4.69171142578125 7.0
+650.7511444979755 5702.81201171875 4.691771507263184 7.0
+650.7715771112416 5706.4111328125 4.692274570465088 7.0
+650.7920097242677 5703.87646484375 4.6918768882751465 7.0
+650.812442337301 5701.33642578125 4.691263675689697 7.0
+650.8328749500943 5705.33251953125 4.692190170288086 7.0
+650.8533075626619 5705.32763671875 4.692676067352295 7.0
+650.8737402752304 5702.75537109375 4.692131996154785 7.0
+650.8941727873316 5702.7861328125 4.692090034484863 7.0
+650.9146053996592 5690.7734375 4.690907955169678 7.0
+650.9350381115291 5697.81689453125 4.6912522315979 7.0
+650.9554706233903 5703.12646484375 4.69232177734375 7.0
+650.9759032352595 5696.9404296875 4.691534042358398 7.0
+650.9963359466637 5697.5615234375 4.691940784454346 7.0
+651.0167684580665 5697.138671875 4.691295146942139 7.0
+651.0576337804014 5691.3134765625 4.690959453582764 7.0
+651.078066291564 5697.3154296875 4.691984176635742 7.0
+651.0984990022698 5697.4765625 4.691425800323486 7.0
+651.1189316129748 5697.85009765625 4.692281723022461 7.0
+651.1597968336791 5699.58447265625 4.691952228546143 7.0
+651.1802294439185 5701.7705078125 4.6922831535339355 7.0
+651.2006619541498 5696.93310546875 4.691929340362549 7.0
+651.2210946639243 5697.58642578125 4.691674709320068 7.0
+651.241527273698 5695.34814453125 4.69113826751709 7.0
+651.2619597832381 5705.53759765625 4.690911293029785 7.0
+651.2823924927725 5693.27197265625 4.691401481628418 7.0
+651.3232576111477 5695.24365234375 4.691964626312256 7.0
+651.3436903202237 5712.44140625 4.693676471710205 7.0
+651.3641229290661 5693.37744140625 4.691012382507324 7.0
+651.3845556379019 5703.6220703125 4.691871166229248 7.0
+651.4049881462779 5701.60498046875 4.691815376281738 7.0
+651.466285971168 5692.4912109375 4.690226078033447 7.0
+651.486718579079 5698.81884765625 4.69088077545166 7.0
+651.527583794661 5690.67333984375 4.691538333892822 7.0
+651.5480164021064 5690.240234375 4.691715240478516 7.0
+651.5684491095453 5701.62158203125 4.692529201507568 7.0
+651.5888816167571 5698.53515625 4.692088603973389 7.0
+651.6297469309429 5698.62158203125 4.690420627593994 7.0
+651.6706121442039 5696.16796875 4.692558288574219 7.0
+651.6910447507107 5694.23046875 4.692669868469238 7.0
+651.7114773572248 5696.3017578125 4.69076681137085 7.0
+651.7319099633896 5691.7373046875 4.691529273986816 7.0
+651.7523425694308 5703.92431640625 4.692873001098633 7.0
+651.7727751753628 5694.3798828125 4.6912431716918945 7.0
+651.8340729922202 5691.3564453125 4.691705226898193 7.0
+651.8749382026799 5696.310546875 4.692391872406006 7.0
+651.8953707076798 5696.5146484375 4.693423271179199 7.0
+651.9158034126813 5691.11962890625 4.692224502563477 7.0
+651.9566687219776 5692.2236328125 4.692804336547852 7.0
+651.9975338306904 5695.96826171875 4.6933488845825195 7.0
+652.0179665348769 5688.86865234375 4.692267894744873 7.0
+652.0383990389455 5697.5322265625 4.692706108093262 7.0
+652.0792643464956 5691.7294921875 4.69203519821167 7.0
+652.0996968500986 5681.48095703125 4.69053316116333 7.0
+652.1201294535786 5695.2548828125 4.692094326019287 7.0
+652.1405621568338 5688.47119140625 4.691669940948486 7.0
+652.160994659971 5683.4912109375 4.6916046142578125 7.0
+652.1814272629854 5680.55126953125 4.691664218902588 7.0
+652.2018599658913 5691.73779296875 4.6932525634765625 7.0
+652.2222925685637 5693.11474609375 4.692583084106445 7.0
+652.2427251712288 5691.34619140625 4.692763328552246 7.0
+652.2631577736684 5690.66259765625 4.6929707527160645 7.0
+652.2835903758678 5692.7236328125 4.692959308624268 7.0
+652.3040229780745 5686.9892578125 4.6914849281311035 7.0
+652.3244555800484 5682.673828125 4.6914896965026855 7.0
+652.3448881819058 5693.0947265625 4.692327976226807 7.0
+652.3653208836404 5685.23828125 4.691674709320068 7.0
+652.3857533852643 5691.248046875 4.691808700561523 7.0
+652.4061859866488 5696.20703125 4.6923112869262695 7.0
+652.4266186879249 5692.15771484375 4.692223072052002 7.0
+652.4470511890831 5688.89794921875 4.691930294036865 7.0
+652.4674837901257 5693.12890625 4.692345142364502 7.0
+652.4879164909289 5684.1962890625 4.69071102142334 7.0
+652.5083489917379 5684.35205078125 4.691111087799072 7.0
+652.5287816923083 5691.01611328125 4.690961837768555 7.0
+652.5492141926516 5686.7119140625 4.691685199737549 7.0
+652.5696467929956 5681.87548828125 4.691264629364014 7.0
+652.5900794931003 5693.845703125 4.692769527435303 7.0
+652.6105119932108 5690.8642578125 4.692297458648682 7.0
+652.6513772927283 5684.43017578125 4.691895961761475 7.0
+652.6718097923731 5674.4873046875 4.691121578216553 7.0
+652.6922423917858 5675.19921875 4.690652370452881 7.0
+652.7126750910757 5680.34521484375 4.69113302230835 7.0
+652.7331076902556 5686.77392578125 4.692692279815674 7.0
+652.7535401893183 5686.09619140625 4.692454814910889 7.0
+652.7739728881425 5682.28515625 4.691459655761719 7.0
+652.7944054869731 5676.0 4.691229343414307 7.0
+652.814838085571 5685.958984375 4.691677093505859 7.0
+652.8352706839287 5683.0068359375 4.6913275718688965 7.0
+652.8557032822937 5684.05078125 4.691250324249268 7.0
+652.8761359804266 5679.462890625 4.690842628479004 7.0
+652.8965684785508 5687.95458984375 4.69105863571167 7.0
+652.9170010764501 5678.75244140625 4.690342426300049 7.0
+652.9374337742338 5680.2119140625 4.690699577331543 7.0
+652.9578662717759 5674.47998046875 4.690236568450928 7.0
+652.978298869326 5677.53125 4.6908416748046875 7.0
+653.0191640638368 5675.029296875 4.689856052398682 7.0
+653.0395966609212 5678.1875 4.691268444061279 7.0
+653.0600293577736 5674.056640625 4.690434455871582 7.0
+653.0804618546172 5678.86767578125 4.691732883453369 7.0
+653.100894451236 5674.65380859375 4.690837383270264 7.0
+653.141759644117 5669.125 4.690010070800781 7.0
+653.1621923403873 5677.68310546875 4.690876483917236 7.0
+653.1826248364232 5671.3564453125 4.690130233764648 7.0
+653.2030574324526 5678.283203125 4.690560817718506 7.0
+653.2234901282573 5669.72412109375 4.689673900604248 7.0
+653.243922623944 5673.55517578125 4.690047740936279 7.0
+653.2643552195077 5674.9013671875 4.690421104431152 7.0
+653.2847879148467 5666.17626953125 4.6902337074279785 7.0
+653.3052205101849 5674.451171875 4.69069242477417 7.0
+653.3256530052822 5672.4853515625 4.691005706787109 7.0
+653.3460857002719 5677.0458984375 4.691788196563721 7.0
+653.3665182951372 5670.974609375 4.690814971923828 7.0
+653.3869507898926 5666.85595703125 4.69082498550415 7.0
+653.4073834844166 5666.626953125 4.690098285675049 7.0
+653.4278160788235 5670.84326171875 4.689996242523193 7.0
+653.4482487731075 5669.15625 4.6904778480529785 7.0
+653.4686812672808 5669.693359375 4.6909918785095215 7.0
+653.4891138613311 5665.5146484375 4.689820289611816 7.0
+653.5095465552731 5664.7646484375 4.690985679626465 7.0
+653.5299790489807 5657.05078125 4.688695430755615 7.0
+653.5504116426891 5663.12060546875 4.689940929412842 7.0
+653.5708443361582 5670.22021484375 4.6912312507629395 7.0
+653.5912768295166 5667.4091796875 4.691502094268799 7.0
+653.611709422752 5661.185546875 4.690406322479248 7.0
+653.6321421157627 5661.033203125 4.690603733062744 7.0
+653.6525746087718 5687.9462890625 4.692520618438721 7.0
+653.6730072015489 5657.87158203125 4.688790798187256 7.0
+653.693439894203 5666.2548828125 4.689681053161621 7.0
+653.7138724867473 5666.72802734375 4.690516948699951 7.0
+653.7343050791678 5659.384765625 4.690442085266113 7.0
+653.7547376714792 5666.74169921875 4.690952301025391 7.0
+653.7751702635578 5663.0537109375 4.689863204956055 7.0
+653.7956028555127 5664.22607421875 4.688783645629883 7.0
+653.8160354474749 5664.130859375 4.690442085266113 7.0
+653.8364680392042 5662.7568359375 4.689559459686279 7.0
+653.8569006306934 5657.78173828125 4.689903736114502 7.0
+653.8773332221899 5660.5146484375 4.689381122589111 7.0
+653.89776581357 5653.0498046875 4.688672065734863 7.0
+653.91819840471 5662.3603515625 4.690206527709961 7.0
+653.9386309957408 5662.087890625 4.689814567565918 7.0
+653.9794961775624 5667.951171875 4.690577507019043 7.0
+653.9999287681276 5656.5263671875 4.688365936279297 7.0
+654.0203614586935 5650.263671875 4.688613414764404 7.0
+654.0407939491342 5654.3974609375 4.689871311187744 7.0
+654.0612265393502 5657.20947265625 4.689388751983643 7.0
+654.0816592294505 5664.16796875 4.689759254455566 7.0
+654.1020917194255 5656.673828125 4.68971061706543 7.0
+654.1225243092922 5654.24267578125 4.689229965209961 7.0
+654.1429569990432 5648.76416015625 4.689706325531006 7.0
+654.163389488669 5652.48291015625 4.689269065856934 7.0
+654.1838220780701 5653.341796875 4.689940929412842 7.0
+654.2042547674719 5654.8447265625 4.689992904663086 7.0
+654.224687256632 5656.509765625 4.689342498779297 7.0
+654.2451198456838 5655.1826171875 4.689690113067627 7.0
+654.2655525346199 5653.75244140625 4.689107894897461 7.0
+654.2859851234316 5641.78369140625 4.687200546264648 7.0
+654.3268503006038 5651.0771484375 4.688573837280273 7.0
+654.3472828890663 5653.83544921875 4.688623428344727 7.0
+654.3881480654236 5645.35791015625 4.686217784881592 7.0
+654.4085806535368 5651.3564453125 4.687497138977051 7.0
+654.4290133413087 5649.1220703125 4.687633514404297 7.0
+654.4494458290792 5642.38232421875 4.687219619750977 7.0
+654.4698784167267 5640.37109375 4.689629077911377 7.0
+654.4903110042651 5642.9765625 4.688407897949219 7.0
+654.5107435915706 5642.1552734375 4.6876702308654785 7.0
+654.5311761788689 5647.921875 4.688353061676025 7.0
+654.5516087659416 5651.84375 4.6883673667907715 7.0
+654.5720413528979 5644.1171875 4.6873250007629395 7.0
+654.5924740397313 5640.72607421875 4.687431335449219 7.0
+654.612906526454 5641.345703125 4.688080787658691 7.0
+654.6333391129447 5636.50830078125 4.686429500579834 7.0
+654.6537717994288 5640.564453125 4.687375068664551 7.0
+654.6742042858023 5638.5048828125 4.686577320098877 7.0
+654.6946368719437 5628.94287109375 4.686646938323975 7.0
+654.7355020439863 5635.34130859375 4.6882171630859375 7.0
+654.7559346297785 5633.8671875 4.686065196990967 7.0
+654.7763673154477 5630.3466796875 4.686997890472412 7.0
+654.7967999008906 5638.4150390625 4.686389446258545 7.0
+654.8172323863328 5632.1279296875 4.686605930328369 7.0
+654.8376650716527 5644.3876953125 4.688143730163574 7.0
+654.8580976567464 5629.86572265625 4.685906410217285 7.0
+654.8989628266936 5635.10009765625 4.686140060424805 7.0
+654.9193954115544 5632.8515625 4.6859941482543945 7.0
+654.9398280961759 5626.5400390625 4.685877323150635 7.0
+654.9602605806867 5631.8232421875 4.685676574707031 7.0
+654.9806931650819 5627.32275390625 4.685942649841309 7.0
+655.0215583333993 5622.74609375 4.684792995452881 7.0
+655.0419909174452 5628.302734375 4.685582637786865 7.0
+655.0624236012518 5624.771484375 4.685385227203369 7.0
+655.0828560850641 5622.802734375 4.684780120849609 7.0
+655.1032886686444 5627.6328125 4.685972690582275 7.0
+655.1237212522174 5624.89013671875 4.685630798339844 7.0
+655.1441538355648 5627.6630859375 4.686707019805908 7.0
+655.1645865187966 5628.35107421875 4.685420989990234 7.0
+655.1850190019031 5622.32080078125 4.685604572296143 7.0
+655.2054515849013 5615.87841796875 4.68583345413208 7.0
+655.2463167505412 5626.4794921875 4.687348365783691 7.0
+655.2667493330737 5618.896484375 4.683797836303711 7.0
+655.3076145978994 5621.177734375 4.6844658851623535 7.0
+655.3280470801983 5625.421875 4.68401575088501 7.0
+655.3484797622659 5626.9443359375 4.685974597930908 7.0
+655.3689123443255 5621.2919921875 4.683845520019531 7.0
+655.3893448261588 5617.73828125 4.685445785522461 7.0
+655.4097775078772 5620.04638671875 4.685561180114746 7.0
+655.4302100894711 5617.5009765625 4.685481548309326 7.0
+655.4506427709566 5613.62548828125 4.685226917266846 7.0
+655.4710752523242 5624.07666015625 4.687375068664551 7.0
+655.4915078335689 5622.82958984375 4.686885833740234 7.0
+655.5119405145888 5614.615234375 4.686443328857422 7.0
+655.5323729956071 5612.26025390625 4.685306549072266 7.0
+655.5528055765026 5623.31884765625 4.686861038208008 7.0
+655.5732382571732 5622.51416015625 4.688569068908691 7.0
+655.5936707378423 5621.6220703125 4.687355041503906 7.0
+655.6141033182721 5615.66748046875 4.68665075302124 7.0
+655.6345359987099 5611.47021484375 4.686486721038818 7.0
+655.6549684789134 5614.85595703125 4.686123371124268 7.0
+655.6754010589939 5610.185546875 4.684502601623535 7.0
+655.695833738966 5605.08251953125 4.684660911560059 7.0
+655.7162662189367 5620.59521484375 4.685344696044922 7.0
+655.7366988986687 5613.60595703125 4.684793472290039 7.0
+655.7571314781744 5600.86328125 4.682888031005859 7.0
+655.7775640576729 5608.9853515625 4.684269428253174 7.0
+655.8184292163351 5608.6650390625 4.683663845062256 7.0
+655.8388617954915 5611.2998046875 4.684027671813965 7.0
+655.8592943745243 5610.23583984375 4.683916091918945 7.0
+655.8797269533316 5605.44482421875 4.68374490737915 7.0
+655.900159432138 5596.1474609375 4.683765888214111 7.0
+655.9205921107059 5605.28515625 4.684142589569092 7.0
+655.9410246892803 5607.08349609375 4.684203624725342 7.0
+655.9614571676211 5611.87890625 4.685640335083008 7.0
+655.9818898459562 5600.0185546875 4.684901237487793 7.0
+656.0023224240649 5595.29248046875 4.685063362121582 7.0
+656.0227549021729 5610.5927734375 4.686252117156982 7.0
+656.0431875800423 5601.228515625 4.684751033782959 7.0
+656.0636201578018 5601.37744140625 4.685078144073486 7.0
+656.0840528354383 5604.44580078125 4.685340404510498 7.0
+656.1453505677782 5607.41943359375 4.685126304626465 7.0
+656.1657830449549 5595.638671875 4.683927536010742 7.0
+656.1862156220159 5593.9619140625 4.681532382965088 7.0
+656.206648298954 5597.40185546875 4.682066440582275 7.0
+656.2270807757814 5592.36328125 4.68278694152832 7.0
+656.2475133523767 5588.48681640625 4.681812763214111 7.0
+656.2679460289655 5599.5791015625 4.682658672332764 7.0
+656.2883786054444 5598.43408203125 4.683145523071289 7.0
+656.3088110818062 5596.37109375 4.683490753173828 7.0
+656.3292437580458 5605.5615234375 4.684707164764404 7.0
+656.3701089100723 5597.42431640625 4.682835578918457 7.0
+656.3905414859619 5585.85888671875 4.6818413734436035 7.0
+656.4109740616259 5586.66943359375 4.682436943054199 7.0
+656.4314067372907 5590.94970703125 4.6845245361328125 7.0
+656.4518392128302 5583.76513671875 4.683971405029297 7.0
+656.472271788145 5599.62451171875 4.685821056365967 7.0
+656.4927043634598 5590.31201171875 4.6838765144348145 7.0
+656.5131369385344 5584.5048828125 4.683104515075684 7.0
+656.5335694136156 5594.4658203125 4.684842586517334 7.0
+656.5540020884655 5591.083984375 4.684763431549072 7.0
+656.5744346633073 5590.7822265625 4.6827826499938965 7.0
+656.5948671379228 5587.83251953125 4.684670925140381 7.0
+656.6152998125399 5582.56640625 4.683492660522461 7.0
+656.6357323869161 5589.599609375 4.683945655822754 7.0
+656.6561650613003 5582.96875 4.683464527130127 7.0
+656.6765975354501 5587.4072265625 4.685670852661133 7.0
+656.6970301095935 5579.353515625 4.68358039855957 7.0
+656.717462783512 5590.94482421875 4.684702396392822 7.0
+656.7378952573126 5584.29443359375 4.684330463409424 7.0
+656.7583278311067 5578.3330078125 4.683474540710449 7.0
+656.778760504676 5596.83154296875 4.685303211212158 7.0
+656.7991930782446 5585.166015625 4.683938503265381 7.0
+656.8196255515722 5573.44873046875 4.682255744934082 7.0
+656.8400582247923 5581.82470703125 4.683987617492676 7.0
+656.8604907980116 5581.06103515625 4.683079242706299 7.0
+656.88092327099 5579.9248046875 4.683206558227539 7.0
+656.9217885167309 5572.05224609375 4.683244228363037 7.0
+656.9422210893608 5588.736328125 4.684791564941406 7.0
+656.962653661998 5570.931640625 4.682321548461914 7.0
+656.9830862344024 5570.533203125 4.683387279510498 7.0
+657.0035189066839 5580.76611328125 4.683873176574707 7.0
+657.0239513789711 5582.8603515625 4.683656215667725 7.0
+657.0443839510262 5581.94580078125 4.682690620422363 7.0
+657.0648166230749 5577.59619140625 4.683409214019775 7.0
+657.0852490948964 5572.61181640625 4.6827006340026855 7.0
+657.1056816666023 5583.97412109375 4.6827006340026855 7.0
+657.1261143383017 5570.68896484375 4.682604789733887 7.0
+657.146546809774 5584.8837890625 4.683912754058838 7.0
+657.1669793812471 5576.3154296875 4.681969165802002 7.0
+657.18741195248 5575.98486328125 4.682212829589844 7.0
+657.2078445237203 5587.890625 4.683414459228516 7.0
+657.2282771947212 5572.89990234375 4.683109760284424 7.0
+657.2487096657278 5573.6259765625 4.683452606201172 7.0
+657.2691422365024 5564.90673828125 4.682778835296631 7.0
+657.3100073778114 5577.67041015625 4.683720588684082 7.0
+657.350872618772 5572.87548828125 4.6827898025512695 7.0
+657.3917376591562 5570.53076171875 4.683897018432617 7.0
+657.432602899069 5577.38330078125 4.6848320960998535 7.0
+657.4530353689115 5573.41162109375 4.6842875480651855 7.0
+657.4734680386318 5578.13720703125 4.684707164764404 7.0
+657.4939006082423 5569.25146484375 4.68371057510376 7.0
+657.514333277737 5569.38134765625 4.68346643447876 7.0
+657.5347657469974 5562.29345703125 4.682655334472656 7.0
+657.5551983162513 5564.708984375 4.681995391845703 7.0
+657.5756309853969 5566.837890625 4.682956218719482 7.0
+657.5960634544172 5566.70556640625 4.68248987197876 7.0
+657.6164960233291 5580.93505859375 4.684910297393799 7.0
+657.6573611609128 5578.306640625 4.684287071228027 7.0
+657.6777937294755 5567.73876953125 4.6846795082092285 7.0
+657.6982263979226 5566.7197265625 4.68324089050293 7.0
+657.7186588662444 5577.71923828125 4.685641288757324 7.0
+657.7390914344578 5578.02978515625 4.684648036956787 7.0
+657.759524102672 5566.06201171875 4.683571815490723 7.0
+657.7799565706446 5573.80029296875 4.683326244354248 7.0
+657.8003892385095 5566.8330078125 4.683377742767334 7.0
+657.8208218063737 5579.1455078125 4.6842474937438965 7.0
+657.841254273997 5562.955078125 4.683665752410889 7.0
+657.8616869416292 5573.70849609375 4.685317516326904 7.0
+657.8821195091441 5571.4140625 4.684559345245361 7.0
+657.9025519764182 5573.0615234375 4.684765338897705 7.0
+657.922984643701 5573.28125 4.684983730316162 7.0
+657.9434172108668 5585.65234375 4.686168193817139 7.0
+657.963849677908 5573.88720703125 4.6847310066223145 7.0
+657.9842823447252 5576.998046875 4.6852216720581055 7.0
+658.0047149115417 5572.83203125 4.685207366943359 7.0
+658.0251473782337 5591.4453125 4.686027526855469 7.0
+658.045580044818 5577.2529296875 4.684753894805908 7.0
+658.0660126114017 5571.40283203125 4.685390949249268 7.0
+658.086445277746 5571.66064453125 4.68649435043335 7.0
+658.1068777439796 5572.16455078125 4.685576438903809 7.0
+658.1273103100975 5575.7294921875 4.6853718757629395 7.0
+658.147742976209 5570.751953125 4.684487819671631 7.0
+658.1681754420933 5566.447265625 4.684586048126221 7.0
+658.1886080078621 5575.8603515625 4.685922145843506 7.0
+658.2090406736243 5573.53369140625 4.686175346374512 7.0
+658.2294731392758 5579.8740234375 4.685917377471924 7.0
+658.2499057046953 5580.8876953125 4.6864776611328125 7.0
+658.2703383701082 5576.0126953125 4.686763763427734 7.0
+658.3112034005972 5574.80029296875 4.68553352355957 7.0
+658.3316360656609 5571.646484375 4.686407566070557 7.0
+658.3520686306147 5581.46630859375 4.686409950256348 7.0
+658.3725011954521 5581.7958984375 4.68584680557251 7.0
+658.4133663247703 5568.84228515625 4.685557842254639 7.0
+658.4337988893676 5573.583984375 4.686107635498047 7.0
+658.4542314537393 5583.12353515625 4.687233924865723 7.0
+658.49509658225 5577.6201171875 4.686956405639648 7.0
+658.5155291463816 5580.0732421875 4.68721866607666 7.0
+658.5359616104033 5569.92822265625 4.685595989227295 7.0
+658.5563942743029 5578.11181640625 4.686687469482422 7.0
+658.5768268380925 5579.0498046875 4.686404228210449 7.0
+658.597259301765 5574.03076171875 4.685751914978027 7.0
+658.6176919653226 5576.919921875 4.686521053314209 7.0
+658.6585571920805 5576.8134765625 4.685986042022705 7.0
+658.6789896553964 5582.98779296875 4.6860857009887695 7.0
+658.6994222184876 5580.0146484375 4.687110900878906 7.0
+658.7198548815795 5582.439453125 4.686468601226807 7.0
+658.7402873445535 5584.76611328125 4.687646389007568 7.0
+658.7607199074046 5591.29541015625 4.687986850738525 7.0
+658.7811525700308 5586.68408203125 4.688269138336182 7.0
+658.8015850326483 5584.53076171875 4.687510967254639 7.0
+658.8220175951574 5574.54150390625 4.686619281768799 7.0
+658.8424502576672 5591.796875 4.688384532928467 7.0
+658.8628828199362 5584.89990234375 4.6884846687316895 7.0
+658.8833152820953 5576.84814453125 4.6869425773620605 7.0
+658.9037479442559 5585.97021484375 4.688094615936279 7.0
+658.9241805061756 5577.85107421875 4.686901092529297 7.0
+658.9446130681026 5577.35009765625 4.686403274536133 7.0
+658.9650456299132 5585.177734375 4.687299728393555 7.0
+658.9854781916001 5587.1416015625 4.688168048858643 7.0
+659.0059108531786 5588.095703125 4.688033103942871 7.0
+659.0263433146392 5591.31689453125 4.688027858734131 7.0
+659.0467758759769 5587.31494140625 4.6885881423950195 7.0
+659.0672085373226 5595.302734375 4.688582897186279 7.0
+659.1693712420529 5594.0546875 4.68839168548584 7.0
+659.1898038026993 5595.13232421875 4.687756538391113 7.0
+659.2102363632293 5592.35693359375 4.688056468963623 7.0
+659.2306690237529 5601.87353515625 4.689517974853516 7.0
+659.2511014840493 5599.88916015625 4.688435077667236 7.0
+659.2715340443465 5598.7998046875 4.68714714050293 7.0
+659.2919667044043 5603.2099609375 4.689634799957275 7.0
+659.3123991644679 5596.572265625 4.689475059509277 7.0
+659.3328317244159 5600.53271484375 4.689143657684326 7.0
+659.3532643842409 5606.05517578125 4.6897807121276855 7.0
+659.373696943956 5602.31005859375 4.689435958862305 7.0
+659.3941294036704 5602.0625 4.689263343811035 7.0
+659.4145620631461 5614.71337890625 4.691613674163818 7.0
+659.4349946226284 5606.8291015625 4.689732551574707 7.0
+659.4554270818771 5610.703125 4.690507888793945 7.0
+659.4758597411201 5612.78173828125 4.690188884735107 7.0
+659.4962923002531 5610.1591796875 4.690611362457275 7.0
+659.5167249592632 5604.21875 4.690726280212402 7.0
+659.5371574181627 5608.36181640625 4.690601348876953 7.0
+659.5984550943904 5612.90625 4.690808296203613 7.0
+659.6188876529413 5610.09033203125 4.690244197845459 7.0
+659.6393203113694 5606.94140625 4.690608501434326 7.0
+659.6597527696867 5613.36279296875 4.691613674163818 7.0
+659.6801853278885 5610.6494140625 4.691478252410889 7.0
+659.7006179859745 5614.50390625 4.690688133239746 7.0
+659.7210504440518 5610.3994140625 4.6908955574035645 7.0
+659.7414830020207 5615.970703125 4.69114875793457 7.0
+659.7619156597502 5618.4033203125 4.690992832183838 7.0
+659.7823481174855 5615.15478515625 4.6918864250183105 7.0
+659.8027807751059 5620.0302734375 4.691346168518066 7.0
+659.8232132327248 5621.36474609375 4.692258834838867 7.0
+659.8436457901043 5626.6025390625 4.6934733390808105 7.0
+659.8640784474919 5619.13916015625 4.691792011260986 7.0
+659.9049434617918 5620.29296875 4.6926422119140625 7.0
+659.9253761188302 5618.9375 4.691771030426025 7.0
+659.9458086758677 5616.6904296875 4.691669464111328 7.0
+659.9662411326644 5619.8173828125 4.692389011383057 7.0
+660.0071063460346 5628.83984375 4.693863868713379 7.0
+660.0275388026057 5623.26708984375 4.693859100341797 7.0
+660.047971459062 5623.23681640625 4.693102836608887 7.0
+660.0684040153938 5620.46044921875 4.692781925201416 7.0
+660.0888366717336 5636.76611328125 4.694457530975342 7.0
+660.1092691278391 5634.103515625 4.694808006286621 7.0
+660.129701683938 5631.52783203125 4.694546699523926 7.0
+660.1501343399286 5632.99560546875 4.694820880889893 7.0
+660.1705667958013 5635.00048828125 4.694798469543457 7.0
+660.190999351551 5628.39892578125 4.693933963775635 7.0
+660.2114320071923 5637.17529296875 4.695075035095215 7.0
+660.2318644628322 5634.84619140625 4.694975852966309 7.0
+660.2727296737576 5636.53564453125 4.6948370933532715 7.0
+661.0695994606431 5656.97900390625 4.698225021362305 7.0
+661.0900319122011 5650.3857421875 4.700620174407959 7.0
+661.1104644637671 5657.50537109375 4.702655792236328 7.0
+661.1308971153339 5664.140625 4.701752662658691 7.0
+661.1513295666664 5665.630859375 4.703035831451416 7.0
+661.1717622179931 5662.0302734375 4.701712608337402 7.0
+661.1921946692091 5665.03662109375 4.702928066253662 7.0
+661.2534923222702 5670.24755859375 4.7031779289245605 7.0
+661.2739248731377 5672.44677734375 4.703486442565918 7.0
+661.2943575238824 5674.05859375 4.704304218292236 7.0
+661.3147899745163 5666.26708984375 4.701611042022705 7.0
+661.3352225251438 5666.22412109375 4.702404499053955 7.0
+661.3556551756628 5664.173828125 4.702708721160889 7.0
+661.3760877260647 5669.8681640625 4.703047275543213 7.0
+661.416952826512 5672.3193359375 4.703056812286377 7.0
+661.437385376681 5664.01171875 4.703289985656738 7.0
+661.4578179267264 5668.451171875 4.703428745269775 7.0
+661.4782504766627 5664.89501953125 4.7010908126831055 7.0
+661.4986830265989 5668.97607421875 4.702353000640869 7.0
+661.5191156764122 5673.130859375 4.703907012939453 7.0
+661.5395481261148 5662.29833984375 4.7025017738342285 7.0
+661.5599806757018 5670.55908203125 4.703474521636963 7.0
+661.5804133251659 5665.244140625 4.702600002288818 7.0
+661.6212783239898 5669.490234375 4.702519416809082 7.0
+661.641710973221 5672.818359375 4.702723979949951 7.0
+661.6621434223416 5667.69189453125 4.702744960784912 7.0
+661.6825759714629 5668.6689453125 4.703564643859863 7.0
+661.7030086204613 5682.8408203125 4.704972267150879 7.0
+661.7234410693491 5672.0947265625 4.703076362609863 7.0
+661.7438737182383 5675.05615234375 4.703094959259033 7.0
+661.7643062668867 5684.9892578125 4.704662322998047 7.0
+661.7847387155416 5670.10400390625 4.703083515167236 7.0
+661.8051713640816 5668.0859375 4.702306747436523 7.0
+661.8256038126128 5673.35595703125 4.703322410583496 7.0
+661.8460363610357 5670.79296875 4.702410697937012 7.0
+661.8664690093428 5684.1650390625 4.704708576202393 7.0
+661.8869014575248 5688.51904296875 4.703273296356201 7.0
+661.9073340055984 5677.419921875 4.7036662101745605 7.0
+661.9277666536727 5684.10009765625 4.70485258102417 7.0
+661.9481992016226 5675.4072265625 4.701884746551514 7.0
+661.9686317495798 5679.69189453125 4.70358943939209 7.0
+662.0094968450212 5677.1513671875 4.703186511993408 7.0
+662.0299293926291 5684.7353515625 4.703029632568359 7.0
+662.050361940237 5683.26904296875 4.705327987670898 7.0
+662.0707944876049 5694.79248046875 4.705027103424072 7.0
+662.0912271349807 5677.2255859375 4.703444957733154 7.0
+662.1116595822386 5679.83935546875 4.704068660736084 7.0
+662.13209212949 5678.8466796875 4.704147815704346 7.0
+662.1525247766331 5686.998046875 4.704545497894287 7.0
+662.1729572236582 5682.19970703125 4.702938079833984 7.0
+662.1933897705603 5683.5625 4.704452037811279 7.0
+662.2138224173541 5676.734375 4.704381465911865 7.0
+662.2342548641464 5683.76220703125 4.70369291305542 7.0
+662.275120057493 5683.912109375 4.705376148223877 7.0
+662.2955525040525 5679.07421875 4.705729007720947 7.0
+662.3159851504897 5674.99462890625 4.703449249267578 7.0
+662.3364176968171 5684.86376953125 4.7046074867248535 7.0
+662.3568502431444 5686.47216796875 4.70522403717041 7.0
+662.3772827893481 5697.3095703125 4.706003189086914 7.0
+662.3977153354426 5697.14990234375 4.705649375915527 7.0
+662.4181478814135 5703.16259765625 4.706379413604736 7.0
+662.4385804273916 5697.19482421875 4.705949306488037 7.0
+662.4590129732533 5697.23291015625 4.705023765563965 7.0
+662.4794454189978 5682.74462890625 4.705068588256836 7.0
+662.4998780647365 5693.45703125 4.706303596496582 7.0
+662.5203106103654 5691.22607421875 4.705003261566162 7.0
+662.5407431558706 5686.099609375 4.705164432525635 7.0
+662.561175701383 5686.787109375 4.704395771026611 7.0
+662.5816082466627 5691.28369140625 4.705577373504639 7.0
+662.6020408920522 5687.65771484375 4.7043776512146 7.0
+662.6224733372146 5684.0400390625 4.705755233764648 7.0
+662.6429058823778 5686.896484375 4.70568323135376 7.0
+662.6633385274181 5687.18212890625 4.705772876739502 7.0
+662.6837709723477 5682.59765625 4.705050468444824 7.0
+662.7042035172781 5688.92626953125 4.704976558685303 7.0
+662.7246361620855 5694.39208984375 4.706272602081299 7.0
+662.7450686067823 5683.31884765625 4.7052083015441895 7.0
+662.7655012514806 5698.70751953125 4.706107139587402 7.0
+662.785933795938 5688.83349609375 4.7054057121276855 7.0
+662.8267988848675 5694.0771484375 4.7052106857299805 7.0
+662.8472314292085 5681.6962890625 4.704870700836182 7.0
+662.8676638734396 5683.38330078125 4.704558372497559 7.0
+662.8880965176722 5688.74365234375 4.705508708953857 7.0
+662.908529061664 5690.18994140625 4.706324100494385 7.0
+662.9289616056631 5689.04296875 4.706653118133545 7.0
+662.9493941496621 5697.498046875 4.706870079040527 7.0
+662.9698266935375 5686.43408203125 4.7067694664001465 7.0
+662.9902592373037 5694.6298828125 4.707239151000977 7.0
+663.0106917809535 5701.1865234375 4.7069268226623535 7.0
+663.031124324596 5692.21826171875 4.706612586975098 7.0
+663.0515569681302 5690.81884765625 4.70543909072876 7.0
+663.0719895115471 5696.23681640625 4.706920623779297 7.0
+663.0924219549561 5701.7578125 4.707812786102295 7.0
+663.1128545982574 5694.421875 4.707076549530029 7.0
+663.1332870414408 5696.201171875 4.707379341125488 7.0
+663.1537195846176 5690.91162109375 4.707016944885254 7.0
+663.1945846706367 5689.11328125 4.706418514251709 7.0
+663.3376125694122 5684.80419921875 4.705840587615967 7.0
+663.3580451117814 5704.2099609375 4.70863151550293 7.0
+663.3784775540335 5691.43359375 4.706214904785156 7.0
+663.3989101962798 5692.4091796875 4.70613956451416 7.0
+663.4193427384162 5698.5673828125 4.707143306732178 7.0
+663.4397752804362 5680.4140625 4.706049919128418 7.0
+663.4602078224489 5686.50048828125 4.706223011016846 7.0
+663.4806403643524 5703.18798828125 4.708326816558838 7.0
+663.5010729062487 5688.2802734375 4.7060346603393555 7.0
+663.5215054480359 5700.1025390625 4.70758056640625 7.0
+663.5419379897066 5696.1044921875 4.7061591148376465 7.0
+663.562370531261 5679.814453125 4.7057695388793945 7.0
+663.5828031728088 5691.36474609375 4.706788063049316 7.0
+663.6032356142459 5704.02880859375 4.7080230712890625 7.0
+663.6441007969988 5702.89697265625 4.706853866577148 7.0
+663.6645332382031 5689.1796875 4.707278251647949 7.0
+663.6849658794017 5686.73828125 4.706669330596924 7.0
+663.7053984204904 5695.84765625 4.707467555999756 7.0
+663.7258308614619 5688.0576171875 4.705015659332275 7.0
+663.7462635024276 5696.5244140625 4.708433151245117 7.0
+663.7666959432827 5693.892578125 4.7052812576293945 7.0
+663.807561124755 5702.83056640625 4.707563400268555 7.0
+663.8279935654937 5696.33935546875 4.707259654998779 7.0
+663.848426206001 5687.65966796875 4.706094741821289 7.0
+663.8688587465003 5688.93310546875 4.706430912017822 7.0
+663.8892911868897 5699.21435546875 4.7074103355407715 7.0
+663.9301563675472 5689.48388671875 4.707510948181152 7.0
+663.9505888078202 5697.869140625 4.709062576293945 7.0
+663.9710214478619 5693.90673828125 4.707794666290283 7.0
+663.9914539880119 5696.50244140625 4.708065509796143 7.0
+664.0118865279364 5694.462890625 4.707632064819336 7.0
+664.032319067861 5690.861328125 4.706835746765137 7.0
+664.0527516076618 5692.2509765625 4.707550525665283 7.0
+664.0731841474699 5697.56640625 4.707604885101318 7.0
+664.0936167871623 5685.919921875 4.706293106079102 7.0
+664.114049226846 5697.23974609375 4.7090678215026855 7.0
+664.1344818663056 5696.07421875 4.7085700035095215 7.0
+664.1549144058808 5690.56884765625 4.708637714385986 7.0
+664.1753468452152 5696.43115234375 4.708642482757568 7.0
+664.1957794845584 5697.6904296875 4.708442211151123 7.0
+664.2162120239009 5689.73388671875 4.708897590637207 7.0
+664.2366444631189 5690.28662109375 4.708062648773193 7.0
+664.2570771022292 5694.1962890625 4.709347248077393 7.0
+664.2775096412224 5698.78564453125 4.709300518035889 7.0
+664.2979420802076 5691.9423828125 4.708490371704102 7.0
+664.3183747192015 5700.8193359375 4.7086687088012695 7.0
+664.3388072579619 5701.74609375 4.709554672241211 7.0
+664.3592396968306 5684.9482421875 4.7079339027404785 7.0
+664.3796723354753 5699.3466796875 4.70958137512207 7.0
+664.4001048741193 5691.29052734375 4.708904266357422 7.0
+664.4205374126395 5698.38037109375 4.709220886230469 7.0
+664.4409699511671 5687.4111328125 4.707319259643555 7.0
+664.4614024895782 5693.8798828125 4.7082672119140625 7.0
+664.481835027982 5700.4501953125 4.709394931793213 7.0
+664.5022675662767 5696.0810546875 4.7090678215026855 7.0
+664.522700104455 5698.3515625 4.709322452545166 7.0
+664.543132642626 5698.97705078125 4.707683563232422 7.0
+664.5635651806879 5691.86474609375 4.708504676818848 7.0
+664.5839977187497 5689.1435546875 4.708620071411133 7.0
+664.6044303566887 5688.689453125 4.70857048034668 7.0
+664.624862794517 5705.39111328125 4.710263729095459 7.0
+664.6452954323468 5684.76904296875 4.706994533538818 7.0
+664.6657279700521 5691.08251953125 4.708285331726074 7.0
+664.686160407764 5691.33935546875 4.70918083190918 7.0
+664.7065930453537 5691.13525390625 4.708388805389404 7.0
+664.7270255828334 5690.31201171875 4.707521438598633 7.0
+664.7883231950327 5690.10986328125 4.706892967224121 7.0
+664.8087556322789 5691.146484375 4.707045555114746 7.0
+664.8291882695194 5690.2236328125 4.706878185272217 7.0
+664.8496208066499 5687.6552734375 4.706532001495361 7.0
+664.8700532436633 5683.0205078125 4.7060065269470215 7.0
+664.8904858806709 5689.96435546875 4.707852363586426 7.0
+664.9109184175686 5695.5087890625 4.7081685066223145 7.0
+664.9313510544671 5689.9833984375 4.7071213722229 7.0
+664.9517834912403 5685.7529296875 4.707714557647705 7.0
+665.0130811012277 5694.03515625 4.708532333374023 7.0
+665.0335136377762 5689.6455078125 4.707178115844727 7.0
+665.053946274209 5690.4072265625 4.708466053009033 7.0
+665.074378710633 5700.41162109375 4.710421085357666 7.0
+665.0948112469487 5702.22412109375 4.710458278656006 7.0
+665.1152437832643 5691.34619140625 4.7100605964660645 7.0
+665.1356763194563 5683.8369140625 4.708338737487793 7.0
+665.1561088556555 5686.83642578125 4.708205699920654 7.0
+665.1765414916226 5687.4833984375 4.709590911865234 7.0
+665.1969739276974 5696.95849609375 4.710142135620117 7.0
+665.2174065636646 5694.29541015625 4.710341453552246 7.0
+665.2378390995145 5690.0888671875 4.708461284637451 7.0
+665.2582715353565 5686.81640625 4.707060813903809 7.0
+665.2787041710908 5685.90283203125 4.707956314086914 7.0
+665.2991367067079 5688.8125 4.708355903625488 7.0
+665.319569142317 5698.380859375 4.707827568054199 7.0
+665.340001777935 5682.08203125 4.706819534301758 7.0
+665.3604343134357 5698.10595703125 4.708203315734863 7.0
+665.401299384197 5690.4765625 4.709108829498291 7.0
+665.421731919465 5690.51220703125 4.709044933319092 7.0
+665.4421645547263 5692.36181640625 4.7085652351379395 7.0
+665.462596989877 5687.98486328125 4.709071159362793 7.0
+665.4830295250285 5677.75244140625 4.707749843597412 7.0
+665.5034621600571 5688.6005859375 4.7082929611206055 7.0
+665.5238945950914 5683.2646484375 4.707789421081543 7.0
+665.5443271300101 5691.7578125 4.709303379058838 7.0
+665.5647597648058 5690.29931640625 4.709222793579102 7.0
+665.5851921996073 5678.6171875 4.706721782684326 7.0
+665.6056247344095 5677.28125 4.707786560058594 7.0
+665.6260573690888 5690.28369140625 4.709317207336426 7.0
+665.6464899036582 5688.6923828125 4.708873271942139 7.0
+665.6669223382269 5684.14404296875 4.706873416900635 7.0
+665.6873549726733 5687.02587890625 4.7077250480651855 7.0
+665.7077874071256 5671.86572265625 4.706362724304199 7.0
+665.7282200414629 5679.79345703125 4.7060394287109375 7.0
+665.7486525757922 5687.63623046875 4.708655834197998 7.0
+665.7895176442253 5681.064453125 4.706115245819092 7.0
+665.809950178329 5686.990234375 4.708812713623047 7.0
+665.8508152464201 5687.9228515625 4.707799434661865 7.0
+665.8712477802837 5686.26904296875 4.708125114440918 7.0
+665.8916802142703 5671.23291015625 4.7062249183654785 7.0
+665.9325453817728 5680.92529296875 4.707521438598633 7.0
+665.9529778155265 5681.7353515625 4.7073655128479 7.0
+665.9734104491654 5678.1796875 4.7087531089782715 7.0
+665.9938429826798 5674.71533203125 4.7073588371276855 7.0
+666.0142756162022 5690.98779296875 4.709184169769287 7.0
+666.0347080497158 5681.42626953125 4.70873498916626 7.0
+666.0551405831211 5678.34375 4.706786632537842 7.0
+666.0755732164107 5687.85693359375 4.710419178009033 7.0
+666.0960056496988 5683.16015625 4.709113597869873 7.0
+666.1164381828639 5680.998046875 4.708573818206787 7.0
+666.1368708160371 5681.6396484375 4.708032608032227 7.0
+666.1573033492023 5686.46728515625 4.709292888641357 7.0
+666.1777357822575 5676.91357421875 4.708078384399414 7.0
+666.2594660137765 5673.71826171875 4.7081828117370605 7.0
+666.2798985465924 5678.90771484375 4.707819938659668 7.0
+666.3003311793 5669.8662109375 4.708077430725098 7.0
+666.3207636118896 5667.78515625 4.7084641456604 7.0
+666.3411961444726 5681.97021484375 4.709543228149414 7.0
+666.3820612094205 5677.603515625 4.709024906158447 7.0
+666.4024937418872 5669.3671875 4.708905220031738 7.0
+666.4229262742447 5676.05322265625 4.709550380706787 7.0
+666.4433588064858 5676.58544921875 4.7097578048706055 7.0
+666.4637913387196 5676.78857421875 4.709991931915283 7.0
+666.4842238709607 5673.2666015625 4.709097385406494 7.0
+666.5250890350871 5665.65673828125 4.708131313323975 7.0
+666.5455214670947 5675.119140625 4.70853853225708 7.0
+666.5659539991029 5675.13427734375 4.709177494049072 7.0
+666.6272515946548 5678.70751953125 4.708889007568359 7.0
+666.6476842264237 5669.5234375 4.708205699920654 7.0
+666.6681167580828 5665.259765625 4.7088446617126465 7.0
+666.688549189741 5684.98291015625 4.708775043487549 7.0
+666.7089818212771 5670.1123046875 4.710241317749023 7.0
+666.7294143528197 5669.94580078125 4.709222316741943 7.0
+666.7498468842459 5676.4833984375 4.7096028327941895 7.0
+666.7702794156648 5672.416015625 4.709483623504639 7.0
+666.7907119469746 5674.81005859375 4.709400653839111 7.0
+666.8111445782852 5669.68603515625 4.709575653076172 7.0
+666.8315770094705 5670.5712890625 4.70925235748291 7.0
+666.8520095406639 5667.3720703125 4.709748268127441 7.0
+666.8724421718507 5668.22705078125 4.708718776702881 7.0
+666.8928746029269 5672.85546875 4.710122108459473 7.0
+666.9133071338874 5659.47607421875 4.709590435028076 7.0
+666.9337397648487 5660.69970703125 4.7092413902282715 7.0
+666.9541721958012 5666.4521484375 4.7097930908203125 7.0
+666.9746047266453 5675.18701171875 4.711120128631592 7.0
+666.9950373574829 5678.919921875 4.711147308349609 7.0
+667.0154697882099 5667.958984375 4.709897518157959 7.0
+667.0563348495489 5666.6103515625 4.709956645965576 7.0
+667.0767673801529 5661.92333984375 4.709662914276123 7.0
+667.0972000107649 5658.29638671875 4.709798812866211 7.0
+667.117632441259 5660.91796875 4.709466934204102 7.0
+667.1380649716302 5665.7373046875 4.710607528686523 7.0
+667.1584976020094 5653.7294921875 4.709558963775635 7.0
+667.1789301323879 5668.46923828125 4.710262298583984 7.0
+667.1993625626419 5656.0380859375 4.709595203399658 7.0
+667.2197951929047 5657.69287109375 4.709207534790039 7.0
+667.2402277230431 5664.10205078125 4.710948467254639 7.0
+667.2606601531879 5655.83837890625 4.709590911865234 7.0
+667.2810927832179 5662.85546875 4.710779190063477 7.0
+667.3015253132398 5655.5732421875 4.709381580352783 7.0
+667.3219579432698 5657.27001953125 4.709577560424805 7.0
+667.3423903731818 5661.890625 4.710500240325928 7.0
+667.3628229030874 5662.13134765625 4.710712909698486 7.0
+667.4036879626801 5665.6357421875 4.71108341217041 7.0
+667.4445531220335 5650.412109375 4.7102131843566895 7.0
+667.4649855517127 5670.45654296875 4.711045742034912 7.0
+667.485418081269 5654.0498046875 4.709906101226807 7.0
+667.5058507107169 5660.32177734375 4.709532260894775 7.0
+667.5262831401633 5653.47802734375 4.710188865661621 7.0
+667.5671482989346 5649.66455078125 4.708301067352295 7.0
+667.587580728381 5657.732421875 4.709347248077393 7.0
+667.6080133575888 5650.46875 4.709060192108154 7.0
+667.6284458868031 5644.35400390625 4.708907127380371 7.0
+667.6488784160174 5645.7021484375 4.708849906921387 7.0
+667.669310945108 5657.99755859375 4.710607528686523 7.0
+667.6897434742059 5647.146484375 4.710306167602539 7.0
+667.7101760031874 5652.89208984375 4.709027290344238 7.0
+667.7306085321616 5658.20068359375 4.709691524505615 7.0
+667.751041061143 5644.4921875 4.708524703979492 7.0
+667.7714734900073 5642.490234375 4.7087178230285645 7.0
+667.7919061188659 5643.62744140625 4.7089643478393555 7.0
+667.8123386476145 5649.12353515625 4.70967435836792 7.0
+667.8327711763632 5643.9736328125 4.7100605964660645 7.0
+667.8532037049881 5643.76611328125 4.7092671394348145 7.0
+667.8940688622533 5648.8837890625 4.7100749015808105 7.0
+667.9145012907611 5646.16064453125 4.710002899169922 7.0
+667.9349338192769 5643.8056640625 4.710047245025635 7.0
+667.9553664477862 5643.7431640625 4.709258079528809 7.0
+667.9757988761849 5642.34033203125 4.709848880767822 7.0
+667.9962314044678 5640.806640625 4.709855556488037 7.0
+668.016664032868 5645.01513671875 4.70916223526001 7.0
+668.0575289893095 5640.91796875 4.709691047668457 7.0
+668.0779616174696 5632.380859375 4.7084527015686035 7.0
+668.0983940456354 5641.42822265625 4.709932804107666 7.0
+668.1188266736863 5648.60986328125 4.710339546203613 7.0
+668.1392592017364 5643.58349609375 4.71104097366333 7.0
+668.1596917297793 5632.6943359375 4.709153652191162 7.0
+668.180124257713 5632.43994140625 4.708586692810059 7.0
+668.2005567855231 5635.71484375 4.709814071655273 7.0
+668.2209893134568 5636.1455078125 4.709277629852295 7.0
+668.2414218412741 5630.35888671875 4.7082085609436035 7.0
+668.261854368975 5638.16064453125 4.709681034088135 7.0
+668.2822868966687 5636.916015625 4.70932149887085 7.0
+668.3027194243696 5635.78857421875 4.709498882293701 7.0
+668.3231519519468 5632.4072265625 4.708795547485352 7.0
+668.3435844795313 5631.326171875 4.709871768951416 7.0
+668.3640170071158 5628.66650390625 4.7083868980407715 7.0
+668.3844495345838 5638.35986328125 4.709586143493652 7.0
+668.4048821620454 5629.1416015625 4.709517955780029 7.0
+668.4253145895127 5624.11474609375 4.70932149887085 7.0
+668.4457471168571 5641.3515625 4.709837913513184 7.0
+668.4661797440931 5619.82763671875 4.708466529846191 7.0
+668.486612171444 5629.90869140625 4.709237098693848 7.0
+668.5070446986792 5625.88671875 4.709455490112305 7.0
+668.5274773257916 5628.9228515625 4.709423542022705 7.0
+668.547909753026 5627.6806640625 4.708613872528076 7.0
+668.5683422801376 5632.00927734375 4.708866119384766 7.0
+668.5887749071408 5618.5595703125 4.70665979385376 7.0
+668.6092073341424 5628.78173828125 4.708956718444824 7.0
+668.6296399611383 5622.65283203125 4.708731174468994 7.0
+668.6705049149095 5624.12841796875 4.70939302444458 7.0
+668.690937541789 5632.11376953125 4.709970951080322 7.0
+668.7113700685586 5627.1123046875 4.709734916687012 7.0
+668.7318025953282 5624.16943359375 4.708576679229736 7.0
+668.7726676487437 5614.60693359375 4.7080206871032715 7.0
+668.7931001753968 5619.583984375 4.708968162536621 7.0
+668.8135327019263 5621.76708984375 4.708867073059082 7.0
+668.8339652285795 5616.00390625 4.708757400512695 7.0
+668.8543978550006 5630.36962890625 4.709767818450928 7.0
+668.87483038153 5626.166015625 4.70966911315918 7.0
+668.8952628079496 5621.9755859375 4.70891809463501 7.0
+668.9156954343707 5617.89892578125 4.70922327041626 7.0
+668.9361279606674 5611.91796875 4.708318710327148 7.0
+668.9565603869705 5623.884765625 4.709108829498291 7.0
+668.9769930132752 5614.39013671875 4.709170341491699 7.0
+668.9974255394554 5609.123046875 4.7086615562438965 7.0
+669.0178579656422 5621.3486328125 4.709519863128662 7.0
+669.0587230178935 5613.03515625 4.708912372589111 7.0
+669.0791555439646 5617.732421875 4.709939956665039 7.0
+669.0995881700364 5605.24853515625 4.708085536956787 7.0
+669.1200205959831 5608.85986328125 4.708206653594971 7.0
+669.1404532208908 5605.38037109375 4.708481311798096 7.0
+669.1608857468455 5602.298828125 4.708326816558838 7.0
+669.2426158500675 5612.201171875 4.707796573638916 7.0
+669.2630483757894 5609.65087890625 4.708618640899658 7.0
+669.2834809015112 5604.53271484375 4.706658840179443 7.0
+669.3039134271094 5612.74267578125 4.7083539962768555 7.0
+669.3243459527148 5605.81396484375 4.707586288452148 7.0
+669.3447784783202 5596.154296875 4.706813335418701 7.0
+669.4265086801461 5607.98291015625 4.708195209503174 7.0
+669.4673736308905 5604.30078125 4.708047389984131 7.0
+669.4878062561402 5609.375 4.708248138427734 7.0
+669.5082387815128 5599.560546875 4.7076215744018555 7.0
+669.5286712066518 5597.111328125 4.706460475921631 7.0
+669.5695363570412 5606.85693359375 4.707609176635742 7.0
+669.5899687821802 5598.36767578125 4.707273483276367 7.0
+669.6104014071971 5590.00830078125 4.706110954284668 7.0
+669.6308339323368 5596.10595703125 4.708215713500977 7.0
+669.6512664572365 5601.42138671875 4.707777976989746 7.0
+669.6716989822598 5599.36572265625 4.707359790802002 7.0
+669.6921315071668 5592.68505859375 4.706989288330078 7.0
+669.7125640320664 5586.00439453125 4.706048965454102 7.0
+669.7329965569734 5589.603515625 4.706698417663574 7.0
+669.7534290817639 5596.82275390625 4.707586288452148 7.0
+669.7738616065471 5593.80322265625 4.7066802978515625 7.0
+669.7942941313377 5590.46337890625 4.7066731452941895 7.0
+669.8147266561282 5589.4306640625 4.706608772277832 7.0
+669.835159180795 5590.53271484375 4.707365989685059 7.0
+669.8555917054691 5584.93408203125 4.706051826477051 7.0
+669.8760243300276 5597.6142578125 4.7080464363098145 7.0
+669.8964568546944 5589.2353515625 4.706528186798096 7.0
+669.9168892792513 5599.478515625 4.707897186279297 7.0
+669.9373219036934 5591.2177734375 4.70780611038208 7.0
+669.9577544282438 5578.04052734375 4.706891059875488 7.0
+669.9781868526843 5585.27685546875 4.707289218902588 7.0
+669.9986194771263 5589.00732421875 4.707644462585449 7.0
+670.0190520014439 5585.796875 4.706885814666748 7.0
+670.0803495744112 5588.72314453125 4.708192825317383 7.0
+670.1007819987353 5593.3115234375 4.708585739135742 7.0
+670.1212146229445 5587.47607421875 4.707508563995361 7.0
+670.1416471471457 5582.1279296875 4.707603454589844 7.0
+670.1620797712385 5579.228515625 4.707051753997803 7.0
+670.1825121953298 5588.83544921875 4.708226680755615 7.0
+670.2029447194145 5580.58544921875 4.708044052124023 7.0
+670.2233773435073 5585.59033203125 4.708616733551025 7.0
+670.2438097675986 5588.69775390625 4.708580017089844 7.0
+670.2642422915669 5580.78857421875 4.707592010498047 7.0
+670.2846748155425 5577.80029296875 4.707128047943115 7.0
+670.3051073394017 5592.09228515625 4.709040641784668 7.0
+670.3255398633701 5586.73681640625 4.708332538604736 7.0
+670.34597248723 5587.642578125 4.708171844482422 7.0
+670.4072700585675 5591.337890625 4.708797931671143 7.0
+670.4277024823095 5573.20751953125 4.707304000854492 7.0
+670.4481351060458 5593.32861328125 4.709009170532227 7.0
+670.4685676297886 5585.85791015625 4.707947731018066 7.0
+670.509432677034 5577.7880859375 4.707698822021484 7.0
+670.5298652006604 5592.314453125 4.708728790283203 7.0
+670.5502976241696 5577.33837890625 4.706338882446289 7.0
+670.570730247673 5588.6484375 4.708402633666992 7.0
+670.591162771183 5577.10400390625 4.707088470458984 7.0
+670.6115951946922 5573.36328125 4.706582546234131 7.0
+670.6320278180792 5580.21044921875 4.708067417144775 7.0
+670.6728929648598 5589.39013671875 4.708205699920654 7.0
+670.6933253882526 5585.87255859375 4.708405494689941 7.0
+670.7137579116461 5574.6630859375 4.706633567810059 7.0
+670.7341905349167 5584.60498046875 4.708211898803711 7.0
+670.7546229581931 5576.33447265625 4.70665979385376 7.0
+670.7750554813538 5576.97314453125 4.708131790161133 7.0
+670.7954881046244 5574.2265625 4.707589149475098 7.0
+670.8159205277843 5582.8837890625 4.708629131317139 7.0
+670.836353050945 5584.34228515625 4.709016799926758 7.0
+670.856785674041 5579.76123046875 4.708667755126953 7.0
+670.8772181971435 5587.4013671875 4.7096147537231445 7.0
+670.897650720246 5599.29443359375 4.710840702056885 7.0
+670.918083243283 5585.60302734375 4.709588050842285 7.0
+670.9385157662691 5596.013671875 4.709867000579834 7.0
+670.9589482892552 5585.80419921875 4.709697246551514 7.0
+670.979380812234 5584.38134765625 4.708658218383789 7.0
+670.9998133351619 5577.1513671875 4.707984924316406 7.0
+671.0202458580898 5578.240234375 4.707895755767822 7.0
+671.0406783809522 5579.958984375 4.708739280700684 7.0
+671.0611108038211 5574.14404296875 4.7083740234375 7.0
+671.0815434266333 5573.6435546875 4.708540916442871 7.0
+671.1224085721915 5575.09228515625 4.708428382873535 7.0
+671.142840994944 5575.24169921875 4.708404064178467 7.0
+671.1837061403276 5584.20947265625 4.709527492523193 7.0
+671.2245710856514 5583.89453125 4.7086710929870605 7.0
+671.245003708289 5574.18359375 4.707880973815918 7.0
+671.2654361308669 5587.09765625 4.708658695220947 7.0
+671.2858686534382 5582.46826171875 4.708850383758545 7.0
+671.3063012760176 5590.1025390625 4.709150791168213 7.0
+671.3267336985373 5580.83935546875 4.708275318145752 7.0
+671.3471662209922 5585.138671875 4.709024906158447 7.0
+671.3675988434552 5579.6396484375 4.7081618309021 7.0
+671.3880313659174 5581.29052734375 4.709247589111328 7.0
+671.4084638883141 5584.9072265625 4.708874702453613 7.0
+671.4288964107182 5587.74462890625 4.709740161895752 7.0
+671.4493289331222 5587.4013671875 4.70957088470459 7.0
+671.4697614554607 5581.275390625 4.708755016326904 7.0
+671.4901939777483 5583.73388671875 4.70857572555542 7.0
+671.5106265000941 5580.8076171875 4.708346366882324 7.0
+671.5310590223744 5598.904296875 4.709914684295654 7.0
+671.5514915446038 5586.85595703125 4.709120750427246 7.0
+671.5719240668332 5591.52685546875 4.709150314331055 7.0
+671.592356689056 5594.1552734375 4.709527015686035 7.0
+671.6127891112264 5586.3974609375 4.708766937255859 7.0
+671.6332217333984 5585.73291015625 4.709207534790039 7.0
+671.6536541555033 5590.2421875 4.7094573974609375 7.0
+671.6740866776163 5590.84521484375 4.709470272064209 7.0
+671.6945192997227 5588.6494140625 4.709719181060791 7.0
+671.7149517217767 5596.6298828125 4.71061897277832 7.0
+671.755816865887 5596.71630859375 4.710251331329346 7.0
+671.7762492878755 5593.97216796875 4.710812091827393 7.0
+671.7966818098721 5591.380859375 4.709041118621826 7.0
+671.8171144318039 5595.6767578125 4.710140228271484 7.0
+671.8375468537415 5600.07373046875 4.710427761077881 7.0
+671.8579794756806 5596.14501953125 4.710229873657227 7.0
+671.8784119975608 5596.08837890625 4.71044921875 7.0
+671.8988444194329 5595.330078125 4.709249973297119 7.0
+671.9192770413138 5597.83837890625 4.71005916595459 7.0
+671.9397095631284 5601.40771484375 4.7110915184021 7.0
+671.9601420849503 5598.57373046875 4.710052967071533 7.0
+671.9805746067141 5602.8525390625 4.7100138664245605 7.0
+672.0214396502342 5603.7333984375 4.71129035949707 7.0
+672.0418722719987 5594.56494140625 4.710458755493164 7.0
+672.0623046936962 5594.880859375 4.711002826690674 7.0
+672.0827372154017 5598.59130859375 4.710979461669922 7.0
+672.1031698370498 5592.33447265625 4.710351467132568 7.0
+672.1236022586891 5592.05224609375 4.709844589233398 7.0
+672.1440348803371 5601.60009765625 4.710362434387207 7.0
+672.1848998235073 5589.68359375 4.709474563598633 7.0
+672.2053324450972 5597.49853515625 4.711023330688477 7.0
+672.2257649666863 5600.65478515625 4.710175514221191 7.0
+672.2461973882091 5593.00537109375 4.707564830780029 7.0
+672.2666300097408 5598.4716796875 4.709671497344971 7.0
+672.2870625312135 5596.02978515625 4.709991455078125 7.0
+672.3074949526781 5613.5556640625 4.711367607116699 7.0
+672.3483599956235 5605.3984375 4.710841655731201 7.0
+672.3892251384459 5656.11767578125 4.715235710144043 7.0
+672.4096575598596 5648.68994140625 4.715626239776611 7.0
+672.4300901812094 5627.1806640625 4.712738037109375 7.0
+672.4505227025656 5616.07958984375 4.711790561676025 7.0
+672.4709552238637 5621.71826171875 4.713036060333252 7.0
+672.4913877452127 5629.31005859375 4.713183879852295 7.0
+672.5322527878088 5623.40234375 4.712996482849121 7.0
+672.5526853090414 5624.46923828125 4.712157726287842 7.0
+672.5731178303395 5615.47119140625 4.712465763092041 7.0
+672.5935503515793 5620.7578125 4.71172571182251 7.0
+672.6139829727545 5610.57763671875 4.711238861083984 7.0
+672.6344153939935 5604.27587890625 4.711309909820557 7.0
+672.6548480151687 5615.25927734375 4.711968421936035 7.0
+672.6752805363503 5614.22705078125 4.711379528045654 7.0
+672.695712957473 5617.36181640625 4.711822032928467 7.0
+672.7161455786554 5624.56298828125 4.713024139404297 7.0
+672.7365780997716 5619.75048828125 4.712989330291748 7.0
+672.7570105208943 5619.1689453125 4.712539196014404 7.0
+672.777443141953 5622.1533203125 4.71334171295166 7.0
+672.7978756630182 5623.19921875 4.712602138519287 7.0
+672.8183080840827 5614.25732421875 4.711686134338379 7.0
+672.8387407051487 5616.2333984375 4.711574077606201 7.0
+672.8591732262066 5628.326171875 4.71342658996582 7.0
+672.8796057472136 5625.2744140625 4.712881088256836 7.0
+672.9000382682134 5623.2109375 4.712411880493164 7.0
+672.9204707892204 5622.93994140625 4.7136688232421875 7.0
+672.9409033101692 5636.630859375 4.713809967041016 7.0
+672.961335831118 5622.05078125 4.713529109954834 7.0
+672.9817683520596 5631.3046875 4.713857173919678 7.0
+673.0022008730084 5625.0576171875 4.713226318359375 7.0
+673.02263339395 5641.21875 4.7150468826293945 7.0
+673.0430659148406 5631.2197265625 4.713482856750488 7.0
+673.1043634775051 5640.13037109375 4.715993404388428 7.0
+673.1247960983383 5633.74560546875 4.714629173278809 7.0
+673.1452285191626 5633.39208984375 4.715829849243164 7.0
+673.1656611399958 5633.12255859375 4.715941429138184 7.0
+673.2065260816598 5644.8544921875 4.7171430587768555 7.0
+673.2269587024275 5637.59765625 4.716917514801025 7.0
+673.2473912232017 5630.69189453125 4.716066360473633 7.0
+673.2678236439679 5643.0517578125 4.716313362121582 7.0
+673.2882562647428 5639.82861328125 4.715692520141602 7.0
+673.3086887854588 5648.14599609375 4.716950416564941 7.0
+673.3291212062322 5623.5078125 4.715600490570068 7.0
+673.3495538269417 5635.40771484375 4.716580867767334 7.0
+673.3699863476577 5643.04931640625 4.716233730316162 7.0
+673.390418968309 5643.603515625 4.716557502746582 7.0
+673.4108513890242 5647.32080078125 4.718164920806885 7.0
+673.4312839097402 5643.0810546875 4.717138290405273 7.0
+673.4517165303332 5629.908203125 4.716440200805664 7.0
+673.4721489510484 5642.2568359375 4.717789649963379 7.0
+673.492581471648 5641.1083984375 4.71750020980835 7.0
+673.5130140922993 5649.68408203125 4.718496799468994 7.0
+673.5334465129563 5660.32373046875 4.718823432922363 7.0
+673.5538790335559 5650.17041015625 4.718980312347412 7.0
+673.5743116541489 5647.4267578125 4.717426300048828 7.0
+673.5947440747477 5651.96875 4.718692302703857 7.0
+673.615176695348 5649.16357421875 4.7185235023498535 7.0
+673.6356092158821 5657.18017578125 4.721433639526367 7.0
+673.656041636481 5652.64111328125 4.718967437744141 7.0
+673.6764742570231 5647.4619140625 4.717772006988525 7.0
+673.6969067775572 5653.76806640625 4.7187323570251465 7.0
+673.7173391980978 5652.646484375 4.719048976898193 7.0
+673.7377718186399 5665.46826171875 4.720567226409912 7.0
+673.758204339174 5656.24755859375 4.718928813934326 7.0
+673.7786367596564 5653.7109375 4.71925687789917 7.0
+673.7990693801403 5658.2509765625 4.7193403244018555 7.0
+673.8195019006744 5659.25927734375 4.720653057098389 7.0
+673.8399343211568 5653.2099609375 4.719119548797607 7.0
+673.8603669416407 5663.45947265625 4.72067403793335 7.0
+673.8807994621166 5667.4130859375 4.720698833465576 7.0
+673.9012320825423 5664.78857421875 4.7205681800842285 7.0
+673.9216645030247 5657.90869140625 4.720096111297607 7.0
+673.9420970234423 5666.2041015625 4.720391750335693 7.0
+673.962529643868 5670.80712890625 4.721743583679199 7.0
+673.9829620643504 5661.6103515625 4.720672130584717 7.0
+674.0033945847681 5666.453125 4.720663070678711 7.0
+674.0238272051938 5666.6669921875 4.7207794189453125 7.0
+674.044259625618 5656.67236328125 4.7189555168151855 7.0
+674.0646921459775 5670.6708984375 4.721842288970947 7.0
+674.0851247664032 5670.5771484375 4.721959114074707 7.0
+674.1055572867626 5664.7958984375 4.7216973304748535 7.0
+674.1464223275543 5668.22216796875 4.721762180328369 7.0
+674.1668548479211 5664.52490234375 4.7215046882629395 7.0
+674.1872873682805 5675.70654296875 4.722870349884033 7.0
+674.2077198886473 5683.5625 4.723556995391846 7.0
+674.2281524090067 5675.36962890625 4.722811698913574 7.0
+674.2485849293735 5669.40966796875 4.722301959991455 7.0
+674.2690174497402 5666.15283203125 4.721896648406982 7.0
+674.289449870048 5674.552734375 4.722962856292725 7.0
+674.3303150107167 5674.75244140625 4.722838401794434 7.0
+674.3507476310187 5665.23876953125 4.722282886505127 7.0
+674.3711800513847 5682.99267578125 4.723870754241943 7.0
+674.3916125716933 5669.50048828125 4.722443103790283 7.0
+674.4120451919953 5671.85986328125 4.721706390380859 7.0
+674.432477612303 5678.7900390625 4.722206115722656 7.0
+674.4529101326116 5681.4326171875 4.723806858062744 7.0
+674.4733427529136 5670.39794921875 4.722952365875244 7.0
+674.4937751732214 5680.607421875 4.721767902374268 7.0
+674.5142076934717 5667.31005859375 4.721929550170898 7.0
+674.5346403137737 5670.31591796875 4.722214698791504 7.0
+674.5550727340815 5672.46826171875 4.721418380737305 7.0
+674.5755052543318 5684.994140625 4.723209857940674 7.0
+674.5959378746338 5686.64697265625 4.722979545593262 7.0
+674.6163702949416 5694.154296875 4.725346565246582 7.0
+674.6368029151927 5679.8212890625 4.723189353942871 7.0
+674.6572354354357 5678.89501953125 4.723545074462891 7.0
+674.6776679557443 5689.5458984375 4.72400426864624 7.0
+674.6981004759946 5684.86376953125 4.723620414733887 7.0
+674.7185329962376 5696.74365234375 4.725621700286865 7.0
+674.738965516488 5684.93896484375 4.723698139190674 7.0
+674.7593981367972 5686.9296875 4.724437236785889 7.0
+674.7798305570395 5686.0634765625 4.72440767288208 7.0
+674.8002630772899 5686.3857421875 4.724543571472168 7.0
+674.8411281177832 5687.3193359375 4.724407196044922 7.0
+674.8615607380343 5694.77294921875 4.725000381469727 7.0
+674.8819932582846 5687.19287109375 4.723725318908691 7.0
+674.9024256785269 5692.07958984375 4.724954605102539 7.0
+674.922858298778 5686.47119140625 4.725039958953857 7.0
+674.9432907190276 5684.302734375 4.7247443199157715 7.0
+674.9637232392706 5686.14794921875 4.725407600402832 7.0
+674.9841558595217 5691.38232421875 4.725512981414795 7.0
+675.0045882797713 5696.07861328125 4.725648880004883 7.0
+675.0250208000143 5693.47802734375 4.726249694824219 7.0
+675.0454534202654 5695.51416015625 4.725954532623291 7.0
+675.065885840515 5673.54443359375 4.7238030433654785 7.0
+675.1067509810091 5691.65673828125 4.725186347961426 7.0
+675.1271835012594 5686.1572265625 4.725964546203613 7.0
+675.2089135822462 5699.89697265625 4.726132869720459 7.0
+675.2293461024965 5694.3720703125 4.725991725921631 7.0
+675.2497786227468 5708.92578125 4.7274017333984375 7.0
+675.2702112429906 5695.3193359375 4.726096153259277 7.0
+675.2906436632402 5706.62158203125 4.727389812469482 7.0
+675.311076283484 5694.1875 4.726354122161865 7.0
+675.3315088037343 5698.7626953125 4.726830959320068 7.0
+675.3519412239839 5697.45556640625 4.726140022277832 7.0
+675.3723738442859 5700.662109375 4.727168560028076 7.0
+675.3928063645362 5704.224609375 4.726134300231934 7.0
+675.413238784844 5697.68115234375 4.726217746734619 7.0
+675.4336714050878 5708.384765625 4.727536678314209 7.0
+675.4541039253381 5700.3115234375 4.726268291473389 7.0
+675.4745363456459 5702.92822265625 4.726236820220947 7.0
+675.4949689658897 5692.84765625 4.726253986358643 7.0
+675.5154014861982 5699.5048828125 4.726860046386719 7.0
+675.5358339064478 5699.1884765625 4.726573944091797 7.0
+675.5562665267498 5702.099609375 4.725545406341553 7.0
+675.5766989470576 5703.06494140625 4.7275309562683105 7.0
+675.6175640876099 5702.42822265625 4.726373195648193 7.0
+675.6379965079177 5694.74462890625 4.726807117462158 7.0
+675.658429128227 5701.47607421875 4.727106094360352 7.0
+675.6788616485283 5706.5498046875 4.727444171905518 7.0
+675.7197266891453 5703.24951171875 4.727038860321045 7.0
+675.7401592095048 5694.96044921875 4.726945877075195 7.0
+675.7605917298133 5700.0087890625 4.725925445556641 7.0
+675.8014567704813 5703.509765625 4.727603435516357 7.0
+675.8218893908488 5710.37109375 4.727880954742432 7.0
+675.8423219111573 5694.5009765625 4.726734161376953 7.0
+675.862754331516 5701.30322265625 4.727115154266357 7.0
+675.8831869518835 5704.7177734375 4.727313995361328 7.0
+675.9036194722503 5710.14892578125 4.728035926818848 7.0
+675.924051892609 5697.9541015625 4.726351737976074 7.0
+675.9444845129765 5712.35205078125 4.7282562255859375 7.0
+675.9649170334014 5707.67529296875 4.728560924530029 7.0
+675.9853494537601 5702.142578125 4.726120471954346 7.0
+676.0057820741858 5705.12451171875 4.72676944732666 7.0
+676.046647214971 5710.61083984375 4.729020595550537 7.0
+676.0670796353952 5705.8955078125 4.728896141052246 7.0
+676.0875121558201 5703.13330078125 4.7267231941223145 7.0
+676.1079447762386 5702.15625 4.7276411056518555 7.0
+676.1283771966628 5700.453125 4.727534770965576 7.0
+676.1488097171459 5705.1123046875 4.728067398071289 7.0
+676.1692423375644 5706.5908203125 4.727982044219971 7.0
+676.1896747579885 5711.87255859375 4.728755950927734 7.0
+676.2101072784717 5711.97900390625 4.728742599487305 7.0
+676.2305397989476 5703.59130859375 4.727353096008301 7.0
+676.2509723194307 5708.24560546875 4.728020668029785 7.0
+676.2714049399074 5696.5810546875 4.726758003234863 7.0
+676.291837360448 5710.923828125 4.728383541107178 7.0
+676.3122698809311 5713.20703125 4.729696273803711 7.0
+676.3531350219491 5710.38623046875 4.728869915008545 7.0
+676.3735674424897 5720.01611328125 4.729071140289307 7.0
+676.3940000630246 5716.8466796875 4.728986740112305 7.0
+676.4144325835659 5718.576171875 4.729247570037842 7.0
+676.4348650041647 5721.60986328125 4.728980541229248 7.0
+676.4552976247069 5711.7041015625 4.729005813598633 7.0
+676.4757301452992 5710.75830078125 4.728214740753174 7.0
+676.496162565898 5711.60693359375 4.727767467498779 7.0
+676.516595186491 5714.90673828125 4.7299275398254395 7.0
+676.5370277070906 5708.994140625 4.728438377380371 7.0
+676.5574603276909 5700.60888671875 4.728061199188232 7.0
+676.577892748348 5711.20654296875 4.7289137840271 7.0
+676.5983252689985 5721.2578125 4.730068206787109 7.0
+676.6187578895988 5716.28662109375 4.729055404663086 7.0
+676.6391903103067 5714.92431640625 4.729763031005859 7.0
+676.6596228309645 5708.7412109375 4.728546619415283 7.0
+676.680055451623 5711.98779296875 4.729432582855225 7.0
+676.7004878723383 5707.4638671875 4.729300022125244 7.0
+676.720920393047 5720.8173828125 4.729518413543701 7.0
+676.7413530137637 5709.9482421875 4.729145050048828 7.0
+676.7617854344717 5716.4140625 4.729226589202881 7.0
+676.7822180551884 5710.931640625 4.72870397567749 7.0
+676.8026505759626 5711.67626953125 4.728324890136719 7.0
+676.8230830967295 5721.48779296875 4.729681015014648 7.0
+676.8435156175037 5702.27001953125 4.729200839996338 7.0
+676.8639481382779 5706.9462890625 4.729634761810303 7.0
+676.9048131798772 5712.9033203125 4.729470729827881 7.0
+676.9252457007096 5715.69970703125 4.730162620544434 7.0
+676.9456781215413 5717.8642578125 4.7305521965026855 7.0
+676.9661107423672 5714.4482421875 4.730442047119141 7.0
+676.9865432632578 5711.19921875 4.728386878967285 7.0
+677.0069758840837 5707.72900390625 4.729519367218018 7.0
+677.0274083050317 5719.31689453125 4.730783939361572 7.0
+677.0478408259223 5707.15087890625 4.729014873504639 7.0
+677.0682734468064 5712.7119140625 4.728686809539795 7.0
+677.0887058677545 5713.35107421875 4.7298359870910645 7.0
+677.1091383887033 5705.822265625 4.728612899780273 7.0
+677.1295710096456 5712.4072265625 4.730495452880859 7.0
+677.1500034305936 5718.384765625 4.731011390686035 7.0
+677.1704359516007 5726.67041015625 4.7318620681762695 7.0
+677.1908685726012 5713.18115234375 4.7300825119018555 7.0
+677.2113009936074 5713.5 4.731276035308838 7.0
+677.2317336146152 5724.59423828125 4.731729507446289 7.0
+677.2725985567376 5721.9365234375 4.732292175292969 7.0
+677.2930311778036 5713.8740234375 4.73124885559082 7.0
+677.3134636988616 5715.09619140625 4.731887340545654 7.0
+677.333896219985 5717.830078125 4.731306076049805 7.0
+677.3543287411012 5710.94140625 4.730001926422119 7.0
+677.3747612622828 5705.62744140625 4.729588985443115 7.0
+677.3951937834063 5713.57861328125 4.7309417724609375 7.0
+677.4156263045879 5721.5302734375 4.73065185546875 7.0
+677.4769239681773 5718.97412109375 4.732163429260254 7.0
+677.4973563893582 5717.7724609375 4.731611251831055 7.0
+677.517789010657 5707.8681640625 4.7313337326049805 7.0
+677.5382214318961 5713.6171875 4.731405735015869 7.0
+677.5586539531869 5713.634765625 4.73198127746582 7.0
+677.5790865744857 5706.64990234375 4.731263160705566 7.0
+677.5995189957757 5722.39306640625 4.732449054718018 7.0
+677.619951517132 5725.7880859375 4.732117176055908 7.0
+677.640384138489 5707.46240234375 4.730510711669922 7.0
+677.6608165598445 5716.72607421875 4.732036590576172 7.0
+677.6812490811935 5716.43408203125 4.7319560050964355 7.0
+677.7016817026088 5716.7978515625 4.7323737144470215 7.0
+677.7221141240152 5711.09814453125 4.731489658355713 7.0
+677.7425467454887 5707.0830078125 4.730594635009766 7.0
+677.7629792669031 5714.453125 4.731410026550293 7.0
+677.7834116884333 5716.455078125 4.731576442718506 7.0
+677.8038443098994 5712.5458984375 4.73057746887207 7.0
+677.8242768314303 5715.384765625 4.731518745422363 7.0
+677.8447093529539 5703.0615234375 4.7300639152526855 7.0
+677.8651418744848 5722.7841796875 4.732302665710449 7.0
+677.8855743960739 5708.830078125 4.731266975402832 7.0
+677.9060069176558 5715.037109375 4.731388568878174 7.0
+677.9264394392449 5709.18798828125 4.730654716491699 7.0
+677.967304582533 5720.00537109375 4.732250690460205 7.0
+678.008169525885 5708.275390625 4.729877471923828 7.0
+678.028602147584 5718.072265625 4.7309088706970215 7.0
+678.0490346692895 5709.05712890625 4.731103420257568 7.0
+678.0694670910525 5715.23876953125 4.731479644775391 7.0
+678.0898997128097 5715.51708984375 4.731428623199463 7.0
+678.1103322345734 5711.1923828125 4.730840682983398 7.0
+678.15119727821 5718.15087890625 4.731442928314209 7.0
+678.1716297000894 5720.232421875 4.73256778717041 7.0
+678.1920623219703 5706.8203125 4.73061466217041 7.0
+678.2124948438432 5711.5830078125 4.730740070343018 7.0
+678.2329272657807 5715.2294921875 4.731879711151123 7.0
+678.2533598876616 5714.58984375 4.732034206390381 7.0
+678.2737924096509 5724.58154296875 4.732046127319336 7.0
+678.314657453644 5710.08740234375 4.731117248535156 7.0
+678.3350899756333 5713.62353515625 4.731620788574219 7.0
+678.3555224976881 5712.3095703125 4.731026649475098 7.0
+678.3963875418485 5715.14453125 4.732426643371582 7.0
+678.4168201639623 5714.61572265625 4.731233596801758 7.0
+678.4372525860745 5715.83642578125 4.733090877532959 7.0
+678.4781177304103 5715.234375 4.732674598693848 7.0
+678.4985501526389 5715.45947265625 4.73210334777832 7.0
+678.518982674861 5721.7001953125 4.731122016906738 7.0
+678.5394152970912 5714.431640625 4.730449199676514 7.0
+678.5598478193715 5720.43896484375 4.731611251831055 7.0
+678.5802802416583 5707.58984375 4.729896068572998 7.0
+678.6007128640049 5699.1796875 4.729772567749023 7.0
+678.6211453863507 5716.6591796875 4.732562065124512 7.0
+678.6415779086892 5711.5029296875 4.731677532196045 7.0
+678.6620104310932 5707.60302734375 4.731290340423584 7.0
+678.68244295349 5713.50146484375 4.730264663696289 7.0
+678.7028755759529 5698.7529296875 4.730099678039551 7.0
+678.7437405209348 5707.427734375 4.730822563171387 7.0
+678.7641731434487 5710.546875 4.7323760986328125 7.0
+678.7846055659684 5704.95849609375 4.730387210845947 7.0
+678.8459031337552 5714.3017578125 4.732595443725586 7.0
+678.8663357563855 5704.599609375 4.732641696929932 7.0
+678.8867681790798 5704.111328125 4.731942176818848 7.0
+678.9072007017749 5708.86279296875 4.733127117156982 7.0
+678.9276333244634 5703.6650390625 4.732227325439453 7.0
+678.9480657472159 5703.240234375 4.731542110443115 7.0
+678.9889308927741 5703.3994140625 4.731667995452881 7.0
+679.009363315643 5703.408203125 4.73237419128418 7.0
+679.0297958384544 5708.8876953125 4.732470989227295 7.0
+679.0502284613758 5695.38720703125 4.731931209564209 7.0
+679.0706609842455 5706.5908203125 4.733225345611572 7.0
+679.0910934072308 5711.69677734375 4.733847141265869 7.0
+679.1115260301522 5705.70068359375 4.732876300811768 7.0
+679.1523910761825 5706.57666015625 4.7323317527771 7.0
+679.1728235992196 5712.14794921875 4.733314037322998 7.0
+679.193256122322 5709.66943359375 4.733245849609375 7.0
+679.2136887453671 5697.689453125 4.73047399520874 7.0
+679.2341211685198 5708.2890625 4.732124328613281 7.0
+679.2545536916805 5702.328125 4.7322163581848145 7.0
+679.274986314842 5707.66357421875 4.7328619956970215 7.0
+679.295418738111 5702.65576171875 4.731900215148926 7.0
+679.31585126133 5707.984375 4.732684135437012 7.0
+679.3362838846078 5698.96728515625 4.732274055480957 7.0
+679.3567163079351 5701.92041015625 4.732516288757324 7.0
+679.377148931213 5706.2001953125 4.731534957885742 7.0
+679.3975814546066 5698.2041015625 4.731019973754883 7.0
+679.418013877992 5694.53076171875 4.730787754058838 7.0
+679.4384465013864 5688.99169921875 4.731564044952393 7.0
+679.47931144834 5691.19775390625 4.730960845947266 7.0
+679.4997440718507 5696.50048828125 4.73104190826416 7.0
+679.5201764954181 5691.2373046875 4.731151580810547 7.0
+679.5406090189208 5700.708984375 4.731913089752197 7.0
+679.5610416425479 5705.2236328125 4.732463359832764 7.0
+679.5814741661743 5700.17919921875 4.732928276062012 7.0
+679.6019066898516 5705.2490234375 4.73258638381958 7.0
+679.6223392135362 5703.17431640625 4.732419013977051 7.0
+679.642771737279 5700.04736328125 4.731189727783203 7.0
+679.6632042610145 5703.5029296875 4.732979774475098 7.0
+679.6836367848155 5711.140625 4.733315467834473 7.0
+679.7040693086165 5694.0693359375 4.731705188751221 7.0
+679.7245019324691 5691.35205078125 4.73206090927124 7.0
+679.7449343563276 5699.18603515625 4.731800556182861 7.0
+679.7653668802377 5688.34228515625 4.730415344238281 7.0
+679.7857995041559 5697.8154296875 4.7318115234375 7.0
+679.8062319281889 5685.54248046875 4.730289936065674 7.0
+679.8470970761919 5693.1513671875 4.730531215667725 7.0
+679.8675295002831 5692.5927734375 4.7314863204956055 7.0
+679.8879621243686 5692.94189453125 4.731736183166504 7.0
+679.9083946485189 5695.17236328125 4.732147216796875 7.0
+679.9288270726684 5692.8818359375 4.731358528137207 7.0
+679.9492596968703 5698.7177734375 4.73209285736084 7.0
+679.9696922211369 5694.40771484375 4.732675552368164 7.0
+679.9901246454028 5692.4462890625 4.732150077819824 7.0
+680.0105572697212 5690.77978515625 4.731986999511719 7.0
+680.030989794046 5698.16943359375 4.732309341430664 7.0
+680.0718548428049 5682.15673828125 4.730288505554199 7.0
+680.0922873672462 5682.13037109375 4.731260299682617 7.0
+680.1127198917457 5692.7646484375 4.732180118560791 7.0
+680.1331524162379 5687.49267578125 4.731821537017822 7.0
+680.1535849407956 5694.5458984375 4.731413841247559 7.0
+680.1740174653532 5682.30810546875 4.730105876922607 7.0
+680.1944499899619 5682.78955078125 4.730216979980469 7.0
+680.2148825146069 5694.61962890625 4.7325897216796875 7.0
+680.2353151393108 5683.0205078125 4.730524063110352 7.0
+680.255747564006 5686.8466796875 4.732748985290527 7.0
+680.2761801887682 5676.20947265625 4.7298431396484375 7.0
+680.2966127135587 5687.03271484375 4.73180627822876 7.0
+680.3170451383703 5687.490234375 4.731625080108643 7.0
+680.3374777632198 5688.35595703125 4.73038911819458 7.0
+680.3579102881267 5688.30126953125 4.7316694259643555 7.0
+680.3783427130547 5689.7451171875 4.73069953918457 7.0
+680.3987753380206 5685.06884765625 4.730990886688232 7.0
+680.4396402880593 5689.00048828125 4.730586051940918 7.0
+680.4600729131125 5680.51025390625 4.729992866516113 7.0
+680.4805054382232 5679.02197265625 4.730374336242676 7.0
+680.5009380633564 5676.33056640625 4.729608535766602 7.0
+680.5213704885537 5691.52880859375 4.731616973876953 7.0
+680.5418030137807 5690.4697265625 4.731660842895508 7.0
+680.5622356390595 5684.142578125 4.730617046356201 7.0
+680.582668064344 5672.58740234375 4.73054313659668 7.0
+680.6439656404546 5684.12646484375 4.7309889793396 7.0
+680.6643981659145 5672.0634765625 4.730020999908447 7.0
+680.7052633169151 5671.4892578125 4.72825288772583 7.0
+680.7256958424841 5681.27001953125 4.7296295166015625 7.0
+680.7461283680605 5679.12841796875 4.730683326721191 7.0
+680.7869934193877 5673.45458984375 4.729247570037842 7.0
+680.8074259451023 5674.9248046875 4.729640007019043 7.0
+680.8278583708525 5666.82763671875 4.7300496101379395 7.0
+680.8482909966551 5667.408203125 4.7288289070129395 7.0
+680.8687235224934 5674.9091796875 4.729552268981934 7.0
+680.88915594836 5674.47412109375 4.730235576629639 7.0
+680.9095885742863 5669.6630859375 4.729680061340332 7.0
+680.9300211002337 5672.3642578125 4.729944705963135 7.0
+680.9708861522522 5664.109375 4.72807502746582 7.0
+680.9913186783233 5660.1826171875 4.727484703063965 7.0
+681.0117513044243 5670.859375 4.729710102081299 7.0
+681.0321837305819 5668.11083984375 4.72849702835083 7.0
+681.0526162567912 5672.06103515625 4.730039119720459 7.0
+681.0934813092754 5666.08740234375 4.729485034942627 7.0
+681.1343464619422 5649.9775390625 4.728943347930908 7.0
+681.1547788883618 5662.28515625 4.730221748352051 7.0
+681.1752115147756 5665.34814453125 4.729780673980713 7.0
+681.1956440412541 5670.7705078125 4.7315592765808105 7.0
+681.2160765677836 5662.70166015625 4.730600833892822 7.0
+681.2365090943495 5665.8701171875 4.731306076049805 7.0
+681.2569416209735 5665.26171875 4.729809284210205 7.0
+681.2773741476194 5661.37255859375 4.729508876800537 7.0
+681.2978066743017 5662.1494140625 4.7301764488220215 7.0
+681.3182392010422 5654.3359375 4.728525161743164 7.0
+681.3386717278045 5655.21533203125 4.7289934158325195 7.0
+681.3591042546323 5656.357421875 4.729307651519775 7.0
+681.3795367814892 5653.83056640625 4.7275261878967285 7.0
+681.399969308397 5658.8212890625 4.728264808654785 7.0
+681.4204018353412 5646.91015625 4.7282562255859375 7.0
+681.4408343623145 5655.8662109375 4.7285003662109375 7.0
+681.4612669893395 5645.32958984375 4.728214263916016 7.0
+681.4816994164285 5654.70263671875 4.728550434112549 7.0
+681.5021319435473 5645.3896484375 4.728780746459961 7.0
+681.5225645707178 5661.4501953125 4.728987216949463 7.0
+681.5429969979232 5661.28662109375 4.72987174987793 7.0
+681.5634295251584 5651.146484375 4.728879928588867 7.0
+681.6042945797963 5654.67431640625 4.72978401184082 7.0
+681.6247272072069 5666.8671875 4.732093334197998 7.0
+681.6451597346095 5642.439453125 4.728956699371338 7.0
+681.6655921620768 5655.533203125 4.731337547302246 7.0
+681.6860247896038 5643.25927734375 4.729201316833496 7.0
+681.706457317181 5638.203125 4.729123592376709 7.0
+681.7268897447648 5651.1416015625 4.729727268218994 7.0
+681.7473223724373 5640.294921875 4.727255821228027 7.0
+681.767754900131 5652.7919921875 4.729590892791748 7.0
+681.788187427861 5643.45849609375 4.728921890258789 7.0
+681.8086199556783 5652.31494140625 4.729598045349121 7.0
+681.8290524834883 5641.23291015625 4.729185581207275 7.0
+681.8494851113646 5643.1943359375 4.7292890548706055 7.0
+681.8699176392984 5641.69775390625 4.728630542755127 7.0
+681.8903500672823 5635.13427734375 4.728428363800049 7.0
+681.9107826953041 5646.189453125 4.7296142578125 7.0
+681.931215223347 5642.728515625 4.729374408721924 7.0
+681.9516476514837 5639.17431640625 4.728531360626221 7.0
+681.972080279651 5643.23828125 4.728089332580566 7.0
+681.9925128078467 5641.43115234375 4.7298150062561035 7.0
+682.0129452360925 5640.63623046875 4.7286376953125 7.0
+682.0333778643762 5632.99365234375 4.728708744049072 7.0
+682.0538102927458 5626.01806640625 4.727753162384033 7.0
+682.0742429211386 5626.53759765625 4.728346347808838 7.0
+682.0946754495671 5629.181640625 4.728403568267822 7.0
+682.1151078780822 5633.2021484375 4.729307651519775 7.0
+682.1355405066206 5630.376953125 4.729119777679443 7.0
+682.1559730351946 5638.98193359375 4.7299041748046875 7.0
+682.1764054638479 5620.91796875 4.728332996368408 7.0
+682.19683809251 5626.01708984375 4.72965669631958 7.0
+682.2172706212586 5624.669921875 4.729234218597412 7.0
+682.2377030500356 5624.0361328125 4.728336334228516 7.0
+682.2581356788651 5622.77978515625 4.728128910064697 7.0
+682.2785682077592 5629.2392578125 4.728938102722168 7.0
+682.299000836676 5624.99609375 4.728616714477539 7.0
+682.3194332656567 5632.8583984375 4.729280471801758 7.0
+682.3398657946673 5625.4951171875 4.728216171264648 7.0
+682.3602984237295 5638.24609375 4.731046676635742 7.0
+682.3807308528849 5627.2236328125 4.7288641929626465 7.0
+682.401163382041 5610.56103515625 4.72818660736084 7.0
+682.4215960112779 5618.5595703125 4.728418350219727 7.0
+682.4420285405504 5619.79248046875 4.728955268859863 7.0
+682.4624609698803 5617.99609375 4.728312015533447 7.0
+682.4828935992336 5607.63916015625 4.728646755218506 7.0
+682.5033261286808 5620.78466796875 4.728321075439453 7.0
+682.523758658157 5612.35107421875 4.728896141052246 7.0
+682.5441911876551 5616.9501953125 4.729091167449951 7.0
+682.5646237172477 5611.2919921875 4.728185176849365 7.0
+682.5850562468695 5613.83837890625 4.728440284729004 7.0
+682.6054887765422 5611.1962890625 4.7280449867248535 7.0
+682.6259213062804 5610.8203125 4.728687286376953 7.0
+682.666786365895 5610.2275390625 4.727687835693359 7.0
+682.6872189957794 5611.095703125 4.728250980377197 7.0
+682.7076514257205 5612.4873046875 4.7278923988342285 7.0
+682.7280839557134 5595.15234375 4.726438999176025 7.0
+682.7485165857433 5607.94189453125 4.727774620056152 7.0
+682.76894901583 5608.52392578125 4.728587627410889 7.0
+682.7893815459975 5603.26318359375 4.728312969207764 7.0
+682.809814176173 5599.2001953125 4.727295398712158 7.0
+682.8302466064342 5596.98876953125 4.726820468902588 7.0
+682.8506791367472 5600.38818359375 4.72761869430542 7.0
+682.8711117670973 5602.38818359375 4.727972030639648 7.0
+682.8915441975041 5594.76171875 4.726597785949707 7.0
+682.9119768279634 5598.8642578125 4.727592468261719 7.0
+682.9528418890404 5599.78271484375 4.727987766265869 7.0
+682.993706950343 5596.06689453125 4.7278151512146 7.0
+683.0141394810635 5595.052734375 4.727485179901123 7.0
+683.0345720118785 5601.40771484375 4.727831840515137 7.0
+683.0550045427226 5599.4658203125 4.727639675140381 7.0
+683.0958697045207 5589.31787109375 4.727173805236816 7.0
+683.1163021355387 5591.0517578125 4.727282524108887 7.0
+683.1367347666092 5586.8623046875 4.726779937744141 7.0
+683.1775997288787 5587.2705078125 4.726024150848389 7.0
+683.1980323600947 5594.24072265625 4.728641033172607 7.0
+683.2184648913753 5592.88037109375 4.727389812469482 7.0
+683.2388973227135 5586.91650390625 4.726822853088379 7.0
+683.259329954104 5580.47119140625 4.72700309753418 7.0
+683.3206275485791 5596.60888671875 4.727760314941406 7.0
+683.341060080209 5594.486328125 4.728499412536621 7.0
+683.361492611868 5584.9765625 4.727069854736328 7.0
+683.381925143578 5584.96435546875 4.727680683135986 7.0
+683.4023575753818 5592.3251953125 4.728399276733398 7.0
+683.4227902072162 5591.16796875 4.727498531341553 7.0
+683.4432227391007 5585.90087890625 4.72756814956665 7.0
+683.4636552710508 5583.826171875 4.727281093597412 7.0
+683.4840878030591 5586.34765625 4.726711750030518 7.0
+683.5045203351183 5578.36376953125 4.726433753967285 7.0
+683.524952867243 5589.87060546875 4.726791858673096 7.0
+683.5658179316597 5572.8505859375 4.7262420654296875 7.0
+683.5862505639598 5582.49169921875 4.727516174316406 7.0
+683.6066829963165 5588.775390625 4.727371692657471 7.0
+683.627115528725 5574.9482421875 4.726173400878906 7.0
+683.6679806937027 5590.4677734375 4.726934909820557 7.0
+683.6884131263141 5576.45849609375 4.726478099822998 7.0
+683.7088457589343 5574.44677734375 4.726284980773926 7.0
+683.7292782916411 5579.908203125 4.727112770080566 7.0
+683.7497107244271 5572.92626953125 4.725625991821289 7.0
+683.770143357222 5577.75390625 4.7269978523254395 7.0
+683.7905758901034 5577.6318359375 4.726367473602295 7.0
+683.8110085230364 5575.666015625 4.725834846496582 7.0
+683.8314409560626 5580.6748046875 4.726611614227295 7.0
+683.8518734891186 5585.0234375 4.72676944732666 7.0
+683.8723061222263 5574.515625 4.72572660446167 7.0
+683.8927385554271 5578.1044921875 4.726466178894043 7.0
+683.9131710886577 5576.1416015625 4.72620964050293 7.0
+683.9336036219393 5569.37646484375 4.725182056427002 7.0
+683.9540361553154 5575.90234375 4.726705074310303 7.0
+683.9744686887207 5578.52294921875 4.727134704589844 7.0
+683.994901222206 5561.5234375 4.725660800933838 7.0
+684.0153337557567 5579.81494140625 4.726809024810791 7.0
+684.0357663893374 5567.4287109375 4.725057601928711 7.0
+684.0561988229965 5565.28662109375 4.725220680236816 7.0
+684.0766313567219 5572.634765625 4.724960803985596 7.0
+684.1174965243699 5564.68310546875 4.725395202636719 7.0
+684.1379289582692 5567.92333984375 4.72597599029541 7.0
+684.1583615922282 5555.8212890625 4.724961757659912 7.0
+684.1787941262664 5565.17529296875 4.725616931915283 7.0
+684.1992266603411 5567.4892578125 4.725560188293457 7.0
+684.2196591944958 5571.154296875 4.726821422576904 7.0
+684.2400917287159 5576.57666015625 4.726928234100342 7.0
+684.260524362995 5567.4326171875 4.7261247634887695 7.0
+684.28095679736 5574.69384765625 4.726484775543213 7.0
+684.3013893317475 5569.85693359375 4.725403308868408 7.0
+684.3218219662012 5574.34619140625 4.726457118988037 7.0
+684.3422544007335 5567.9853515625 4.725406646728516 7.0
+684.362686935332 5568.20068359375 4.725920677185059 7.0
+684.4035520047037 5565.013671875 4.726083755493164 7.0
+684.4239846394994 5559.31494140625 4.725641250610352 7.0
+684.4444171743307 5579.86328125 4.7266926765441895 7.0
+684.4648496092414 5565.8232421875 4.725839614868164 7.0
+684.505714779254 5569.82958984375 4.725712776184082 7.0
+684.5261472143757 5570.65869140625 4.727096080780029 7.0
+684.5465798495206 5567.1357421875 4.726552486419678 7.0
+684.5670122847587 5575.68017578125 4.727420806884766 7.0
+684.5874449200492 5569.4697265625 4.727201461791992 7.0
+684.6078774554044 5568.42529296875 4.72677755355835 7.0
+684.6283099908178 5568.39501953125 4.727048873901367 7.0
+684.6487425263113 5566.46875 4.726710796356201 7.0
+684.6691750618702 5561.9267578125 4.727101802825928 7.0
+684.6896075974873 5567.35400390625 4.726301670074463 7.0
+684.7100401331845 5574.541015625 4.726707458496094 7.0
+684.7304726689472 5572.04296875 4.727510929107666 7.0
+684.7509052047535 5567.63330078125 4.726989269256592 7.0
+684.7713377406399 5566.80419921875 4.726624488830566 7.0
+684.7917702765772 5561.24951171875 4.724429607391357 7.0
+684.8122028126018 5558.4462890625 4.724915504455566 7.0
+684.832635448678 5572.1875 4.726772308349609 7.0
+684.8530678848183 5569.51123046875 4.726869583129883 7.0
+684.8735005210474 5570.60791015625 4.726565837860107 7.0
+684.8939330573266 5572.154296875 4.727093696594238 7.0
+684.9143654936706 5571.29736328125 4.726855278015137 7.0
+684.9347981300816 5565.5322265625 4.725948810577393 7.0
+684.9552306665573 5564.35791015625 4.726691722869873 7.0
+684.975663103105 5578.6318359375 4.727041244506836 7.0
+684.9960957397416 5569.06982421875 4.726682662963867 7.0
+685.0165282763992 5567.412109375 4.727169513702393 7.0
+685.0369607131652 5568.998046875 4.726590156555176 7.0
+685.0573933499836 5577.93408203125 4.7267165184021 7.0
+685.0778258868668 5574.76953125 4.727682113647461 7.0
+685.0982585238235 5571.65478515625 4.726734638214111 7.0
+685.1186909608514 5580.65087890625 4.727930545806885 7.0
+685.1391234979455 5569.91162109375 4.726583480834961 7.0
+685.159556135106 5581.67822265625 4.727695941925049 7.0
+685.1799885723158 5577.3857421875 4.7271857261657715 7.0
+685.200421109621 5583.748046875 4.727827072143555 7.0
+685.2208536469843 5572.396484375 4.727472305297852 7.0
+685.2617188219228 5569.5703125 4.726091384887695 7.0
+685.2821512595037 5572.78076171875 4.726741790771484 7.0
+685.3025837971509 5579.9765625 4.727294445037842 7.0
+685.3230164348643 5575.28759765625 4.727567672729492 7.0
+685.3434489726351 5570.96484375 4.726760387420654 7.0
+685.3638814104925 5581.537109375 4.7285027503967285 7.0
+685.3843140484023 5577.00146484375 4.7269463539123535 7.0
+685.404746586406 5582.541015625 4.72715950012207 7.0
+685.4456116626097 5570.7529296875 4.726384162902832 7.0
+685.4660442008026 5580.47802734375 4.727579116821289 7.0
+685.4864768390762 5579.22802734375 4.728111743927002 7.0
+685.5069092774283 5576.87646484375 4.728250503540039 7.0
+685.5273418158395 5596.92822265625 4.728935241699219 7.0
+685.5477744543168 5582.2763671875 4.728058815002441 7.0
+685.5682068928872 5578.84521484375 4.727198123931885 7.0
+685.6090720702123 5632.62890625 4.733553409576416 7.0
+685.6295045089864 5596.291015625 4.730441093444824 7.0
+685.6499370478341 5591.70947265625 4.729238033294678 7.0
+685.670369686748 5592.70751953125 4.729978561401367 7.0
+685.6908021257259 5591.0517578125 4.730085849761963 7.0
+685.7112347648072 5583.8076171875 4.728503704071045 7.0
+685.7316673039386 5583.70849609375 4.727928161621094 7.0
+685.7520997431347 5584.3251953125 4.728910446166992 7.0
+685.7725323824197 5590.07666015625 4.7299652099609375 7.0
+685.7929649217549 5595.17138671875 4.7291646003723145 7.0
+685.8133974611846 5589.81005859375 4.7296037673950195 7.0
+685.8338300006872 5587.107421875 4.729365825653076 7.0
+685.8542625402551 5590.26806640625 4.728625774383545 7.0
+685.8746950799032 5589.880859375 4.729992866516113 7.0
+685.895127619624 5595.66552734375 4.729958534240723 7.0
+685.9155601594102 5586.7724609375 4.729568958282471 7.0
+685.9359926992765 5591.26171875 4.729878902435303 7.0
+685.9564252392156 5583.60546875 4.729388236999512 7.0
+685.9768577792202 5586.42529296875 4.730279445648193 7.0
+685.9972904193055 5597.74365234375 4.731511116027832 7.0
+686.0177228594766 5590.46337890625 4.7301249504089355 7.0
+686.038155399714 5597.30126953125 4.7300872802734375 7.0
+686.0585880400176 5595.66357421875 4.731040954589844 7.0
+686.079020480407 5604.19921875 4.731268405914307 7.0
+686.0994530208627 5600.95849609375 4.730678558349609 7.0
+686.1198856613846 5601.14599609375 4.731321334838867 7.0
+686.1403181020069 5596.70361328125 4.729959487915039 7.0
+686.1607507426816 5603.80224609375 4.7314772605896 7.0
+686.1811832834501 5601.8720703125 4.7318243980407715 7.0
+686.2016157243052 5591.6416015625 4.729843616485596 7.0
+686.2220483651836 5589.3701171875 4.730106353759766 7.0
+686.2424809061849 5591.95703125 4.730311393737793 7.0
+686.2629133472583 5594.13037109375 4.730106353759766 7.0
+686.2833459883841 5608.91943359375 4.732048511505127 7.0
+686.3037785296037 5604.02783203125 4.732672214508057 7.0
+686.3242111708896 5604.7841796875 4.732048511505127 7.0
+686.344643612254 5603.81201171875 4.7306904792785645 7.0
+686.365076153721 5594.87548828125 4.731409549713135 7.0
+686.4059412368224 5594.72607421875 4.731062889099121 7.0
+686.4468064202447 5592.48828125 4.731719017028809 7.0
+686.46723896209 5601.99169921875 4.732369422912598 7.0
+686.4876714040074 5598.14697265625 4.731612682342529 7.0
+686.5081040459772 5604.24365234375 4.7317304611206055 7.0
+686.5489691301918 5614.64111328125 4.732832908630371 7.0
+686.5694016724083 5602.97900390625 4.732828140258789 7.0
+686.5898341147185 5612.4736328125 4.732084274291992 7.0
+686.6102667570885 5616.54345703125 4.7334065437316895 7.0
+686.6306992995378 5606.40771484375 4.732722759246826 7.0
+686.6511317420809 5617.4990234375 4.734619140625 7.0
+686.6715643846837 5613.64013671875 4.731816291809082 7.0
+686.6919969273658 5621.9658203125 4.733983993530273 7.0
+686.7124293701418 5615.95947265625 4.733251094818115 7.0
+686.7328620130065 5614.41552734375 4.733532428741455 7.0
+686.7532945559215 5620.2666015625 4.732953071594238 7.0
+686.7941596420278 5611.26416015625 4.733945369720459 7.0
+686.8145921851756 5614.18701171875 4.7336225509643555 7.0
+686.8350248284187 5613.1806640625 4.732905387878418 7.0
+686.8758898151573 5619.67041015625 4.7346510887146 7.0
+686.8963224586478 5623.875 4.733817100524902 7.0
+686.916754902224 5621.40087890625 4.733944892883301 7.0
+686.9371874458666 5616.15771484375 4.7341084480285645 7.0
+686.9984851772897 5625.251953125 4.735167026519775 7.0
+687.0189177212742 5623.546875 4.735351085662842 7.0
+687.0393502653169 5625.42919921875 4.7336225509643555 7.0
+687.0597828094542 5621.3369140625 4.735024929046631 7.0
+687.1006478979689 5629.2314453125 4.735007286071777 7.0
+687.1210804423463 5623.30712890625 4.734231472015381 7.0
+687.141512986811 5630.595703125 4.73596715927124 7.0
+687.1619455313485 5628.8203125 4.7364044189453125 7.0
+687.1823780759732 5633.45458984375 4.7356390953063965 7.0
+687.2028106206853 5620.42138671875 4.734914302825928 7.0
+687.2232432654637 5628.7158203125 4.734682559967041 7.0
+687.2436757103424 5629.9921875 4.735739231109619 7.0
+687.2641082553018 5624.8046875 4.735814571380615 7.0
+687.2845409003348 5630.70068359375 4.736114978790283 7.0
+687.3049733454609 5627.8359375 4.73629903793335 7.0
+687.3254058906678 5628.296875 4.735565185546875 7.0
+687.3458385359409 5630.361328125 4.735881328582764 7.0
+687.3662709813216 5641.8388671875 4.736922264099121 7.0
+687.3867036267766 5631.84228515625 4.737309455871582 7.0
+687.4071361723109 5632.79443359375 4.736522197723389 7.0
+687.427568617939 5631.2177734375 4.736215591430664 7.0
+687.4480012636486 5635.087890625 4.736739635467529 7.0
+687.488866255313 5625.2255859375 4.736449718475342 7.0
+687.5092989012774 5639.17431640625 4.737039089202881 7.0
+687.5297314473064 5640.41455078125 4.737833023071289 7.0
+687.5501639934446 5635.21826171875 4.735330581665039 7.0
+687.5705965396628 5640.15966796875 4.736917018890381 7.0
+687.5910290859465 5640.15576171875 4.737247943878174 7.0
+687.6318941788122 5639.0859375 4.737289905548096 7.0
+687.6523267253579 5637.37890625 4.737614631652832 7.0
+687.6727593719988 5628.68798828125 4.736654281616211 7.0
+687.6931919187264 5641.80322265625 4.736459255218506 7.0
+687.7136243655332 5639.5517578125 4.737520694732666 7.0
+687.7340570124288 5636.5576171875 4.736101150512695 7.0
+687.7544895594183 5648.42236328125 4.738260269165039 7.0
+687.774922006487 5638.37890625 4.737680912017822 7.0
+687.7953546536446 5639.58056640625 4.735687732696533 7.0
+687.8157871008952 5646.1484375 4.737998008728027 7.0
+687.8362197482056 5644.80029296875 4.737191200256348 7.0
+687.8566522956316 5646.248046875 4.73755407333374 7.0
+687.8770847431442 5648.53369140625 4.738231182098389 7.0
+687.8975173907165 5645.87353515625 4.738430500030518 7.0
+687.9179499383972 5641.2294921875 4.737516403198242 7.0
+687.9383823861717 5648.6708984375 4.737321376800537 7.0
+687.9588150340132 5645.158203125 4.737185478210449 7.0
+687.9792475819559 5643.91455078125 4.7372026443481445 7.0
+687.9996800299923 5648.8369140625 4.735522270202637 7.0
+688.0201126780958 5648.07177734375 4.737393379211426 7.0
+688.0405452263003 5637.68359375 4.737008094787598 7.0
+688.0609778745857 5645.69873046875 4.737658500671387 7.0
+688.0814103229714 5658.80029296875 4.738831996917725 7.0
+688.1018428714451 5651.50634765625 4.737726211547852 7.0
+688.1222755199997 5646.89453125 4.737813472747803 7.0
+688.14270796864 5641.99951171875 4.736897945404053 7.0
+688.1631405173757 5656.67236328125 4.738839149475098 7.0
+688.1835731661995 5648.3203125 4.738405227661133 7.0
+688.224438164114 5644.27490234375 4.738414287567139 7.0
+688.244870813207 5655.19580078125 4.739226341247559 7.0
+688.2857359116533 5658.517578125 4.737944602966309 7.0
+688.3061684610147 5648.16552734375 4.738164901733398 7.0
+688.3266010104635 5649.21044921875 4.737451076507568 7.0
+688.3470336600003 5648.23876953125 4.737794399261475 7.0
+688.3674661096447 5657.1767578125 4.739712715148926 7.0
+688.3878986593554 5652.66650390625 4.737288475036621 7.0
+688.4083313091687 5666.3681640625 4.740532398223877 7.0
+688.4287637590678 5664.12060546875 4.74032735824585 7.0
+688.4491964090557 5665.6220703125 4.740767002105713 7.0
+688.4900614093276 5659.51416015625 4.738577365875244 7.0
+688.510494059592 5663.31640625 4.739128112792969 7.0
+688.5309265099495 5661.73681640625 4.739790916442871 7.0
+688.551359060395 5654.40673828125 4.738466262817383 7.0
+688.5717917109359 5668.244140625 4.7401533126831055 7.0
+688.5922241615699 5649.7431640625 4.739336967468262 7.0
+688.6126567122992 5661.9658203125 4.739445209503174 7.0
+688.6330893631093 5655.8017578125 4.738733291625977 7.0
+688.6535218140198 5660.17724609375 4.73810338973999 7.0
+688.6739544650118 5657.4482421875 4.7396769523620605 7.0
+688.6943870161122 5662.84375 4.738733768463135 7.0
+688.7148195672999 5668.37548828125 4.7410888671875 7.0
+688.7352521185749 5664.13818359375 4.7389397621154785 7.0
+688.7556846699517 5652.36865234375 4.7384934425354 7.0
+688.7761172214086 5654.60009765625 4.7376885414123535 7.0
+688.7965497729674 5660.3857421875 4.739020347595215 7.0
+688.8169823246208 5672.82470703125 4.741446018218994 7.0
+688.8578475281975 5673.27587890625 4.739900588989258 7.0
+688.8782799801338 5660.8896484375 4.73965311050415 7.0
+688.898712632159 5669.6142578125 4.7402191162109375 7.0
+688.9191451842707 5664.21728515625 4.740139961242676 7.0
+688.9395776364981 5668.71044921875 4.741291522979736 7.0
+688.9600102887998 5661.29541015625 4.739792346954346 7.0
+688.9804428411953 5667.52490234375 4.740599155426025 7.0
+689.0008752937065 5671.20068359375 4.739178657531738 7.0
+689.0213079462847 5669.3447265625 4.740771293640137 7.0
+689.0621729517661 5666.53662109375 4.7408223152160645 7.0
+689.0826056046426 5664.5634765625 4.741100788116455 7.0
+689.1030380576049 5667.64208984375 4.741208076477051 7.0
+689.1234707106705 5675.0576171875 4.7414164543151855 7.0
+689.1439032638373 5667.59228515625 4.740085601806641 7.0
+689.1643357170906 5673.43310546875 4.739922046661377 7.0
+689.1847683704473 5664.873046875 4.740360260009766 7.0
+689.2052009239051 5674.23388671875 4.7412190437316895 7.0
+689.2256334774356 5664.3037109375 4.740377902984619 7.0
+689.2460660310826 5669.7529296875 4.74117374420166 7.0
+689.2664985848314 5672.4560546875 4.741992473602295 7.0
+689.2869312386465 5675.82763671875 4.741070747375488 7.0
+689.307363692591 5664.392578125 4.739129066467285 7.0
+689.3277962466236 5674.56396484375 4.741584777832031 7.0
+689.348228900737 5674.2685546875 4.740688800811768 7.0
+689.3686614549588 5671.93603515625 4.741973400115967 7.0
+689.3890939092889 5667.44384765625 4.74181604385376 7.0
+689.4095265636934 5673.41552734375 4.7421488761901855 7.0
+689.4299591182134 5673.81640625 4.743964195251465 7.0
+689.4708242275374 5662.00537109375 4.74178409576416 7.0
+689.4912567823412 5670.33740234375 4.7422661781311035 7.0
+689.5116893372397 5675.7099609375 4.742544174194336 7.0
+689.5321218922472 5676.10498046875 4.742659091949463 7.0
+689.5525544473494 5676.62060546875 4.742720127105713 7.0
+689.5729871025396 5680.59375 4.743010520935059 7.0
+689.593419557852 5673.111328125 4.7411322593688965 7.0
+689.6138521132452 5672.7568359375 4.741450786590576 7.0
+689.6342847687338 5672.40869140625 4.7425761222839355 7.0
+689.6547172243372 5674.98095703125 4.743142127990723 7.0
+689.6751497800287 5674.64208984375 4.741171360015869 7.0
+689.6955824358156 5678.19482421875 4.743969917297363 7.0
+689.7160148917174 5680.19091796875 4.7426629066467285 7.0
+689.7364475477007 5678.68359375 4.742183208465576 7.0
+689.7568800037989 5678.357421875 4.743064880371094 7.0
+689.7773125599924 5680.70458984375 4.740716457366943 7.0
+689.7977452162886 5690.6767578125 4.742414474487305 7.0
+689.8181776726706 5683.54833984375 4.742143154144287 7.0
+689.8386102291697 5675.55322265625 4.742361545562744 7.0
+689.8590428857569 5679.70751953125 4.742850303649902 7.0
+689.8794753424445 5678.49951171875 4.74277925491333 7.0
+689.899907899242 5679.08056640625 4.743095874786377 7.0
+689.920340556142 5687.38427734375 4.7432475090026855 7.0
+689.9407731131214 5683.22119140625 4.743495941162109 7.0
+689.9612056702244 5676.6103515625 4.74310302734375 7.0
+689.9816382274294 5680.20263671875 4.742557525634766 7.0
+690.0020707847143 5677.056640625 4.743310451507568 7.0
+690.0225034421164 5675.17333984375 4.744433403015137 7.0
+690.0838011149244 5681.8115234375 4.743773460388184 7.0
+690.1042335727398 5689.20751953125 4.745716094970703 7.0
+690.1246662306439 5679.94775390625 4.742471694946289 7.0
+690.1450987886492 5676.86669921875 4.74457311630249 7.0
+690.1655312467701 5686.322265625 4.743856430053711 7.0
+690.206396463298 5676.58056640625 4.74324893951416 7.0
+690.2268289217245 5679.5048828125 4.739909648895264 7.0
+691.1462944593222 5683.33935546875 4.74290657043457 7.0
+691.1871595860357 5698.42626953125 4.745860576629639 7.0
+691.2075921495489 5698.61669921875 4.745819568634033 7.0
+691.2280247131712 5687.22705078125 4.7448835372924805 7.0
+691.2484573769107 5689.7099609375 4.745813369750977 7.0
+691.268889840765 5684.29345703125 4.7450995445251465 7.0
+691.289322404722 5693.59521484375 4.745555877685547 7.0
+691.3097550687744 5695.0830078125 4.746274471282959 7.0
+691.3301875329635 5693.681640625 4.7454071044921875 7.0
+691.3506200972552 5690.2919921875 4.746049404144287 7.0
+691.3710527616495 5697.890625 4.7461748123168945 7.0
+691.3914852261587 5691.5380859375 4.746406078338623 7.0
+691.4119178907786 5694.14306640625 4.745905876159668 7.0
+691.4323504555068 5689.5673828125 4.745222091674805 7.0
+691.4527829203507 5683.96630859375 4.7453293800354 7.0
+691.4732155853053 5688.826171875 4.745538234710693 7.0
+691.4936481503755 5692.81982421875 4.7465033531188965 7.0
+691.5140806155468 5693.38232421875 4.74647331237793 7.0
+691.5345132808361 5690.62255859375 4.745883464813232 7.0
+691.5549458462265 5686.060546875 4.746091842651367 7.0
+691.5753784117405 5695.48779296875 4.747177600860596 7.0
+691.5958109773637 5689.6708984375 4.747458457946777 7.0
+691.6162435431106 5694.91064453125 4.747033596038818 7.0
+691.6366761089521 5687.58056640625 4.747226238250732 7.0
+691.65710867491 5695.07861328125 4.7472710609436035 7.0
+691.677541240977 5714.388671875 4.749143123626709 7.0
+691.6979738071677 5693.8232421875 4.746700763702393 7.0
+691.7184063734676 5696.07568359375 4.747331619262695 7.0
+691.7388389398839 5692.6025390625 4.747848987579346 7.0
+691.759271506402 5690.7568359375 4.747993469238281 7.0
+691.7797040730438 5692.14599609375 4.747558116912842 7.0
+691.8001366397875 5701.1318359375 4.747835159301758 7.0
+691.8205693066557 5695.0830078125 4.74856424331665 7.0
+691.8410017736387 5684.55615234375 4.747232913970947 7.0
+691.8614344407179 5700.560546875 4.748591899871826 7.0
+691.8818670079272 5704.09228515625 4.74896764755249 7.0
+691.9022994752522 5703.921875 4.749813079833984 7.0
+691.9227321426879 5697.75537109375 4.749453544616699 7.0
+691.9431647102319 5695.4453125 4.748641490936279 7.0
+691.9635971779062 5694.45556640625 4.748658180236816 7.0
+691.9840298456766 5703.22607421875 4.749636173248291 7.0
+692.0044624135699 5693.658203125 4.748398780822754 7.0
+692.0248948815788 5699.4755859375 4.749300479888916 7.0
+692.0453275496984 5695.001953125 4.748960494995117 7.0
+692.065760117941 5691.11279296875 4.748512268066406 7.0
+692.0861927862861 5698.03955078125 4.748865127563477 7.0
+692.1066252547535 5692.48486328125 4.748713970184326 7.0
+692.1270578233452 5695.80615234375 4.748874187469482 7.0
+692.1474904920397 5699.1474609375 4.7497758865356445 7.0
+692.1679229608562 5690.3740234375 4.748653411865234 7.0
+692.1883555297973 5699.5 4.749332427978516 7.0
+692.2087881988409 5700.23388671875 4.749976634979248 7.0
+692.229220767993 5698.62255859375 4.749323844909668 7.0
+692.2496532372825 5697.31640625 4.749545097351074 7.0
+692.2700859066899 5694.19775390625 4.749082565307617 7.0
+692.2905184761767 5698.8935546875 4.750004768371582 7.0
+692.3109510458162 5691.4892578125 4.7498345375061035 7.0
+692.3313836155721 5698.525390625 4.749685764312744 7.0
+692.3518160854364 5689.58349609375 4.748847007751465 7.0
+692.372248755426 5702.01318359375 4.750082969665527 7.0
+692.3926813255166 5694.490234375 4.749161720275879 7.0
+692.4131137957447 5693.5595703125 4.749507904052734 7.0
+692.433546466069 5695.9931640625 4.749807357788086 7.0
+692.4539790365234 5691.193359375 4.749587535858154 7.0
+692.4744117070877 5691.21240234375 4.748889446258545 7.0
+692.5152767485852 5701.07373046875 4.750020980834961 7.0
+692.535709419506 5689.57421875 4.749652862548828 7.0
+692.5561418905563 5694.31884765625 4.750236511230469 7.0
+692.5765744617238 5689.02734375 4.74912691116333 7.0
+692.5970071329866 5690.2890625 4.7496466636657715 7.0
+692.6174396044007 5691.53564453125 4.749093532562256 7.0
+692.6378721759247 5689.5576171875 4.749753952026367 7.0
+692.6583048475441 5703.66650390625 4.750805854797363 7.0
+692.6787373193074 5685.92626953125 4.749413967132568 7.0
+692.6991699911814 5692.99658203125 4.750478267669678 7.0
+692.7196025631783 5692.60302734375 4.750096797943115 7.0
+692.7400351352917 5694.80810546875 4.7508745193481445 7.0
+692.7604677075287 5682.90087890625 4.7496232986450195 7.0
+692.7809002798895 5701.08203125 4.751394748687744 7.0
+692.8013328523521 5692.49658203125 4.750283241271973 7.0
+692.8217654249529 5693.150390625 4.751392364501953 7.0
+692.8421979976774 5692.7734375 4.751051902770996 7.0
+692.8626305705184 5690.9375 4.750885963439941 7.0
+692.8830631434685 5692.14111328125 4.7505340576171875 7.0
+692.9034957165422 5689.43408203125 4.7503132820129395 7.0
+692.923928289747 5688.07470703125 4.750647068023682 7.0
+692.9443608630609 5695.6982421875 4.751742362976074 7.0
+692.964793436513 5688.431640625 4.750617027282715 7.0
+692.9852261100677 5695.11181640625 4.7510504722595215 7.0
+693.0056585837592 5682.62890625 4.749519348144531 7.0
+693.0465238314791 5687.4111328125 4.750787734985352 7.0
+693.0669563055344 5688.48876953125 4.751057147979736 7.0
+693.0873888797141 5693.22998046875 4.75153112411499 7.0
+693.1078215539965 5686.58251953125 4.750819206237793 7.0
+693.1282540284155 5680.8515625 4.750277519226074 7.0
+693.1486867029453 5685.51611328125 4.750837802886963 7.0
+693.1691192776198 5691.54833984375 4.751490592956543 7.0
+693.1895517524026 5680.63037109375 4.750301837921143 7.0
+693.2099844273107 5686.50146484375 4.750879764556885 7.0
+693.2304170023344 5694.39501953125 4.751357555389404 7.0
+693.2508495774673 5689.4072265625 4.750710487365723 7.0
+693.271282152753 5690.56591796875 4.750744342803955 7.0
+693.2917147281551 5687.23486328125 4.750489711761475 7.0
+693.3121473036808 5688.79541015625 4.7509026527404785 7.0
+693.3325798793303 5693.76904296875 4.7514214515686035 7.0
+693.3530124550962 5691.45263671875 4.750393867492676 7.0
+693.3734451309865 5686.4970703125 4.7501397132873535 7.0
+693.3938776070136 5685.9501953125 4.750170707702637 7.0
+693.4143101831432 5684.1357421875 4.750219821929932 7.0
+693.4347428594119 5683.8046875 4.750349044799805 7.0
+693.4756079123254 5683.32421875 4.750407695770264 7.0
+693.4960405889578 5679.3720703125 4.750476837158203 7.0
+693.516473065727 5680.66162109375 4.749527454376221 7.0
+693.536905642628 5681.041015625 4.749144554138184 7.0
+693.5573383196243 5686.1884765625 4.750692367553711 7.0
+693.5777707967864 5682.1318359375 4.750133037567139 7.0
+693.5982034740446 5679.6494140625 4.7491912841796875 7.0
+693.6186360514257 5679.705078125 4.749243259429932 7.0
+693.6390685289516 5684.47998046875 4.749913692474365 7.0
+693.6595012065955 5685.890625 4.750010013580322 7.0
+693.7003662622665 5683.1572265625 4.750167369842529 7.0
+693.7412315184338 5675.16357421875 4.748961448669434 7.0
+693.7616639967164 5678.35009765625 4.749326705932617 7.0
+693.7820966751024 5684.28369140625 4.749868392944336 7.0
+693.8025292536258 5684.2158203125 4.750020980834961 7.0
+693.8229619322883 5676.39306640625 4.749720573425293 7.0
+693.8433944110584 5671.30126953125 4.748815536499023 7.0
+693.8638269899675 5682.38623046875 4.749516010284424 7.0
+693.8842596690083 5670.810546875 4.747890472412109 7.0
+693.9046921481786 5663.158203125 4.748414993286133 7.0
+693.9251247274733 5672.27685546875 4.749299049377441 7.0
+693.9455574068779 5678.03173828125 4.7498250007629395 7.0
+693.96598998642 5674.01953125 4.749438762664795 7.0
+693.9864224660996 5668.03515625 4.748826026916504 7.0
+694.0272877258321 5666.26513671875 4.748428821563721 7.0
+694.0477203058908 5669.00732421875 4.748493671417236 7.0
+694.068152886095 5667.3759765625 4.748341083526611 7.0
+694.0885854663939 5667.1376953125 4.749117374420166 7.0
+694.1090181468462 5673.1005859375 4.749103546142578 7.0
+694.129450627428 5657.3427734375 4.74774169921875 7.0
+694.1498832081197 5669.88916015625 4.748974323272705 7.0
+694.1703157889642 5663.9853515625 4.747847557067871 7.0
+694.1907483699251 5666.5810546875 4.749181270599365 7.0
+694.2111809510243 5667.48828125 4.7483954429626465 7.0
+694.2316135322471 5667.23046875 4.748699188232422 7.0
+694.2520461135864 5665.40185546875 4.747981548309326 7.0
+694.2724787950647 5662.318359375 4.748358249664307 7.0
+694.2929112766942 5669.62451171875 4.748749732971191 7.0
+694.3133438584409 5663.3095703125 4.74906587600708 7.0
+694.3337765402975 5664.60888671875 4.748409271240234 7.0
+694.3542090223054 5654.4638671875 4.747836112976074 7.0
+694.3746416044305 5665.84814453125 4.7494282722473145 7.0
+694.3950742866946 5659.2734375 4.747856616973877 7.0
+694.4155067690808 5654.06591796875 4.748010635375977 7.0
+694.4359394516141 5668.373046875 4.749250411987305 7.0
+694.4563720342558 5666.00732421875 4.749112129211426 7.0
+694.4972371999611 5656.7705078125 4.74843168258667 7.0
+694.5176697830102 5661.5634765625 4.7488250732421875 7.0
+694.5381023662121 5658.033203125 4.747604846954346 7.0
+694.5585349495304 5661.9990234375 4.748164653778076 7.0
+694.578967532987 5657.67138671875 4.748424530029297 7.0
+694.5994001165673 5662.4560546875 4.7492594718933105 7.0
+694.6198328002647 5659.08935546875 4.748917579650879 7.0
+694.6402652840989 5652.052734375 4.747372150421143 7.0
+694.6606979680582 5648.7919921875 4.747796535491943 7.0
+694.6811305521842 5649.4140625 4.748519420623779 7.0
+694.7015630364331 5650.7626953125 4.7490644454956055 7.0
+694.7219957207999 5648.6708984375 4.7482452392578125 7.0
+694.7424283053115 5652.17822265625 4.748671531677246 7.0
+694.7832934747348 5642.6513671875 4.747446060180664 7.0
+694.8037260596175 5645.779296875 4.747822284698486 7.0
+694.8241585446813 5645.84130859375 4.748280048370361 7.0
+694.844591229863 5667.30078125 4.750046253204346 7.0
+694.885456400596 5648.384765625 4.748132705688477 7.0
+694.9058889861844 5644.154296875 4.748111724853516 7.0
+694.9263214718812 5638.74365234375 4.747623920440674 7.0
+694.9467541577324 5641.8857421875 4.748161792755127 7.0
+694.9671867436991 5646.3046875 4.747992992401123 7.0
+694.9876193298041 5650.3203125 4.748779296875 7.0
+695.008051916062 5635.39990234375 4.747554302215576 7.0
+695.0284845024653 5661.09814453125 4.7497758865356445 7.0
+695.0489170889778 5636.08544921875 4.747677326202393 7.0
+695.0693496756139 5642.99267578125 4.747843265533447 7.0
+695.0897822624247 5647.0166015625 4.748217582702637 7.0
+695.1102149493163 5634.9150390625 4.745860576629639 7.0
+695.130647536389 5632.22265625 4.746342658996582 7.0
+695.1510800236065 5636.75048828125 4.747081279754639 7.0
+695.1715127109346 5626.650390625 4.745949745178223 7.0
+695.1919452983857 5628.1201171875 4.746084690093994 7.0
+695.2123777860106 5638.3076171875 4.74744987487793 7.0
+695.2328104737171 5635.11328125 4.747074127197266 7.0
+695.2532430616047 5629.2421875 4.746312618255615 7.0
+695.2736755496371 5634.921875 4.74599027633667 7.0
+695.2941082377802 5633.33984375 4.745304584503174 7.0
+695.3349735144875 5638.986328125 4.74791955947876 7.0
+695.3554060030656 5628.443359375 4.746364116668701 7.0
+695.375838591739 5623.0302734375 4.745988845825195 7.0
+695.3962712805805 5638.2490234375 4.746698379516602 7.0
+695.4167037695443 5627.65576171875 4.745934963226318 7.0
+695.4371363586833 5624.75048828125 4.746517181396484 7.0
+695.4575690479105 5625.40771484375 4.745572090148926 7.0
+695.4780015373035 5624.23876953125 4.74517822265625 7.0
+695.4984341268209 5622.58984375 4.74533748626709 7.0
+695.5392993062851 5620.80126953125 4.745188236236572 7.0
+695.5597319962399 5612.73779296875 4.744370460510254 7.0
+695.5801644863095 5626.2138671875 4.74545431137085 7.0
+695.6005970765182 5622.908203125 4.745504856109619 7.0
+695.6210297668804 5617.19873046875 4.745604991912842 7.0
+695.6414622573866 5622.68310546875 4.746120929718018 7.0
+695.6618948480027 5623.63330078125 4.745265483856201 7.0
+695.6823275387724 5613.43115234375 4.745230197906494 7.0
+695.7027601296868 5615.7509765625 4.745462417602539 7.0
+695.7231927207395 5607.95703125 4.744265079498291 7.0
+695.7436253119449 5616.2919921875 4.745562553405762 7.0
+695.7640579032595 5613.740234375 4.744936466217041 7.0
+695.7844904947269 5612.4833984375 4.745039463043213 7.0
+695.8049230863398 5609.35498046875 4.743732452392578 7.0
+695.8253556780983 5616.3583984375 4.745101451873779 7.0
+695.8457883699957 5614.59619140625 4.745328426361084 7.0
+695.8662208620153 5614.509765625 4.745326995849609 7.0
+695.886653454203 5613.1201171875 4.7451372146606445 7.0
+695.9070861465152 5611.7548828125 4.745628356933594 7.0
+695.9275186389714 5611.66943359375 4.745584487915039 7.0
+695.9479513315382 5607.87939453125 4.744416236877441 7.0
+695.9683839242862 5608.65869140625 4.744449615478516 7.0
+695.9888164171789 5608.44189453125 4.744839668273926 7.0
+696.0296817033377 5607.25634765625 4.745167255401611 7.0
+696.0501141966379 5603.2080078125 4.744812965393066 7.0
+696.0705468901069 5599.3828125 4.7438273429870605 7.0
+696.0909794836989 5605.49072265625 4.743722438812256 7.0
+696.1114119774065 5599.58837890625 4.743307590484619 7.0
+696.131844671283 5606.30029296875 4.743963241577148 7.0
+696.1522771652817 5603.37890625 4.744794845581055 7.0
+696.1931424537397 5592.97265625 4.742676734924316 7.0
+696.2135750481757 5600.55615234375 4.744760990142822 7.0
+696.2340076427863 5608.5380859375 4.74456787109375 7.0
+696.2544402375061 5601.7392578125 4.7444682121276855 7.0
+696.2748728323495 5603.22216796875 4.744993686676025 7.0
+696.2953054273967 5598.353515625 4.744893550872803 7.0
+696.315738022553 5596.73291015625 4.743709087371826 7.0
+696.336170617833 5601.55908203125 4.745013236999512 7.0
+696.3566033132884 5592.56787109375 4.743948459625244 7.0
+696.3770358088514 5592.68017578125 4.74405574798584 7.0
+696.3974685045978 5592.7578125 4.74312162399292 7.0
+696.4179011004599 5594.2978515625 4.743536949157715 7.0
+696.4587662926424 5595.306640625 4.74437141418457 7.0
+696.4791988889701 5595.578125 4.744078636169434 7.0
+696.4996313854062 5585.07763671875 4.742608547210693 7.0
+696.5200640820258 5592.7060546875 4.743943214416504 7.0
+696.540496678761 5588.173828125 4.743841171264648 7.0
+696.5609291756627 5601.99169921875 4.745625972747803 7.0
+696.5813618726897 5595.82080078125 4.743929862976074 7.0
+696.6017944698615 5589.72509765625 4.7444329261779785 7.0
+696.6222271671722 5596.26904296875 4.745639324188232 7.0
+696.6630922622717 5593.97412109375 4.7451581954956055 7.0
+696.683524960019 5581.2109375 4.743758678436279 7.0
+696.7039574579467 5584.4287109375 4.743645191192627 7.0
+696.7243900559915 5584.55224609375 4.743804454803467 7.0
+696.7448227541754 5579.9150390625 4.7437424659729 7.0
+696.7652552525396 5579.01904296875 4.743039608001709 7.0
+696.7856878510211 5582.72314453125 4.742615222930908 7.0
+696.8061204496698 5574.525390625 4.742734432220459 7.0
+696.8265530484423 5581.00048828125 4.743292331695557 7.0
+696.8469857473829 5584.15478515625 4.743649482727051 7.0
+696.8674183464755 5574.3037109375 4.743152141571045 7.0
+696.9082835450681 5579.48681640625 4.7429680824279785 7.0
+696.92871614459 5582.60302734375 4.743050575256348 7.0
+696.9491486442639 5587.1220703125 4.744223594665527 7.0
+696.9695813440776 5572.2490234375 4.742253303527832 7.0
+696.9900139440433 5571.80517578125 4.742292881011963 7.0
+697.0104466441553 5573.0126953125 4.742005825042725 7.0
+697.0308791444113 5580.45849609375 4.743282318115234 7.0
+697.071744445384 5565.849609375 4.741652011871338 7.0
+697.0921769460983 5574.89453125 4.742850303649902 7.0
+697.1126095469372 5583.3583984375 4.7435197830200195 7.0
+697.1330422479514 5577.640625 4.743056774139404 7.0
+697.1534747491096 5572.41748046875 4.742861270904541 7.0
+697.1739073504068 5569.05078125 4.742941379547119 7.0
+697.1943400518576 5564.818359375 4.742311000823975 7.0
+697.2147725534742 5578.19189453125 4.7432966232299805 7.0
+697.235205255216 5570.19580078125 4.741603851318359 7.0
+697.2556378571026 5573.49560546875 4.742823600769043 7.0
+697.276070359163 5572.39111328125 4.742530822753906 7.0
+697.2965030613632 5566.68896484375 4.742053031921387 7.0
+697.3169356636863 5574.0263671875 4.742650985717773 7.0
+697.3373682661768 5580.2490234375 4.742693901062012 7.0
+697.3578008688492 5579.62548828125 4.743688106536865 7.0
+697.3782334716379 5573.77490234375 4.743523120880127 7.0
+697.3986660745941 5580.0908203125 4.743119239807129 7.0
+697.419098677703 5573.791015625 4.742800235748291 7.0
+697.4395312809575 5573.2578125 4.742366790771484 7.0
+697.4599638843501 5574.7373046875 4.742915630340576 7.0
+697.4803964878956 5574.50537109375 4.743121147155762 7.0
+697.5008290916157 5572.28466796875 4.742751598358154 7.0
+697.5212617954458 5565.16943359375 4.742122173309326 7.0
+697.5416942994852 5570.55712890625 4.74275541305542 7.0
+697.5621269036419 5566.01025390625 4.741769790649414 7.0
+697.5825596079376 5564.4296875 4.741583824157715 7.0
+697.6029921124136 5562.65087890625 4.7422285079956055 7.0
+697.623424717036 5574.26025390625 4.743393898010254 7.0
+697.6438574217973 5574.57568359375 4.744882583618164 7.0
+697.6642899267099 5569.556640625 4.74350118637085 7.0
+697.6847226317623 5572.32666015625 4.7435503005981445 7.0
+697.7051552369958 5574.6474609375 4.7436418533325195 7.0
+697.7255877424031 5563.0634765625 4.742265701293945 7.0
+697.7460204479285 5571.64306640625 4.743316173553467 7.0
+697.7664530535912 5566.3037109375 4.742179870605469 7.0
+697.7868855594352 5570.3466796875 4.742494106292725 7.0
+697.8073182654189 5571.83447265625 4.742891788482666 7.0
+697.8277508715546 5573.98388671875 4.7431817054748535 7.0
+697.848183477865 5571.69140625 4.74283504486084 7.0
+697.8686160843208 5573.76513671875 4.743518352508545 7.0
+697.8890486909149 5569.61962890625 4.743048667907715 7.0
+697.9094813976626 5564.8818359375 4.742249488830566 7.0
+697.9503465116431 5563.5048828125 4.743449687957764 7.0
+697.9707792188565 5567.9873046875 4.743279933929443 7.0
+697.9912118262364 5573.51416015625 4.74357271194458 7.0
+698.0116443337683 5571.56005859375 4.743958950042725 7.0
+698.0320769414466 5576.6279296875 4.7439117431640625 7.0
+698.0933748654352 5570.9765625 4.743518352508545 7.0
+698.1342400821813 5564.36767578125 4.742637634277344 7.0
+698.1546726907909 5575.49609375 4.7444167137146 7.0
+698.175105199567 5572.8271484375 4.744471549987793 7.0
+698.1955379084975 5577.6240234375 4.7444915771484375 7.0
+698.2159705175727 5568.47509765625 4.743572235107422 7.0
+698.2364030268218 5568.3828125 4.74341344833374 7.0
+698.2568357362106 5563.35107421875 4.743037223815918 7.0
+698.2772683457515 5564.060546875 4.744068622589111 7.0
+698.297700855459 5563.3740234375 4.743973731994629 7.0
+698.3181335653207 5574.283203125 4.74461555480957 7.0
+698.3385661753564 5567.46044921875 4.744145393371582 7.0
+698.358998885531 5573.63720703125 4.744277000427246 7.0
+698.3998640063583 5580.0634765625 4.74501371383667 7.0
+698.4202967169986 5572.0693359375 4.743407726287842 7.0
+698.4407292277901 5581.38720703125 4.745357990264893 7.0
+698.4611618387571 5569.70068359375 4.744601249694824 7.0
+698.4815945498631 5571.97314453125 4.743614196777344 7.0
+698.5020270611494 5573.02783203125 4.744161128997803 7.0
+698.5224596726111 5580.9814453125 4.74636697769165 7.0
+698.5428923841828 5582.69287109375 4.746989727020264 7.0
+698.5633249959355 5574.1474609375 4.744890213012695 7.0
+698.5837576078338 5587.1689453125 4.744961261749268 7.0
+698.6041902198995 5574.953125 4.744338035583496 7.0
+698.624622832147 5574.37646484375 4.744937896728516 7.0
+698.6450555445044 5584.09130859375 4.746004104614258 7.0
+698.6654880570713 5581.05322265625 4.745555400848389 7.0
+698.6859206697554 5568.71142578125 4.744828224182129 7.0
+698.7063532826432 5572.58056640625 4.7443952560424805 7.0
+698.7267858956402 5578.59326171875 4.744985580444336 7.0
+698.7472184088474 5583.71435546875 4.745725631713867 7.0
+698.7676511221725 5573.98388671875 4.7452311515808105 7.0
+698.7880837356643 5572.8876953125 4.7463154792785645 7.0
+698.8085164493386 5579.3154296875 4.7446699142456055 7.0
+698.828948963157 5582.095703125 4.746831893920898 7.0
+698.8493815771435 5580.86865234375 4.74802827835083 7.0
+698.8698142912544 5592.13330078125 4.746277332305908 7.0
+698.8902468055676 5587.14306640625 4.74583625793457 7.0
+698.9106794200197 5580.92431640625 4.745754718780518 7.0
+698.9311121346545 5587.1171875 4.748512268066406 7.0
+698.9515446494333 5583.24169921875 4.745949745178223 7.0
+698.9719773643519 5593.7353515625 4.748548984527588 7.0
+699.0128425947187 5583.11865234375 4.745630741119385 7.0
+699.0332752101676 5586.05419921875 4.746277809143066 7.0
+699.053707825733 5582.798828125 4.747616767883301 7.0
+699.0741404415021 5570.23291015625 4.7454962730407715 7.0
+699.1150056734696 5586.08154296875 4.749141693115234 7.0
+699.135438289697 5576.98291015625 4.747361183166504 7.0
+699.1558710060781 5582.35498046875 4.750291347503662 7.0
+699.1763035226613 5580.89404296875 4.748711585998535 7.0
+699.1967362393552 5582.93359375 4.748074054718018 7.0
+699.2171688562594 5592.548828125 4.74880838394165 7.0
+699.2376013733083 5587.0224609375 4.74982213973999 7.0
+699.258034090497 5597.94482421875 4.750123023986816 7.0
+699.2784667078959 5584.17822265625 4.747948169708252 7.0
+699.2988992254104 5589.318359375 4.749503135681152 7.0
+699.3193319430939 5586.50244140625 4.748839855194092 7.0
+699.3397645609584 5588.7900390625 4.74894380569458 7.0
+699.3601970789969 5596.67041015625 4.749818801879883 7.0
+699.380629797146 5584.697265625 4.748319625854492 7.0
+699.4010623155336 5592.45556640625 4.749509811401367 7.0
+699.4214950340393 5590.83642578125 4.749197006225586 7.0
+699.4419276527115 5593.75341796875 4.74892520904541 7.0
+699.4623601715648 5591.23388671875 4.749420166015625 7.0
+699.4827928905361 5588.67578125 4.749449253082275 7.0
+699.5032255097321 5612.79541015625 4.7512030601501465 7.0
+699.5236580290511 5598.1357421875 4.749037742614746 7.0
+699.5440907485463 5593.07666015625 4.748763084411621 7.0
+699.564523368208 5600.83251953125 4.749087333679199 7.0
+699.6053886080117 5602.373046875 4.74989128112793 7.0
+699.6258212281973 5604.29736328125 4.749479293823242 7.0
+699.6462539485074 5595.3505859375 4.748761177062988 7.0
+699.6666864689905 5613.38037109375 4.7503228187561035 7.0
+699.6871190896418 5600.07763671875 4.749411106109619 7.0
+699.7075518104757 5589.87744140625 4.748707294464111 7.0
+699.7279844314253 5599.5400390625 4.74965763092041 7.0
+699.7484169525997 5594.279296875 4.748126983642578 7.0
+699.7688496738992 5587.9638671875 4.748177528381348 7.0
+699.7892822953727 5603.05419921875 4.748978614807129 7.0
+699.8097148170127 5595.4619140625 4.7498345375061035 7.0
+699.8301475388362 5601.89794921875 4.749499797821045 7.0
+699.8914454052865 5601.08154296875 4.749410152435303 7.0
+699.9118780277495 5597.283203125 4.750401973724365 7.0
+699.9323106503798 5608.1396484375 4.750889778137207 7.0
+699.9527432732502 5602.24365234375 4.750754356384277 7.0
+699.9731758962371 5609.51416015625 4.751209259033203 7.0
+699.9936085193913 5604.7626953125 4.7505574226379395 7.0
+700.0140411426692 5606.8310546875 4.750893592834473 7.0
+700.0344736661791 5615.111328125 4.751840591430664 7.0
+700.0753390136597 5610.34716796875 4.750588893890381 7.0
+700.0957717376295 5594.14892578125 4.750368595123291 7.0
+700.1162042617798 5601.95947265625 4.7503485679626465 7.0
+700.1366368861054 5615.97119140625 4.752671241760254 7.0
+700.1979347600645 5616.28515625 4.7525177001953125 7.0
+700.2183674850821 5613.1162109375 4.751540184020996 7.0
+700.2388001102227 5612.22265625 4.752297878265381 7.0
+700.2592326355953 5613.28271484375 4.7527995109558105 7.0
+700.2796653610785 5617.6171875 4.752561092376709 7.0
+700.3000979867429 5612.50048828125 4.7526469230651855 7.0
+700.3205306126401 5616.5830078125 4.75312614440918 7.0
+700.3409632385883 5609.25634765625 4.751349449157715 7.0
+700.3613958647766 5617.04443359375 4.752685546875 7.0
+700.3818285911402 5612.99951171875 4.751979351043701 7.0
+700.4022611176697 5608.6943359375 4.751534461975098 7.0
+700.4226937443818 5613.80029296875 4.753167629241943 7.0
+700.4431264712694 5616.90771484375 4.752864360809326 7.0
+700.4635589982645 5615.7529296875 4.752387046813965 7.0
+700.4839916255005 5621.01708984375 4.752780914306641 7.0
+700.5044243528537 5626.28466796875 4.754029750823975 7.0
+700.5248568804309 5623.6669921875 4.753629684448242 7.0
+700.5452896081333 5617.88134765625 4.753837585449219 7.0
+700.5657221360088 5617.94384765625 4.753641605377197 7.0
+700.5861547640525 5625.578125 4.754435062408447 7.0
+700.6065874922788 5615.15478515625 4.752834320068359 7.0
+700.6270201206789 5625.822265625 4.753722190856934 7.0
+700.6474526493039 5629.81396484375 4.754630088806152 7.0
+700.667885378054 5621.32275390625 4.754047870635986 7.0
+700.6883179069191 5619.03173828125 4.753360748291016 7.0
+700.7087505360105 5617.34130859375 4.752935886383057 7.0
+700.7291832652845 5623.75048828125 4.754520893096924 7.0
+700.7496157947317 5627.66748046875 4.754705429077148 7.0
+700.7700485243477 5626.27392578125 4.754712104797363 7.0
+700.7904811541448 5633.666015625 4.754699230194092 7.0
+700.8109137840584 5630.095703125 4.755550861358643 7.0
+700.8517790444603 5634.29736328125 4.754806995391846 7.0
+700.8722116749559 5626.35986328125 4.754850387573242 7.0
+700.8926444055614 5636.90478515625 4.755389213562012 7.0
+700.9130769364056 5624.4453125 4.7544755935668945 7.0
+700.9335095674251 5640.25 4.756019115447998 7.0
+700.9539422985545 5637.27685546875 4.756793022155762 7.0
+700.9743748299225 5631.44921875 4.755701065063477 7.0
+701.0152401931191 5637.9052734375 4.7554426193237305 7.0
+701.0356727249527 5627.150390625 4.755011558532715 7.0
+701.0561054569553 5625.12158203125 4.755092144012451 7.0
+701.0765380891971 5637.62255859375 4.755901336669922 7.0
+701.096970613522 5637.703125 4.755359649658203 7.0
+701.1174033460557 5631.32666015625 4.75559139251709 7.0
+701.1378359788141 5631.953125 4.754887104034424 7.0
+701.1582685117537 5643.41650390625 4.756547927856445 7.0
+701.178701244804 5630.5419921875 4.7555108070373535 7.0
+701.1991338780936 5632.73046875 4.756377220153809 7.0
+701.2399991451384 5637.77392578125 4.756495952606201 7.0
+701.2604317788864 5640.1787109375 4.756270885467529 7.0
+701.2808644128745 5627.318359375 4.755934715270996 7.0
+701.30129704703 5634.2197265625 4.755980491638184 7.0
+701.3217296813091 5632.685546875 4.755825042724609 7.0
+701.342162315821 5642.5078125 4.756550312042236 7.0
+701.3625949505076 5639.49365234375 4.756635665893555 7.0
+701.3830275853616 5640.013671875 4.756714344024658 7.0
+701.40346032034 5640.27978515625 4.756465911865234 7.0
+701.4238928555424 5653.86669921875 4.757667541503906 7.0
+701.4443255909282 5645.751953125 4.7570061683654785 7.0
+701.4647582264879 5641.201171875 4.7567267417907715 7.0
+701.4851907622215 5647.12158203125 4.756591320037842 7.0
+701.5056234981239 5637.96044921875 4.756703853607178 7.0
+701.5260561342075 5644.18798828125 4.757395267486572 7.0
+701.5464886704576 5649.18701171875 4.758101940155029 7.0
+701.5669214068912 5641.3251953125 4.757678031921387 7.0
+701.5873540434986 5644.75537109375 4.757818698883057 7.0
+701.6282193172883 5644.41650390625 4.757504940032959 7.0
+701.6486519544196 5638.48486328125 4.758254528045654 7.0
+701.669084691719 5638.9775390625 4.7579450607299805 7.0
+701.689517229257 5650.345703125 4.758969306945801 7.0
+701.7099498669704 5644.3017578125 4.759050369262695 7.0
+701.7303826047937 5643.09130859375 4.758291721343994 7.0
+701.7508151428556 5651.9931640625 4.759517669677734 7.0
+701.7712477810346 5636.3154296875 4.758950233459473 7.0
+701.8121130580257 5652.8134765625 4.759430885314941 7.0
+701.8325457967876 5648.2568359375 4.7594523429870605 7.0
+701.8529784357161 5644.880859375 4.758957862854004 7.0
+701.8938437141114 5657.84228515625 4.760678768157959 7.0
+701.9142762536212 5662.42919921875 4.761242866516113 7.0
+701.9347088932554 5668.01123046875 4.761510372161865 7.0
+701.9551416331233 5649.60400390625 4.760415077209473 7.0
+701.996006813315 5661.97216796875 4.761160373687744 7.0
+702.0164395536485 5652.861328125 4.760879039764404 7.0
+702.0368721942068 5653.216796875 4.760469913482666 7.0
+702.057304834947 5650.02880859375 4.760245323181152 7.0
+702.0777374758618 5649.58837890625 4.760903835296631 7.0
+702.098170116944 5661.7509765625 4.762989044189453 7.0
+702.118602858267 5656.048828125 4.761013031005859 7.0
+702.1390353997049 5659.427734375 4.761964321136475 7.0
+702.1594680413691 5663.939453125 4.76211404800415 7.0
+702.1799007831578 5658.646484375 4.761966228485107 7.0
+702.2003333251778 5658.2578125 4.762085914611816 7.0
+702.2411987097366 5666.90576171875 4.761905193328857 7.0
+702.2616312522805 5664.05029296875 4.76126766204834 7.0
+702.2820639949932 5661.65869140625 4.761484146118164 7.0
+702.3024966378871 5654.7392578125 4.76108455657959 7.0
+702.322929181013 5664.880859375 4.762698650360107 7.0
+702.3433619242496 5667.6181640625 4.76244592666626 7.0
+702.3842271113754 5668.93212890625 4.762561321258545 7.0
+702.404659855194 5656.95751953125 4.760847568511963 7.0
+702.4250924991939 5667.11083984375 4.762082099914551 7.0
+702.4455251433683 5671.9794921875 4.7622504234313965 7.0
+702.4659577877683 5664.08837890625 4.761805057525635 7.0
+702.486390432292 5668.3388671875 4.761382102966309 7.0
+702.5068230770412 5666.41357421875 4.761186122894287 7.0
+702.5272557219723 5671.43017578125 4.762233257293701 7.0
+702.5476883670781 5659.28564453125 4.7605061531066895 7.0
+702.5681210123512 5671.37939453125 4.761564254760742 7.0
+702.5885536578644 5674.05859375 4.762511730194092 7.0
+702.608986303494 5673.4755859375 4.761163711547852 7.0
+702.62941904935 5670.64501953125 4.7616753578186035 7.0
+702.6498515953863 5662.68408203125 4.761213779449463 7.0
+702.670284241598 5676.24609375 4.762375831604004 7.0
+702.6907169879778 5667.75146484375 4.761868000030518 7.0
+702.711149534538 5669.6591796875 4.762667179107666 7.0
+702.7315822813325 5673.6962890625 4.762993335723877 7.0
+702.7520149282936 5667.2373046875 4.762231349945068 7.0
+702.7724474754359 5677.76904296875 4.763759613037109 7.0
+702.7928802226961 5681.357421875 4.76283597946167 7.0
+702.8133128702393 5669.15673828125 4.763197898864746 7.0
+702.8337454179054 5670.85693359375 4.76275110244751 7.0
+702.8541781658059 5669.09765625 4.762393951416016 7.0
+702.874610813873 5672.9423828125 4.762599468231201 7.0
+702.9154761105456 5671.947265625 4.761167526245117 7.0
+702.9359087591365 5674.48583984375 4.764960289001465 7.0
+702.9563415079683 5671.05908203125 4.762353420257568 7.0
+702.9767740569732 5677.27294921875 4.762970924377441 7.0
+702.9972067061462 5673.6552734375 4.762208461761475 7.0
+703.0176394555019 5680.8271484375 4.765285491943359 7.0
+703.0380720050307 5675.2333984375 4.762179374694824 7.0
+703.0585046547858 5687.22021484375 4.763795375823975 7.0
+703.0993700548279 5673.98291015625 4.764065265655518 7.0
+703.1198026051134 5686.841796875 4.766415119171143 7.0
+703.1402353556332 5681.09326171875 4.7652974128723145 7.0
+703.1606679063261 5685.24951171875 4.765169143676758 7.0
+703.1811006571297 5677.7744140625 4.765042304992676 7.0
+703.2015333082309 5680.08740234375 4.763592720031738 7.0
+703.2219658594477 5687.7998046875 4.76427698135376 7.0
+703.2628312625166 5681.02587890625 4.76582145690918 7.0
+703.2832638143154 5681.99658203125 4.763125419616699 7.0
+703.3036965662832 5680.18310546875 4.764760971069336 7.0
+703.3241292184321 5683.71142578125 4.766021251678467 7.0
+703.344561770813 5683.24462890625 4.763462066650391 7.0
+703.364994523421 5679.64697265625 4.763987064361572 7.0
+703.385427176152 5679.7919921875 4.763057708740234 7.0
+703.4058599290511 5681.6162109375 4.763033866882324 7.0
+703.4467251355018 5688.3115234375 4.76588249206543 7.0
+703.4671578889829 5688.064453125 4.7652082443237305 7.0
+703.4875904427026 5686.990234375 4.765031814575195 7.0
+703.5080230965978 5688.41552734375 4.76641321182251 7.0
+703.528455850661 5689.28173828125 4.766260147094727 7.0
+703.5488884049046 5687.994140625 4.765905380249023 7.0
+703.5693210593818 5689.86279296875 4.7670722007751465 7.0
+703.5897538140271 5687.81640625 4.766669750213623 7.0
+703.6101864688535 5688.42041015625 4.7655816078186035 7.0
+703.6306191238546 5687.22900390625 4.766104698181152 7.0
+703.6510517790812 5694.095703125 4.765878200531006 7.0
+703.6919170900728 5684.3701171875 4.76447868347168 7.0
+703.7123497458815 5678.35546875 4.764097690582275 7.0
+703.7327824018721 5692.98486328125 4.765525817871094 7.0
+703.7532151580381 5694.43896484375 4.7665815353393555 7.0
+703.7736477143699 5694.94091796875 4.76559591293335 7.0
+703.7940803709425 5687.28759765625 4.764174938201904 7.0
+703.8145130276898 5682.80029296875 4.765068531036377 7.0
+703.8349456846045 5688.1484375 4.7646803855896 7.0
+703.85537844176 5697.2587890625 4.765573501586914 7.0
+703.8758109990304 5696.095703125 4.765760898590088 7.0
+703.8962436565271 5698.93359375 4.765506267547607 7.0
+703.9166764142647 5687.658203125 4.7646918296813965 7.0
+703.9371089721753 5689.40625 4.765597343444824 7.0
+703.9575416302541 5685.03125 4.7656941413879395 7.0
+703.9779743885156 5687.43505859375 4.764794826507568 7.0
+703.9984069470083 5685.017578125 4.764795303344727 7.0
+704.0188396056692 5690.4404296875 4.766331195831299 7.0
+704.0392723645127 5696.80029296875 4.766320705413818 7.0
+704.0597049235876 5695.14697265625 4.766497611999512 7.0
+704.0801376828313 5686.23095703125 4.764401435852051 7.0
+704.1005703422561 5690.02490234375 4.765252113342285 7.0
+704.1210030019138 5691.416015625 4.7650604248046875 7.0
+704.1414356616806 5688.11181640625 4.763780117034912 7.0
+704.1618683217457 5700.52734375 4.766007423400879 7.0
+704.1823009819273 5679.10009765625 4.7639288902282715 7.0
+704.2027336423344 5695.55029296875 4.766340732574463 7.0
+704.2231663029816 5693.50537109375 4.767089366912842 7.0
+704.2435989637452 5696.08642578125 4.76595401763916 7.0
+704.2640317247351 5697.900390625 4.76746940612793 7.0
+704.2844642859054 5691.1591796875 4.766879558563232 7.0
+704.3048970473028 5692.35205078125 4.766180992126465 7.0
+704.3253297088813 5701.2041015625 4.767305850982666 7.0
+704.3457622706337 5702.33935546875 4.7683515548706055 7.0
+704.3866276947738 5694.4365234375 4.767371654510498 7.0
+704.4070602571082 5696.26611328125 4.767672061920166 7.0
+704.4274930196698 5700.00830078125 4.768101692199707 7.0
+704.4479256824125 5692.658203125 4.767471790313721 7.0
+704.4683582453872 5701.662109375 4.767757892608643 7.0
+704.4887910084799 5696.42333984375 4.767730712890625 7.0
+704.5092235717966 5694.025390625 4.768661975860596 7.0
+704.529656335355 5701.54833984375 4.7694411277771 7.0
+704.5500889990799 5701.41845703125 4.768805027008057 7.0
+704.5909543271264 5687.95068359375 4.767345905303955 7.0
+704.6113869914407 5700.2578125 4.768998622894287 7.0
+704.6318195559215 5698.96337890625 4.76854133605957 7.0
+704.652252320644 5691.87744140625 4.767565727233887 7.0
+704.6726849855331 5702.1494140625 4.767578601837158 7.0
+704.6931176506623 5702.35546875 4.768163681030273 7.0
+704.7135503159661 5710.1943359375 4.768910884857178 7.0
+704.7339829814446 5694.9453125 4.768400192260742 7.0
+704.7544157471493 5700.201171875 4.768617630004883 7.0
+704.7748483130345 5706.921875 4.769206523895264 7.0
+704.7952809791459 5697.5546875 4.7687578201293945 7.0
+704.8157137453818 5696.7314453125 4.7679667472839355 7.0
+704.836146411908 5701.77294921875 4.768617630004883 7.0
+704.8565789785498 5693.16455078125 4.768291473388672 7.0
+704.8770117454769 5700.71630859375 4.768457889556885 7.0
+704.897444412527 5705.54248046875 4.768037796020508 7.0
+704.9178769798018 5697.50244140625 4.768009662628174 7.0
+704.9383097473183 5701.78173828125 4.768771648406982 7.0
+704.9791751828088 5689.46484375 4.767594337463379 7.0
+704.9996077509059 5704.0966796875 4.768468379974365 7.0
+705.0200404191783 5699.6044921875 4.769009590148926 7.0
+705.0404731876188 5710.0146484375 4.769929885864258 7.0
+705.0609057562979 5701.47509765625 4.7694525718688965 7.0
+705.1017710942324 5705.62158203125 4.769097805023193 7.0
+705.1222037635525 5700.19970703125 4.769291877746582 7.0
+705.1426363329883 5711.77490234375 4.770636558532715 7.0
+705.1630691026512 5700.2001953125 4.768088340759277 7.0
+705.1835017725534 5696.9228515625 4.768232345581055 7.0
+705.2243671128745 5708.97412109375 4.768220901489258 7.0
+705.2447997833588 5698.4833984375 4.766972064971924 7.0
+705.285665124844 5698.861328125 4.768107891082764 7.0
+705.3060977959685 5699.65234375 4.769443511962891 7.0
+705.3265305672103 5700.31689453125 4.76948881149292 7.0
+705.3673958103827 5701.99072265625 4.768095970153809 7.0
+705.3878285822575 5702.45947265625 4.769853115081787 7.0
+705.4082612543134 5708.98486328125 4.770167827606201 7.0
+705.4286939266021 5695.591796875 4.768054962158203 7.0
+705.4491265990655 5703.23681640625 4.769323348999023 7.0
+705.4695592717544 5702.8388671875 4.770364284515381 7.0
+705.489992044626 5703.66650390625 4.769407272338867 7.0
+705.5104246177216 5698.14599609375 4.769240856170654 7.0
+705.5308572909998 5697.66162109375 4.769394397735596 7.0
+705.5512900645117 5697.0751953125 4.767991065979004 7.0
+705.5717226381967 5704.98681640625 4.77024507522583 7.0
+705.5921553121079 5717.9970703125 4.771180152893066 7.0
+705.6330206605198 5703.595703125 4.7697434425354 7.0
+705.6534534350212 5703.201171875 4.769163608551025 7.0
+705.6738861096965 5708.373046875 4.768951416015625 7.0
+705.694318684662 5705.888671875 4.770042896270752 7.0
+705.7147514597382 5695.24755859375 4.7685933113098145 7.0
+705.7351841350537 5694.76416015625 4.7679877281188965 7.0
+705.755616710594 5709.88427734375 4.769728660583496 7.0
+705.7760494863178 5702.36083984375 4.769417762756348 7.0
+705.7964820622146 5707.6103515625 4.769748687744141 7.0
+705.8169147384033 5693.974609375 4.767838001251221 7.0
+705.8373475147018 5698.302734375 4.77011775970459 7.0
+705.8577801912397 5701.283203125 4.770041465759277 7.0
+705.8986455449485 5706.3427734375 4.769036293029785 7.0
+705.9190782220685 5703.25537109375 4.769801616668701 7.0
+705.9395108994722 5709.78564453125 4.7707200050354 7.0
+705.9599435769996 5703.39013671875 4.76896333694458 7.0
+705.9803762548181 5698.89892578125 4.769251823425293 7.0
+706.0212416109716 5702.80615234375 4.769323348999023 7.0
+706.041674289314 5695.4619140625 4.7704033851623535 7.0
+706.0621070678826 5703.7666015625 4.770546913146973 7.0
+706.0825396466898 5692.62255859375 4.769749164581299 7.0
+706.1029724257314 5689.1875 4.768130779266357 7.0
+706.1234051049396 5697.51318359375 4.770394802093506 7.0
+706.1438376843289 5699.0009765625 4.770505428314209 7.0
+706.1642704639526 5703.9853515625 4.771953582763672 7.0
+706.2051357238306 5711.501953125 4.7709150314331055 7.0
+706.2255685040363 5700.119140625 4.769379615783691 7.0
+706.2460011844669 5712.17919921875 4.770228385925293 7.0
+706.2664337651368 5694.5673828125 4.769032955169678 7.0
+706.2868665459828 5698.68408203125 4.769863605499268 7.0
+706.3072992270536 5698.423828125 4.770659446716309 7.0
+706.3481645898501 5705.5908203125 4.770374774932861 7.0
+706.3890300533967 5711.70458984375 4.771382808685303 7.0
+706.4094626355218 5701.79248046875 4.770907878875732 7.0
+706.429895317815 5701.50927734375 4.770927906036377 7.0
+706.4503280003482 5696.279296875 4.770251750946045 7.0
+706.4707606830561 5702.90966796875 4.7710490226745605 7.0
+706.4911933659896 5706.6884765625 4.7714433670043945 7.0
+706.5116261491057 5693.4873046875 4.7703375816345215 7.0
+706.5320587325114 5698.67578125 4.771064281463623 7.0
+706.5524915160277 5703.6259765625 4.771100997924805 7.0
+706.5729241998415 5693.0390625 4.770862102508545 7.0
+706.593356783771 5697.43408203125 4.770754337310791 7.0
+706.6137895679858 5702.67529296875 4.770325183868408 7.0
+706.6342222523817 5693.93994140625 4.768951416015625 7.0
+706.6546548369515 5703.00244140625 4.771113872528076 7.0
+706.6955203067846 5694.99658203125 4.768095970153809 7.0
+706.7159528920529 5702.47802734375 4.770450592041016 7.0
+706.73638567749 5699.7255859375 4.769489765167236 7.0
+706.7568183631083 5695.4345703125 4.768474578857422 7.0
+706.7772511489529 5698.16748046875 4.7702741622924805 7.0
+706.7976837350361 5694.40380859375 4.769843578338623 7.0
+706.8181164213529 5695.1181640625 4.770573616027832 7.0
+706.8385492078378 5696.72265625 4.770295143127441 7.0
+706.858981794503 5705.099609375 4.7721028327941895 7.0
+706.8794144814601 5685.16845703125 4.770038604736328 7.0
+706.8998472685271 5696.23681640625 4.770080089569092 7.0
+706.9202798558908 5703.12890625 4.7697978019714355 7.0
+706.9611453311954 5714.30908203125 4.771512508392334 7.0
+706.981578019142 5698.5 4.768700122833252 7.0
+707.0020107073215 5699.03369140625 4.76873254776001 7.0
+707.0224433957264 5701.8564453125 4.7706074714660645 7.0
+707.0428759843126 5684.31787109375 4.768874645233154 7.0
+707.063308773133 5686.80078125 4.76901388168335 7.0
+707.0837414621201 5685.431640625 4.769242286682129 7.0
+707.1041740514047 5687.4052734375 4.769346237182617 7.0
+707.1246068408072 5684.9921875 4.767375469207764 7.0
+707.1654721203595 5677.8388671875 4.768916606903076 7.0
+707.1859049104605 5684.29052734375 4.768456935882568 7.0
+707.2267703912366 5688.7041015625 4.767828941345215 7.0
+707.2472029819764 5686.7275390625 4.769266128540039 7.0
+707.2676356728844 5680.5380859375 4.767991065979004 7.0
+707.2880684640331 5692.0595703125 4.768846035003662 7.0
+707.3085010554132 5693.34521484375 4.769371509552002 7.0
+707.3289337469614 5694.85009765625 4.76918888092041 7.0
+707.3493665387505 5689.46533203125 4.7698893547058105 7.0
+707.3697991307708 5678.931640625 4.768566608428955 7.0
+707.3902318229593 5680.263671875 4.7690300941467285 7.0
+707.4106646153887 5681.1015625 4.769537925720215 7.0
+707.4310972080493 5673.9169921875 4.768862724304199 7.0
+707.4515300008788 5676.95263671875 4.7692084312438965 7.0
+707.4719626939477 5689.84130859375 4.769054889678955 7.0
+707.4923952872487 5675.578125 4.767342567443848 7.0
+707.5128280807185 5676.13525390625 4.76801061630249 7.0
+707.5332607744276 5678.517578125 4.768784999847412 7.0
+707.5536934683696 5674.755859375 4.767617702484131 7.0
+707.5741261624789 5680.861328125 4.768150329589844 7.0
+707.5945588568284 5677.9150390625 4.767305850982666 7.0
+707.6149915514106 5681.322265625 4.768399238586426 7.0
+707.635424346161 5678.4052734375 4.767997741699219 7.0
+707.6558569412082 5661.87646484375 4.7674760818481445 7.0
+707.6762897364242 5675.3427734375 4.768123149871826 7.0
+707.6967223318206 5672.63720703125 4.769274711608887 7.0
+707.7171550275089 5666.22705078125 4.767799377441406 7.0
+707.737587823307 5677.41015625 4.76959228515625 7.0
+707.7580204194019 5672.50634765625 4.769039154052734 7.0
+707.7784531157304 5667.548828125 4.769227981567383 7.0
+707.798885912227 5662.66162109375 4.768038749694824 7.0
+707.8193185089622 5671.45263671875 4.768120288848877 7.0
+707.8601840030096 5665.01806640625 4.766955375671387 7.0
+707.8806166004433 5670.86572265625 4.770440101623535 7.0
+707.9010493979949 5669.05859375 4.769463062286377 7.0
+707.9214820957714 5664.99462890625 4.768099784851074 7.0
+707.9623474920954 5659.8740234375 4.767013072967529 7.0
+707.9827801905121 5667.4755859375 4.768776893615723 7.0
+708.0032128892271 5665.66064453125 4.768721103668213 7.0
+708.0236455881168 5664.99267578125 4.769130706787109 7.0
+708.0440782871738 5655.41845703125 4.7681565284729 7.0
+708.0645109865291 5663.1728515625 4.768454074859619 7.0
+708.084943686059 5659.955078125 4.768832683563232 7.0
+708.1053763858145 5660.0732421875 4.768767356872559 7.0
+708.1258091858108 5657.18603515625 4.768504619598389 7.0
+708.1462418860392 5666.0087890625 4.769716262817383 7.0
+708.1666744864342 5647.41455078125 4.767295837402344 7.0
+708.2075399879395 5653.91357421875 4.768754005432129 7.0
+708.2279725889748 5654.97412109375 4.767911434173584 7.0
+708.2484053903099 5661.06689453125 4.768503189086914 7.0
+708.2688380918189 5656.09521484375 4.769275665283203 7.0
+708.3097034954699 5656.87109375 4.768880367279053 7.0
+708.3301361976191 5646.57470703125 4.7674241065979 7.0
+708.350568899994 5653.91796875 4.767708778381348 7.0
+708.3914342054559 5645.6474609375 4.7684431076049805 7.0
+708.4118670084717 5643.2744140625 4.764819145202637 7.0
+708.4322997117852 5643.97412109375 4.76633882522583 7.0
+708.4527323152142 5656.13037109375 4.768590927124023 7.0
+708.4731651189286 5645.419921875 4.766998291015625 7.0
+708.4935978228823 5642.95068359375 4.767836570739746 7.0
+708.5140304270099 5635.7529296875 4.767193794250488 7.0
+708.5344632313645 5640.78515625 4.766547203063965 7.0
+708.5548959359585 5640.2314453125 4.766886234283447 7.0
+708.5753287407861 5639.650390625 4.767223834991455 7.0
+708.5957613457795 5646.89208984375 4.76837158203125 7.0
+708.6161940510137 5636.75830078125 4.767027378082275 7.0
+708.6366268564743 5643.68994140625 4.766945838928223 7.0
+708.6570594621735 5632.689453125 4.766595363616943 7.0
+708.6774921681063 5638.2724609375 4.766768455505371 7.0
+708.6979249742144 5634.8515625 4.767115116119385 7.0
+708.7183576806055 5636.52197265625 4.767004489898682 7.0
+708.7387902871778 5643.1435546875 4.76643705368042 7.0
+708.7592230939772 5637.66845703125 4.766305923461914 7.0
+708.7796558009577 5622.1982421875 4.765575885772705 7.0
+708.8000885082292 5639.2431640625 4.766363143920898 7.0
+708.8205212156754 5641.1875 4.767358303070068 7.0
+708.8409539233471 5629.076171875 4.765265941619873 7.0
+708.8613867312597 5634.58154296875 4.764506816864014 7.0
+708.8818193393963 5640.6640625 4.766685485839844 7.0
+708.9022520477156 5626.708984375 4.766101360321045 7.0
+708.9226848563267 5626.64404296875 4.766444206237793 7.0
+708.9431174651108 5636.84375 4.767077445983887 7.0
+708.9635502741221 5626.96142578125 4.7666144371032715 7.0
+708.9839828833719 5627.96142578125 4.766032695770264 7.0
+709.0044155928481 5621.73974609375 4.766072750091553 7.0
+709.0248484025069 5626.0263671875 4.767160415649414 7.0
+709.0452810124552 5625.96728515625 4.765946865081787 7.0
+709.086146532929 5621.6181640625 4.765824317932129 7.0
+709.1065791435176 5626.7919921875 4.766887664794922 7.0
+709.1270118543325 5619.36279296875 4.766127109527588 7.0
+709.1474446653883 5621.80078125 4.765422821044922 7.0
+709.1678772766172 5619.09375 4.765542984008789 7.0
+709.1883100881314 5613.54443359375 4.765997409820557 7.0
+709.2087427997685 5615.6630859375 4.764845371246338 7.0
+709.2291755117549 5609.89990234375 4.7648606300354 7.0
+709.2700409362442 5616.52001953125 4.764572620391846 7.0
+709.2904736488708 5613.73681640625 4.7657151222229 7.0
+709.3109063616648 5615.4306640625 4.765837669372559 7.0
+709.3313390747571 5605.33837890625 4.764376163482666 7.0
+709.351771788024 5605.95556640625 4.763923168182373 7.0
+709.3722046015173 5604.84130859375 4.766080379486084 7.0
+709.3926372152491 5614.84521484375 4.765558242797852 7.0
+709.4130700292153 5609.77197265625 4.766166687011719 7.0
+709.4335027434063 5607.47216796875 4.7655768394470215 7.0
+709.4539353577784 5617.45556640625 4.766211032867432 7.0
+709.4743681724431 5611.08642578125 4.766040325164795 7.0
+709.4948008872743 5606.41162109375 4.765370845794678 7.0
+709.5152335023449 5605.22802734375 4.764888286590576 7.0
+709.5356663177081 5602.4580078125 4.764636039733887 7.0
+709.5560990331796 5599.4365234375 4.764125347137451 7.0
+709.5969644649522 5611.76611328125 4.765480995178223 7.0
+709.6173971811804 5603.7958984375 4.764541149139404 7.0
+709.6378298976488 5598.58935546875 4.764747142791748 7.0
+709.6582626142917 5605.03271484375 4.76567268371582 7.0
+709.6786952312177 5602.09423828125 4.764787673950195 7.0
+709.6991280483271 5595.40966796875 4.764191627502441 7.0
+709.7195607656686 5604.26025390625 4.764998435974121 7.0
+709.7399933832348 5596.7333984375 4.765347003936768 7.0
+709.7604262010427 5586.55322265625 4.764105796813965 7.0
+709.7808589190827 5595.109375 4.764090538024902 7.0
+709.8012916373482 5595.814453125 4.764606952667236 7.0
+709.8217243558538 5589.45458984375 4.764624118804932 7.0
+709.8421570745923 5599.90625 4.765660762786865 7.0
+709.8625898934988 5591.8837890625 4.764753341674805 7.0
+709.8830226127029 5594.6416015625 4.765223979949951 7.0
+709.9034552320809 5591.51708984375 4.764794826507568 7.0
+709.9238880517441 5587.57177734375 4.76576042175293 7.0
+709.9443207715885 5586.02099609375 4.763719081878662 7.0
+709.9647533917232 5580.59228515625 4.764723777770996 7.0
+709.9851862119685 5588.765625 4.7647624015808105 7.0
+710.0056189325696 5585.24462890625 4.763362407684326 7.0
+710.0260515532864 5588.40087890625 4.762964725494385 7.0
+710.0464843743466 5582.1884765625 4.764720439910889 7.0
+710.0669170955298 5582.66259765625 4.763621807098389 7.0
+710.0873499170557 5583.96337890625 4.762588024139404 7.0
+710.1077825387038 5589.05419921875 4.764994144439697 7.0
+710.1282152607018 5585.9580078125 4.763655185699463 7.0
+710.1486480828098 5581.31005859375 4.763782024383545 7.0
+710.1690807051564 5586.4599609375 4.763000011444092 7.0
+710.189513427853 5581.55029296875 4.762820243835449 7.0
+710.2099461506587 5585.24267578125 4.764056205749512 7.0
+710.2508115969831 5585.89404296875 4.764007568359375 7.0
+710.2712444206045 5581.021484375 4.762748718261719 7.0
+710.291677044348 5576.61669921875 4.76385498046875 7.0
+710.3121098683259 5582.60498046875 4.7642011642456055 7.0
+710.3529752169707 5586.63671875 4.763365745544434 7.0
+710.373408041647 5584.9365234375 4.763556003570557 7.0
+710.3938407666647 5590.69140625 4.763985633850098 7.0
+710.4142733918052 5582.60205078125 4.763777256011963 7.0
+710.4347062171801 5576.99365234375 4.763750076293945 7.0
+710.4551389427797 5579.11669921875 4.76410436630249 7.0
+710.4755715686188 5578.173828125 4.762352466583252 7.0
+710.4960043946921 5571.85546875 4.764300346374512 7.0
+710.5164371209903 5571.10302734375 4.763141632080078 7.0
+710.5368698475286 5573.43017578125 4.763776779174805 7.0
+710.5573025742997 5576.4462890625 4.7636518478393555 7.0
+710.5777353012963 5564.3603515625 4.761077880859375 7.0
+710.5981681285339 5568.23681640625 4.7610697746276855 7.0
+710.6186007561191 5569.5087890625 4.761144638061523 7.0
+710.6390334838143 5577.22412109375 4.762585639953613 7.0
+710.6594663117503 5564.96142578125 4.761647701263428 7.0
+710.6798989399176 5561.958984375 4.762167453765869 7.0
+710.7003316683113 5577.48974609375 4.763446807861328 7.0
+710.7207644969458 5574.6904296875 4.763679027557373 7.0
+710.7411971258116 5573.85546875 4.76342248916626 7.0
+710.7616299549045 5573.58642578125 4.763619899749756 7.0
+710.7820626842367 5569.0234375 4.763026714324951 7.0
+710.802495313801 5566.95654296875 4.760918617248535 7.0
+710.8229281435924 5565.94189453125 4.7632012367248535 7.0
+710.8433608736232 5570.29931640625 4.763707637786865 7.0
+710.8637936038867 5570.2822265625 4.764648914337158 7.0
+710.9046590652215 5564.14697265625 4.762025356292725 7.0
+711.4359103471215 5551.921875 4.763237953186035 7.0
+711.4563429842528 5571.3515625 4.765112400054932 7.0
+711.4767757216105 5566.123046875 4.763988971710205 7.0
+711.4972084592082 5566.95556640625 4.764150142669678 7.0
+711.5176411970388 5566.71826171875 4.7646260261535645 7.0
+711.5380739350949 5568.2548828125 4.765106201171875 7.0
+711.5585066733911 5558.6318359375 4.764740943908691 7.0
+711.5789394119201 5562.7353515625 4.764881134033203 7.0
+711.5993722506755 5563.77099609375 4.76546573638916 7.0
+711.6198049896702 5562.0986328125 4.765855312347412 7.0
+711.640237628897 5565.94677734375 4.764540672302246 7.0
+711.6606704684673 5576.74609375 4.766265869140625 7.0
+711.7015358480858 5560.029296875 4.765499114990234 7.0
+711.7219686883545 5562.255859375 4.764829158782959 7.0
+711.7424014287462 5558.54052734375 4.764401912689209 7.0
+711.7628340694864 5564.73974609375 4.765832424163818 7.0
+711.7832669104537 5576.126953125 4.766161918640137 7.0
+711.8036996515439 5560.8662109375 4.765364170074463 7.0
+711.8241324929841 5564.630859375 4.7653632164001465 7.0
+711.8445651346483 5554.73876953125 4.764101505279541 7.0
+711.8649978765534 5562.5625 4.764453887939453 7.0
+711.8854307186848 5565.14306640625 4.765176296234131 7.0
+711.9058633609384 5567.19921875 4.76576566696167 7.0
+711.9262961036584 5559.2021484375 4.765617370605469 7.0
+711.9467289464956 5561.18798828125 4.76470422744751 7.0
+711.9671615895568 5565.923828125 4.766036510467529 7.0
+711.9875943328589 5561.412109375 4.766068935394287 7.0
+712.0080271763873 5561.85546875 4.764744758605957 7.0
+712.0284598202707 5562.482421875 4.7661356925964355 7.0
+712.048892664272 5568.17529296875 4.765702247619629 7.0
+712.0693254086218 5564.556640625 4.766594409942627 7.0
+712.0897581530808 5562.02490234375 4.765692234039307 7.0
+712.1101908978962 5563.81201171875 4.765766143798828 7.0
+712.1306236429373 5567.2607421875 4.7656474113464355 7.0
+712.151056388102 5571.7001953125 4.76605224609375 7.0
+712.171489133616 5570.92431640625 4.7663397789001465 7.0
+712.1919218793628 5579.38037109375 4.766891002655029 7.0
+712.2123546253351 5569.2138671875 4.766299724578857 7.0
+712.2327873715476 5561.50537109375 4.766140460968018 7.0
+712.2532201179856 5566.765625 4.766683101654053 7.0
+712.2940856116911 5569.89990234375 4.767569065093994 7.0
+712.3145183588349 5570.2685546875 4.766904354095459 7.0
+712.3349512063214 5564.08544921875 4.7667341232299805 7.0
+712.3553838539301 5559.2119140625 4.7659196853637695 7.0
+712.3758166018815 5568.17724609375 4.766576766967773 7.0
+712.3962494500738 5571.5908203125 4.766981601715088 7.0
+712.4166820984974 5560.34326171875 4.765584945678711 7.0
+712.4371148471546 5574.73583984375 4.767816543579102 7.0
+712.4575476960381 5570.95166015625 4.76739501953125 7.0
+712.4779803451602 5570.68310546875 4.766479969024658 7.0
+712.4984131945093 5571.90771484375 4.765698432922363 7.0
+712.5188459440978 5575.3369140625 4.767823219299316 7.0
+712.5392785940348 5573.53076171875 4.765878200531006 7.0
+712.5597114440825 5569.0595703125 4.767606258392334 7.0
+712.5801441944859 5582.783203125 4.768505573272705 7.0
+712.6005769450057 5572.37890625 4.7669477462768555 7.0
+712.6210096958675 5571.61181640625 4.767945766448975 7.0
+712.6414424469694 5575.09619140625 4.768333911895752 7.0
+712.6618751983042 5573.7919921875 4.767642021179199 7.0
+712.6823079498645 5578.61865234375 4.7689971923828125 7.0
+712.7436063060741 5571.7783203125 4.768068313598633 7.0
+712.7640389585722 5574.91552734375 4.767959117889404 7.0
+712.7844718114211 5581.595703125 4.769335746765137 7.0
+712.8049044643776 5574.63134765625 4.769155025482178 7.0
+712.8253372176914 5571.853515625 4.768115043640137 7.0
+712.8457700712315 5570.72119140625 4.768206596374512 7.0
+712.8866354790225 5573.5595703125 4.767838478088379 7.0
+712.9070683332684 5574.2431640625 4.767923831939697 7.0
+712.9275009878547 5576.86669921875 4.767987251281738 7.0
+712.9479338425663 5582.25439453125 4.768520355224609 7.0
+712.968366597619 5579.92138671875 4.769008159637451 7.0
+712.9887992527947 5585.61474609375 4.7695393562316895 7.0
+713.0092321083212 5583.31689453125 4.769391059875488 7.0
+713.0296648640797 5581.81005859375 4.769709587097168 7.0
+713.050097520063 5575.18359375 4.768608093261719 7.0
+713.0705303762879 5568.99609375 4.768363952636719 7.0
+713.0909631327377 5576.958984375 4.769696235656738 7.0
+713.1113959895447 5570.59912109375 4.768300533294678 7.0
+713.1318286464666 5583.1767578125 4.769324779510498 7.0
+713.1522614037385 5572.18701171875 4.7690348625183105 7.0
+713.1726942611203 5584.33447265625 4.770003318786621 7.0
+713.1931269188572 5563.40576171875 4.767933368682861 7.0
+713.2135596768203 5573.474609375 4.769356727600098 7.0
+713.2339925350243 5580.47607421875 4.769067764282227 7.0
+713.2544252935768 5587.4794921875 4.7705230712890625 7.0
+713.2748579522449 5579.27880859375 4.768861293792725 7.0
+713.2952908112566 5577.08447265625 4.770114898681641 7.0
+713.3157235703911 5573.46923828125 4.770257949829102 7.0
+713.3361563298677 5583.99853515625 4.770202159881592 7.0
+713.3565890895843 5575.17578125 4.7688751220703125 7.0
+713.3770218495338 5585.900390625 4.770812034606934 7.0
+713.3974546097088 5587.34033203125 4.771158695220947 7.0
+713.4178873701239 5587.876953125 4.770748615264893 7.0
+713.4587528917618 5578.54345703125 4.770285129547119 7.0
+713.4791856529919 5587.6376953125 4.770869731903076 7.0
+713.4996184144547 5594.244140625 4.77116584777832 7.0
+713.5200511761432 5579.36279296875 4.769245624542236 7.0
+713.5404839380717 5592.890625 4.7706427574157715 7.0
+713.5609168002338 5587.41015625 4.770447254180908 7.0
+713.58134946262 5585.15771484375 4.77023458480835 7.0
+713.6017822253634 5591.42578125 4.771231174468994 7.0
+713.6222150883405 5587.7890625 4.77101993560791 7.0
+713.6426477515415 5580.4599609375 4.769996643066406 7.0
+713.6630805149834 5587.9248046875 4.770996570587158 7.0
+713.683513378659 5583.06103515625 4.770256996154785 7.0
+713.7039460425585 5583.6162109375 4.77032470703125 7.0
+713.724378806699 5590.56201171875 4.771337032318115 7.0
+713.7448116711894 5580.751953125 4.770765781402588 7.0
+713.7856772007435 5584.4775390625 4.771332740783691 7.0
+713.8061099659317 5581.63232421875 4.771157741546631 7.0
+713.8469754971156 5597.3115234375 4.771705627441406 7.0
+713.8674082631187 5587.9638671875 4.770936012268066 7.0
+713.8878410292309 5594.51123046875 4.770960330963135 7.0
+713.9082738957004 5594.55126953125 4.771245002746582 7.0
+713.9287065624012 5591.486328125 4.77178430557251 7.0
+713.9491393293283 5595.86328125 4.772381782531738 7.0
+713.9695721964963 5591.27978515625 4.771579742431641 7.0
+713.990004864012 5597.359375 4.772077560424805 7.0
+714.0104377316384 5596.3349609375 4.771971225738525 7.0
+714.0308704996205 5589.5703125 4.771246433258057 7.0
+714.0513031678347 5592.7392578125 4.772238731384277 7.0
+714.071736036276 5601.09130859375 4.77286434173584 7.0
+714.0921687050723 5593.3310546875 4.771699905395508 7.0
+714.1126014739857 5600.69775390625 4.7731781005859375 7.0
+714.1943326524197 5598.28857421875 4.773458957672119 7.0
+714.214765322613 5599.35693359375 4.773316383361816 7.0
+714.2351981930406 5604.57373046875 4.773777961730957 7.0
+714.2556309638094 5601.28515625 4.772797107696533 7.0
+714.2964965060528 5597.4892578125 4.772919654846191 7.0
+714.3169292775274 5601.076171875 4.773519039154053 7.0
+714.3373620492348 5603.0615234375 4.774888515472412 7.0
+714.3577948212915 5605.44140625 4.774521827697754 7.0
+714.3782275934573 5607.8525390625 4.773608207702637 7.0
+714.3986604659804 5607.65087890625 4.774890422821045 7.0
+714.4190931387275 5607.228515625 4.774721622467041 7.0
+714.4395259118319 5602.67529296875 4.774178981781006 7.0
+714.4599587850535 5602.09423828125 4.774402618408203 7.0
+714.4803915586162 5616.33740234375 4.775862216949463 7.0
+714.5008242324184 5600.9599609375 4.7745041847229 7.0
+714.5212571064549 5604.283203125 4.77495002746582 7.0
+714.5416898807161 5604.34130859375 4.774831295013428 7.0
+714.5621225552168 5611.875 4.775930404663086 7.0
+714.5825554300682 5608.939453125 4.775282382965088 7.0
+714.6234210804614 5617.3994140625 4.776206016540527 7.0
+714.6438537560098 5611.06396484375 4.774972438812256 7.0
+714.6642865317845 5613.7177734375 4.775940895080566 7.0
+714.6847194079164 5607.048828125 4.774927616119385 7.0
+714.7051520841633 5617.16357421875 4.776010036468506 7.0
+714.7255848607529 5624.87646484375 4.776036262512207 7.0
+714.7460176375826 5611.1171875 4.775362014770508 7.0
+714.7664504147615 5616.67822265625 4.775692462921143 7.0
+714.7868830920488 5604.615234375 4.773964881896973 7.0
+714.8073159696942 5613.4296875 4.77558708190918 7.0
+714.8277487475716 5619.3798828125 4.77605676651001 7.0
+714.8481816256754 5609.87255859375 4.775022029876709 7.0
+714.8686143040177 5609.345703125 4.774999141693115 7.0
+714.88904708271 5618.65087890625 4.776254653930664 7.0
+714.9094799616287 5620.65771484375 4.7763519287109375 7.0
+714.9299126407859 5623.47705078125 4.7767815589904785 7.0
+714.9503454201767 5610.47265625 4.775712013244629 7.0
+714.9707782997939 5623.009765625 4.7767133712768555 7.0
+714.9912110797668 5621.07568359375 4.7763872146606445 7.0
+715.0116437599718 5616.18017578125 4.7767157554626465 7.0
+715.0320766404038 5620.91748046875 4.776028633117676 7.0
+715.0729422019795 5620.92333984375 4.776004791259766 7.0
+715.0933749832257 5615.98388671875 4.775486469268799 7.0
+715.113807764712 5622.97412109375 4.775999546051025 7.0
+715.1342406464246 5620.01220703125 4.775723934173584 7.0
+715.1546733283758 5620.49755859375 4.775362014770508 7.0
+715.175106110677 5621.09765625 4.775931358337402 7.0
+715.1955389930954 5625.0703125 4.776142597198486 7.0
+715.2568373421964 5629.53515625 4.776386260986328 7.0
+715.277270025661 5627.98681640625 4.776846408843994 7.0
+715.2977029094764 5635.7568359375 4.777354717254639 7.0
+715.3181356935165 5626.60986328125 4.776188850402832 7.0
+715.3385683779125 5628.5322265625 4.7770094871521 7.0
+715.3590012624263 5627.1767578125 4.776542663574219 7.0
+715.3794340472814 5637.091796875 4.777196407318115 7.0
+715.3998667323758 5628.68310546875 4.7767252922058105 7.0
+715.4202996177046 5630.38330078125 4.777275085449219 7.0
+715.4407323032647 5633.13623046875 4.7773284912109375 7.0
+715.4611651891682 5627.185546875 4.776853084564209 7.0
+715.4815979753112 5624.0673828125 4.7772417068481445 7.0
+715.5020307616796 5640.20556640625 4.777881622314453 7.0
+715.5224635482882 5633.455078125 4.7771477699279785 7.0
+715.542896335246 5634.4794921875 4.777698040008545 7.0
+715.5633291224294 5622.5244140625 4.7751030921936035 7.0
+715.5837619098529 5643.74462890625 4.777833938598633 7.0
+715.6041946975092 5634.1953125 4.775967121124268 7.0
+715.6246274855075 5634.6162109375 4.776895046234131 7.0
+715.6450602737459 5635.109375 4.776993274688721 7.0
+715.6654930622171 5629.4677734375 4.776891231536865 7.0
+715.6859259509147 5635.880859375 4.77679967880249 7.0
+715.7063587398516 5636.65380859375 4.7772536277771 7.0
+715.7267914291369 5634.23193359375 4.777414798736572 7.0
+715.7472243186494 5640.61279296875 4.777909755706787 7.0
+715.7676571084012 5630.0986328125 4.777133941650391 7.0
+715.7880897985015 5634.6904296875 4.776978015899658 7.0
+715.8085226887124 5639.25732421875 4.777563571929932 7.0
+715.8289554793955 5638.67529296875 4.778000354766846 7.0
+715.8493881701943 5634.07666015625 4.777547359466553 7.0
+715.8698210612201 5643.4404296875 4.778399467468262 7.0
+715.8902538526017 5630.76904296875 4.77730655670166 7.0
+715.9311194360562 5636.654296875 4.776859760284424 7.0
+715.9515522282527 5661.3134765625 4.778800964355469 7.0
+715.9719851205591 5644.35546875 4.77810001373291 7.0
+715.9924178132205 5642.31201171875 4.777697563171387 7.0
+716.012850606232 5657.759765625 4.77897834777832 7.0
+716.0332833993598 5645.1982421875 4.7772345542907715 7.0
+716.0537161928296 5652.078125 4.778347969055176 7.0
+716.0741489865395 5645.78662109375 4.777928352355957 7.0
+716.0945817804823 5647.4208984375 4.778086185455322 7.0
+716.115014574767 5644.9052734375 4.777881622314453 7.0
+716.1354474692926 5645.89013671875 4.778249740600586 7.0
+716.1558802640502 5648.2041015625 4.779321670532227 7.0
+716.1763129590327 5654.14306640625 4.779885768890381 7.0
+716.1967458543731 5672.96044921875 4.780430316925049 7.0
+716.2376113457431 5653.52587890625 4.779059886932373 7.0
+716.258044241782 5659.40576171875 4.779483318328857 7.0
+716.2784770381695 5651.6162109375 4.7791547775268555 7.0
+716.2989097347818 5653.60400390625 4.778900146484375 7.0
+716.3193426316357 5662.373046875 4.780656337738037 7.0
+716.3397754288308 5648.00927734375 4.7793169021606445 7.0
+716.3602083261503 5658.892578125 4.780131816864014 7.0
+716.3806410238176 5644.27978515625 4.778749465942383 7.0
+716.4010738218349 5661.1162109375 4.780300617218018 7.0
+716.421506719962 5659.45068359375 4.779501438140869 7.0
+716.4419394184442 5654.8017578125 4.778976917266846 7.0
+716.4623722171527 5649.154296875 4.779192924499512 7.0
+716.5032378153992 5653.85791015625 4.778905868530273 7.0
+716.5236706149299 5662.45263671875 4.78096866607666 7.0
+716.5441035148033 5662.49365234375 4.780313014984131 7.0
+716.5645362147989 5650.83984375 4.779574394226074 7.0
+716.5849691151379 5656.5966796875 4.779703617095947 7.0
+716.6054019157164 5674.44189453125 4.782130241394043 7.0
+716.6258347165276 5663.12451171875 4.780797481536865 7.0
+716.6462675176808 5651.65478515625 4.779113292694092 7.0
+716.6667003190742 5653.755859375 4.77964448928833 7.0
+716.6871330206995 5675.064453125 4.781795024871826 7.0
+716.7075659226684 5656.29052734375 4.779690742492676 7.0
+716.7279987248767 5666.4072265625 4.7807512283325195 7.0
+716.748431427317 5658.4990234375 4.779637336730957 7.0
+716.7688643299844 5656.40283203125 4.779047012329102 7.0
+716.7892971330075 5667.17529296875 4.778616428375244 7.0
+716.8097299362635 5662.1376953125 4.77927827835083 7.0
+716.830162739745 5663.43212890625 4.779426097869873 7.0
+716.850595543583 5661.17138671875 4.7792277336120605 7.0
+716.8710284476547 5665.31640625 4.779996871948242 7.0
+716.8914611519504 5667.00537109375 4.780270099639893 7.0
+716.9118939564869 5660.27001953125 4.779216766357422 7.0
+716.9323268613734 5662.142578125 4.7805094718933105 7.0
+716.952759566484 5660.33349609375 4.7806196212768555 7.0
+716.9731924719526 5667.17724609375 4.780786037445068 7.0
+716.9936252775369 5660.908203125 4.780292987823486 7.0
+717.0140579834624 5665.65966796875 4.780641555786133 7.0
+717.0344908897459 5661.33642578125 4.779755115509033 7.0
+717.0549236961451 5668.4951171875 4.780012607574463 7.0
+717.0753564028855 5663.5419921875 4.780117034912109 7.0
+717.0957893098675 5663.12744140625 4.779037952423096 7.0
+717.116222117198 5668.59228515625 4.779760837554932 7.0
+717.1366549247541 5660.2236328125 4.779736518859863 7.0
+717.1570877325503 5673.1474609375 4.780452728271484 7.0
+717.1775205405793 5668.515625 4.780432224273682 7.0
+717.197953448951 5667.22802734375 4.7805962562561035 7.0
+717.2183861575613 5673.25927734375 4.78032112121582 7.0
+717.2592518755919 5680.3193359375 4.780788898468018 7.0
+717.2796845850171 5665.9169921875 4.780793190002441 7.0
+717.3001173946759 5670.880859375 4.780643463134766 7.0
+717.3205503046775 5670.27685546875 4.779026031494141 7.0
+717.3409830149176 5671.5205078125 4.780165195465088 7.0
+717.3614158253913 5670.52197265625 4.77924919128418 7.0
+717.3818487362078 5664.19482421875 4.778459072113037 7.0
+717.4022814472628 5663.59521484375 4.7798027992248535 7.0
+717.4227143585449 5663.6142578125 4.77857780456543 7.0
+717.4431471701828 5665.22802734375 4.779720783233643 7.0
+717.4635798819363 5672.24755859375 4.78018856048584 7.0
+717.484012794157 5675.9599609375 4.777706623077393 7.0
+717.5044456064861 5669.53955078125 4.779458999633789 7.0
+717.524878319171 5674.2197265625 4.781059741973877 7.0
+717.5453112320829 5672.45166015625 4.780521392822266 7.0
+717.5657440453506 5675.53076171875 4.779953956604004 7.0
+717.5861767587339 5674.7626953125 4.780996322631836 7.0
+717.6066096725845 5673.14892578125 4.779678821563721 7.0
+717.6270424865434 5676.4580078125 4.781135559082031 7.0
+717.6474754008595 5680.03759765625 4.780516624450684 7.0
+717.6679081153998 5675.29638671875 4.7808308601379395 7.0
+717.6883409301809 5673.42041015625 4.780478477478027 7.0
+717.708773845312 5679.52099609375 4.780645370483398 7.0
+717.7292065606744 5677.740234375 4.779818534851074 7.0
+717.7496393763795 5669.5322265625 4.779116153717041 7.0
+717.7700722923255 5680.517578125 4.780524253845215 7.0
+717.8109378249064 5674.69482421875 4.778182029724121 7.0
+717.8313707416673 5672.5234375 4.779138565063477 7.0
+717.851803558653 5675.82666015625 4.779829025268555 7.0
+717.8722363759953 5664.603515625 4.77775239944458 7.0
+717.8926691935703 5674.15234375 4.7787322998046875 7.0
+717.9131020113709 5678.099609375 4.779090881347656 7.0
+717.9335348295281 5688.98583984375 4.780852317810059 7.0
+717.9539676478016 5675.87744140625 4.779597759246826 7.0
+717.9744003665328 5683.86279296875 4.780267715454102 7.0
+717.9948332853892 5682.9052734375 4.77921724319458 7.0
+718.015266104594 5684.33447265625 4.780141830444336 7.0
+718.0356990240252 5676.83447265625 4.779798984527588 7.0
+718.0561317438114 5683.16796875 4.777112007141113 7.0
+718.0765645638312 5673.5185546875 4.7781805992126465 7.0
+718.0969974840773 5687.04345703125 4.7815446853637695 7.0
+718.1174302046784 5683.12255859375 4.779595375061035 7.0
+718.1378630255131 5684.25830078125 4.780335426330566 7.0
+718.1582959465741 5679.08349609375 4.779200553894043 7.0
+718.1991614896397 5689.59033203125 4.781091213226318 7.0
+718.219594411632 5677.537109375 4.779362678527832 7.0
+718.2400271338629 5680.7041015625 4.779971122741699 7.0
+718.2604600563209 5682.509765625 4.778659820556641 7.0
+718.301325602064 5679.28515625 4.779795169830322 7.0
+718.3217585253442 5683.42626953125 4.781123638153076 7.0
+718.362624172827 5676.5361328125 4.7808098793029785 7.0
+718.3830569969141 5682.36279296875 4.780694961547852 7.0
+718.4034898213577 5687.99853515625 4.7828049659729 7.0
+718.423922646034 5679.8271484375 4.780150890350342 7.0
+718.4443554710597 5680.70703125 4.780551910400391 7.0
+718.4647882961945 5679.9267578125 4.78201961517334 7.0
+718.4852212216865 5680.80078125 4.781923294067383 7.0
+718.5056540475198 5677.1005859375 4.781024932861328 7.0
+718.5260867735924 5690.77197265625 4.78199577331543 7.0
+718.5465196998994 5682.62255859375 4.781263828277588 7.0
+718.5669525265475 5679.220703125 4.780848979949951 7.0
+718.5873852534351 5691.70361328125 4.781933307647705 7.0
+718.6078181805569 5679.90966796875 4.7810235023498535 7.0
+718.6282509080193 5693.99755859375 4.783286094665527 7.0
+718.6486837357224 5692.82080078125 4.7822747230529785 7.0
+718.6691166637756 5677.42431640625 4.78060245513916 7.0
+718.6895493920601 5685.904296875 4.781016826629639 7.0
+718.7099823205717 5690.4990234375 4.782655715942383 7.0
+718.7304151494391 5680.65771484375 4.7798075675964355 7.0
+718.771280807865 5677.2568359375 4.780425548553467 7.0
+718.7917136375472 5688.59716796875 4.781543731689453 7.0
+718.8530121282165 5687.826171875 4.781041622161865 7.0
+718.87344505894 5677.9228515625 4.780122756958008 7.0
+718.8938777900185 5686.10693359375 4.781486988067627 7.0
+718.9143106213305 5690.36572265625 4.7820587158203125 7.0
+718.9347435528689 5679.3154296875 4.782064914703369 7.0
+718.9551762847623 5682.27734375 4.781162261962891 7.0
+718.9756091168892 5678.43603515625 4.781020164489746 7.0
+718.996042049359 5678.97216796875 4.780666828155518 7.0
+719.016474882068 5680.3212890625 4.782186985015869 7.0
+719.0369076151255 5685.47607421875 4.780477523803711 7.0
+719.0573405482937 5693.087890625 4.781771183013916 7.0
+719.0777733819341 5685.82373046875 4.781714916229248 7.0
+719.0982062156909 5684.33203125 4.778876304626465 7.0
+719.1186390497896 5679.32275390625 4.780594825744629 7.0
+719.1390718842449 5680.0126953125 4.780403137207031 7.0
+719.159504718933 5684.82861328125 4.781664848327637 7.0
+719.1799375538467 5680.5029296875 4.780650615692139 7.0
+719.2003703890005 5674.23583984375 4.780669212341309 7.0
+719.2208032245035 5681.7763671875 4.780867576599121 7.0
+719.2412360603485 5693.14990234375 4.782212257385254 7.0
+719.2616688964335 5687.37939453125 4.78183126449585 7.0
+719.2821017327515 5680.78076171875 4.781593322753906 7.0
+719.3229675063121 5688.83935546875 4.7812700271606445 7.0
+719.3434002434442 5682.92578125 4.781556606292725 7.0
+719.363833080919 5684.46435546875 4.781233787536621 7.0
+719.3842660186347 5686.80224609375 4.781341552734375 7.0
+719.404698756698 5691.23974609375 4.781602382659912 7.0
+719.4251315949878 5679.85888671875 4.780484676361084 7.0
+719.4455645335183 5689.3466796875 4.780875205993652 7.0
+719.4864301116177 5684.0048828125 4.781527996063232 7.0
+719.5068630509631 5683.02587890625 4.780481815338135 7.0
+719.547728730693 5683.42626953125 4.781980514526367 7.0
+735.40366757843 5917.59375 4.424470901489258 8.0
+735.424100664568 5914.3876953125 4.4310221672058105 8.0
+735.444533750946 5923.1396484375 4.437106609344482 8.0
+735.4649668377897 5923.33447265625 4.433094501495361 8.0
+735.4853999249754 5903.52294921875 4.436556816101074 8.0
+735.5058330124011 5917.66650390625 4.439695358276367 8.0
+735.5671323770002 5915.33642578125 4.4418840408325195 8.0
+735.5875653658222 5916.29150390625 4.4457926750183105 8.0
+735.6079985551041 5912.92041015625 4.446610927581787 8.0
+735.6284316446254 5899.13916015625 4.4472761154174805 8.0
+735.6488646346115 5911.375 4.449671268463135 8.0
+735.6692978248248 5890.6220703125 4.449256896972656 8.0
+735.6897309155102 5908.8447265625 4.450470447540283 8.0
+735.7101639064276 5908.2236328125 4.4542741775512695 8.0
+735.730597097805 5920.2001953125 4.450678825378418 8.0
+735.7510301894217 5902.91064453125 4.467539310455322 8.0
+735.7714631815033 5914.61767578125 4.473100662231445 8.0
+735.791896373812 5902.4248046875 4.473530292510986 8.0
+735.8123294665929 5908.51806640625 4.472215175628662 8.0
+735.8327625596066 5904.87109375 4.476147651672363 8.0
+735.8531956529623 5902.951171875 4.47433614730835 8.0
+735.8940618408524 5909.0166015625 4.47693395614624 8.0
+735.9757942208089 5890.67626953125 4.475922584533691 8.0
+736.0370935095052 5899.642578125 4.478322505950928 8.0
+736.0983928012283 5894.3681640625 4.478068828582764 8.0
+736.1188259991322 5898.38623046875 4.480104446411133 8.0
+736.1596920960947 5896.80810546875 4.481062412261963 8.0
+736.1801252951627 5891.98681640625 4.480895042419434 8.0
+736.2414245943364 5888.94287109375 4.480790615081787 8.0
+736.2618576946843 5888.36328125 4.4805216789245605 8.0
+736.3027238965369 5887.51220703125 4.482002258300781 8.0
+736.3231569980417 5891.6572265625 4.481860160827637 8.0
+736.3435901997873 5891.22021484375 4.482570648193359 8.0
+736.364023201997 5882.49609375 4.483020305633545 8.0
+736.4253225106004 5889.203125 4.484504699707031 8.0
+736.4457556140842 5881.8408203125 4.483486652374268 8.0
+736.4661887180409 5890.48486328125 4.4835734367370605 8.0
+736.4866218223469 5883.46923828125 4.483558654785156 8.0
+736.5070550268792 5884.681640625 4.483764171600342 8.0
+736.5479211372367 5885.2197265625 4.484284400939941 8.0
+736.5683543429332 5881.37646484375 4.484197616577148 8.0
+736.6092204552697 5881.52783203125 4.484219551086426 8.0
+736.6296536620139 5877.9189453125 4.483841896057129 8.0
+736.6500867691138 5875.89501953125 4.484627723693848 8.0
+736.6909529842378 5871.63134765625 4.484632968902588 8.0
+736.7113860923855 5869.0927734375 4.4836225509643555 8.0
+736.7318193008832 5872.32177734375 4.484282970428467 8.0
+736.7522523097214 5874.384765625 4.484969615936279 8.0
+736.7931186284623 5877.78125 4.485285758972168 8.0
+736.8135516383481 5873.12939453125 4.485458850860596 8.0
+736.8339847485913 5872.0224609375 4.484941482543945 8.0
+736.8544179591845 5876.06591796875 4.485362529754639 8.0
+736.8748509701181 5868.46337890625 4.485096454620361 8.0
+736.8952841814098 5868.892578125 4.485487937927246 8.0
+736.91571729305 5878.44775390625 4.486001491546631 8.0
+736.9361503050313 5861.6748046875 4.484527111053467 8.0
+736.9770166301751 5865.80419921875 4.485828876495361 8.0
+736.9974497432049 5859.30322265625 4.4850544929504395 8.0
+737.0178828565913 5864.7255859375 4.485058307647705 8.0
+737.0383159704434 5866.12646484375 4.48588752746582 8.0
+737.058749084521 5861.25048828125 4.484619140625 8.0
+737.0791821989551 5872.033203125 4.486110687255859 8.0
+737.0996153138549 5865.26904296875 4.484823703765869 8.0
+737.5082776845593 5860.33447265625 4.4870381355285645 8.0
+737.5491440293699 5861.81201171875 4.487929344177246 8.0
+737.5695772523031 5860.4091796875 4.487166881561279 8.0
+737.5900102757005 5848.6015625 4.485606670379639 8.0
+737.671742772538 5858.5146484375 4.487729072570801 8.0
+737.7330421487786 5844.12255859375 4.485971927642822 8.0
+737.7534753749715 5859.90283203125 4.487807750701904 8.0
+737.7943416282797 5854.0048828125 4.48779296875 8.0
+737.8147747555195 5849.3623046875 4.486870765686035 8.0
+737.8556410110396 5850.38671875 4.490117073059082 8.0
+737.8760741393271 5854.46337890625 4.488053798675537 8.0
+737.9169403969427 5847.30419921875 4.4883551597595215 8.0
+737.937373526278 5848.2607421875 4.487538814544678 8.0
+737.957806755956 5853.78759765625 4.4880828857421875 8.0
+737.9782397861054 5847.3583984375 4.487208366394043 8.0
+737.9986729164884 5856.744140625 4.488708972930908 8.0
+738.0191061472142 5850.69970703125 4.488503456115723 8.0
+738.0395391784114 5852.72314453125 4.488868713378906 8.0
+738.0599723098421 5852.99609375 4.488267421722412 8.0
+738.080405541732 5853.11328125 4.488240718841553 8.0
+738.1008385738605 5849.197265625 4.4881696701049805 8.0
+738.1212717064554 5853.181640625 4.490755558013916 8.0
+738.1417049393931 5857.17724609375 4.489171504974365 8.0
+738.1621379725693 5849.62939453125 4.488028526306152 8.0
+738.2030043401974 5858.484375 4.489049434661865 8.0
+738.2234374745385 5858.998046875 4.489193916320801 8.0
+738.2438706092216 5862.04443359375 4.4922261238098145 8.0
+738.2643037442613 5849.15185546875 4.490423202514648 8.0
+738.2847368796502 5852.634765625 4.488876819610596 8.0
+738.3051700155047 5852.92626953125 4.492015361785889 8.0
+738.3256031515848 5854.44775390625 4.489878177642822 8.0
+738.3460362880214 5850.81005859375 4.4918622970581055 8.0
+738.3664695248008 5857.66455078125 4.491948127746582 8.0
+738.386902562168 5847.53466796875 4.490772247314453 8.0
+738.4073357995367 5846.79052734375 4.49105167388916 8.0
+738.4277688376023 5846.83349609375 4.4903388023376465 8.0
+738.4482019756615 5844.455078125 4.489284038543701 8.0
+738.4686352144272 5850.5712890625 4.489589214324951 8.0
+738.4890682534169 5851.5615234375 4.491595268249512 8.0
+738.5095013926475 5842.9697265625 4.488973617553711 8.0
+738.5299346323445 5847.87158203125 4.49081563949585 8.0
+738.5503676722728 5857.845703125 4.492508888244629 8.0
+738.5708008126603 5845.6259765625 4.489173412322998 8.0
+738.5912340535215 5845.3154296875 4.490100860595703 8.0
+738.6116670946067 5839.55615234375 4.489380359649658 8.0
+738.6321003361663 5838.130859375 4.488315582275391 8.0
+738.6525334779581 5848.66552734375 4.489254474639893 8.0
+738.6729665202147 5840.9609375 4.490649700164795 8.0
+738.6933997626984 5852.81005859375 4.4924139976501465 8.0
+738.7138329056543 5854.62744140625 4.492311000823975 8.0
+738.7342660488357 5846.23681640625 4.491433143615723 8.0
+738.7546991924901 5841.02783203125 4.4916181564331055 8.0
+738.7751323363773 5851.0380859375 4.492648601531982 8.0
+738.7955654807229 5847.71435546875 4.49237060546875 8.0
+738.8159986255414 5843.52783203125 4.492263317108154 8.0
+738.8364317705928 5842.73876953125 4.4914374351501465 8.0
+738.8568650158704 5840.6962890625 4.491511344909668 8.0
+738.8772981616203 5839.4541015625 4.491158962249756 8.0
+738.897731207835 5843.16162109375 4.491620063781738 8.0
+738.9181644542768 5846.18798828125 4.492398738861084 8.0
+738.9385976011908 5837.591796875 4.49138069152832 8.0
+738.9590306483369 5838.64990234375 4.491220474243164 8.0
+738.9794638959429 5838.96630859375 4.4916157722473145 8.0
+738.9998970437882 5849.07666015625 4.491949081420898 8.0
+739.0611963896445 5848.20849609375 4.493623733520508 8.0
+739.0816296391204 5840.6494140625 4.4916791915893555 8.0
+739.1020627888211 5841.91015625 4.491549968719482 8.0
+739.1429290891683 5844.3779296875 4.493515491485596 8.0
+739.1633622400332 5844.66552734375 4.492923259735107 8.0
+739.1837952911374 5835.34130859375 4.490609169006348 8.0
+739.2042285427087 5832.79296875 4.492391109466553 8.0
+739.2450949467748 5843.7275390625 4.492863178253174 8.0
+739.265527999276 5844.3701171875 4.492467880249023 8.0
+739.3063944056703 5839.95947265625 4.4927778244018555 8.0
+739.3268274593356 5838.64990234375 4.493232727050781 8.0
+739.3472606132273 5846.8330078125 4.493280410766602 8.0
+739.3676938675926 5836.0986328125 4.492119312286377 8.0
+739.3881269224221 5840.638671875 4.493349552154541 8.0
+739.4085600774779 5841.31591796875 4.493964672088623 8.0
+739.4289933330074 5845.85693359375 4.493758201599121 8.0
+739.4494264887617 5850.1513671875 4.493852138519287 8.0
+739.6537580666118 5837.71240234375 4.491002559661865 8.0
+739.6741912265643 5840.4033203125 4.494053363800049 8.0
+739.6946244867431 5850.5888671875 4.494643211364746 8.0
+739.7150575471605 5849.62109375 4.494430065155029 8.0
+739.7354907080444 5843.87646484375 4.491905689239502 8.0
+739.7559239691545 5842.705078125 4.493246555328369 8.0
+739.7763570307361 5843.85205078125 4.493255138397217 8.0
+739.7967901927841 5849.6162109375 4.4941792488098145 8.0
+739.9193892720432 5840.09912109375 4.492503643035889 8.0
+739.9398224364122 5842.75927734375 4.493565082550049 8.0
+739.9602556012542 5846.9677734375 4.494317531585693 8.0
+740.001121932095 5848.3486328125 4.495566368103027 8.0
+740.0215550978683 5842.55615234375 4.494697570800781 8.0
+740.0419882641072 5843.4384765625 4.494293689727783 8.0
+740.0624214308045 5844.982421875 4.4949164390563965 8.0
+740.0828546977427 5828.6884765625 4.493764400482178 8.0
+740.1032878651458 5840.2734375 4.49482536315918 8.0
+740.1237209330066 5845.349609375 4.495267868041992 8.0
+740.1441542011089 5848.43798828125 4.495162010192871 8.0
+740.1645873694433 5845.16845703125 4.494006633758545 8.0
+740.1850204382354 5849.6357421875 4.495471954345703 8.0
+740.2054537075019 5853.40478515625 4.49516487121582 8.0
+740.2258868770004 5845.5068359375 4.493713855743408 8.0
+740.2463199469566 5846.81787109375 4.494719982147217 8.0
+740.2667532171545 5850.09423828125 4.496112823486328 8.0
+740.3076195587055 5849.03173828125 4.496478080749512 8.0
+740.3280527300667 5850.642578125 4.495885372161865 8.0
+740.593684090556 5851.04052734375 4.49780797958374 8.0
+740.6141172668067 5846.35107421875 4.496615409851074 8.0
+740.6345503437551 5851.78564453125 4.497060298919678 8.0
+740.6549836206977 5849.6279296875 4.4978203773498535 8.0
+740.6754167983454 5859.19873046875 4.497493267059326 8.0
+740.6958499762259 5854.22021484375 4.497256755828857 8.0
+740.7162831543319 5852.396484375 4.497441291809082 8.0
+740.7367163329109 5851.58203125 4.495874881744385 8.0
+740.7571496119563 5851.853515625 4.497961521148682 8.0
+740.7775826912257 5857.5712890625 4.498745918273926 8.0
+740.7980158709688 5853.044921875 4.497949600219727 8.0
+740.8388822313791 5857.19873046875 4.497656345367432 8.0
+740.9001817747921 5862.31005859375 4.4989824295043945 8.0
+740.9206150566315 5859.2548828125 4.498249530792236 8.0
+740.941048138935 5854.82373046875 4.497361183166504 8.0
+740.9614813214648 5856.67578125 4.496817588806152 8.0
+740.9819146044683 5853.79736328125 4.498110294342041 8.0
+741.002347687936 5854.38134765625 4.498513221740723 8.0
+741.0432141555648 5851.40869140625 4.498678684234619 8.0
+741.0636472399638 5853.02099609375 4.497865676879883 8.0
+741.1658132675366 5860.400390625 4.498176574707031 8.0
+741.1862464540318 5855.4296875 4.497462749481201 8.0
+741.2066796409854 5860.99658203125 4.498293399810791 8.0
+741.2271128284119 5863.44140625 4.499316215515137 8.0
+741.2679793041898 5854.13671875 4.4983978271484375 8.0
+741.2884123925469 5861.66357421875 4.499263763427734 8.0
+741.3292788704202 5865.43115234375 4.498560905456543 8.0
+741.3497119599415 5858.68310546875 4.498958587646484 8.0
+741.3701452499226 5874.068359375 4.501194000244141 8.0
+741.3905784401431 5866.9794921875 4.499348163604736 8.0
+741.4110115308285 5870.3525390625 4.5001091957092285 8.0
+741.4314448217483 5860.203125 4.498900890350342 8.0
+741.4518780131257 5866.76220703125 4.499719142913818 8.0
+741.4723111047424 5864.083984375 4.498871803283691 8.0
+741.492744396819 5874.98974609375 4.501540184020996 8.0
+741.5131775893678 5871.47265625 4.499811172485352 8.0
+741.5336107821495 5873.4560546875 4.501506805419922 8.0
+741.5744770688689 5864.744140625 4.499892234802246 8.0
+741.5949103628154 5873.51171875 4.500748157501221 8.0
+741.6153435569868 5867.97119140625 4.500256538391113 8.0
+741.6357766516303 5869.8349609375 4.500153064727783 8.0
+741.6562099465082 5867.31298828125 4.500556945800781 8.0
+741.7175095336934 5867.5478515625 4.500816345214844 8.0
+741.7583760271664 5869.4873046875 4.500743389129639 8.0
+741.7788091241382 5894.1708984375 4.503551959991455 8.0
+741.8196756197067 5868.05810546875 4.5016584396362305 8.0
+741.8401088180763 5868.47802734375 4.500802516937256 8.0
+741.8605419166706 5875.1826171875 4.5022149085998535 8.0
+741.8809752157395 5879.4130859375 4.502540588378906 8.0
+741.9014084150404 5884.37109375 4.5031561851501465 8.0
+741.9218417148004 5875.4765625 4.5019707679748535 8.0
+741.9627080154969 5874.33447265625 4.501662731170654 8.0
+741.9831413161883 5876.869140625 4.501231670379639 8.0
+742.0240076189802 5887.49853515625 4.501476764678955 8.0
+742.0444409210686 5872.267578125 4.50147819519043 8.0
+742.0648740233955 5887.1455078125 4.503571033477783 8.0
+742.0853072259561 5875.9091796875 4.502131462097168 8.0
+742.1057405289757 5873.55126953125 4.502254009246826 8.0
+742.1261736324668 5878.541015625 4.502513408660889 8.0
+742.1466069361923 5884.8486328125 4.501531600952148 8.0
+742.1670401403753 5875.5986328125 4.5023322105407715 8.0
+742.1874732450306 5887.6845703125 4.502723217010498 8.0
+742.2079065499202 5874.81787109375 4.501569747924805 8.0
+742.2487728606211 5886.95849609375 4.502970218658447 8.0
+742.2692061666748 5885.3515625 4.504051685333252 8.0
+742.2896392729526 5881.416015625 4.504302024841309 8.0
+742.3100725797049 5880.13330078125 4.503049373626709 8.0
+742.330505786922 5878.41064453125 4.5025177001953125 8.0
+742.3509389943647 5887.11328125 4.503488540649414 8.0
+742.4122386188028 5884.26123046875 4.503784656524658 8.0
+742.4735382467334 5881.4111328125 4.5037126541137695 8.0
+742.4939715567452 5886.40576171875 4.503790855407715 8.0
+742.5144046672212 5893.64306640625 4.505814075469971 8.0
+742.5348379779243 5891.16064453125 4.503139972686768 8.0
+742.5552711890996 5893.572265625 4.504521369934082 8.0
+742.5757043005069 5898.27685546875 4.505195617675781 8.0
+742.5961376123742 5891.0087890625 4.505232334136963 8.0
+742.6165708247136 5883.8125 4.504856109619141 8.0
+742.637003937285 5887.724609375 4.505129814147949 8.0
+742.6574372503164 5896.92138671875 4.505871772766113 8.0
+742.6778704635872 5892.61328125 4.505527496337891 8.0
+742.698303777317 5893.68017578125 4.5042643547058105 8.0
+742.7187368912855 5895.54248046875 4.505208492279053 8.0
+742.7391701057204 5896.30517578125 4.505393981933594 8.0
+742.7596034206144 5897.5185546875 4.5055131912231445 8.0
+742.7800365357471 5895.33154296875 4.505392074584961 8.0
+742.8004697513461 5900.03955078125 4.505985260009766 8.0
+742.8209030671715 5900.08203125 4.506864070892334 8.0
+742.8617694002314 5896.7158203125 4.505852699279785 8.0
+742.9026358346819 5901.98486328125 4.506183624267578 8.0
+742.9230691523771 5899.95458984375 4.506549835205078 8.0
+742.9435022705293 5899.373046875 4.505911827087402 8.0
+742.9639354889223 5891.71484375 4.505621433258057 8.0
+742.9843688077817 5901.921875 4.507139682769775 8.0
+743.0048020270988 5897.1533203125 4.507183074951172 8.0
+743.0252351466552 5900.48583984375 4.506479263305664 8.0
+743.0456684666788 5902.36376953125 4.507293701171875 8.0
+743.0661016869271 5911.07861328125 4.508116245269775 8.0
+743.0865348076477 5902.615234375 4.507778167724609 8.0
+743.1069681288354 5914.7138671875 4.509239196777344 8.0
+743.1478346719014 5902.86328125 4.506684303283691 8.0
+743.1682677942517 5914.75634765625 4.510426998138428 8.0
+743.1887010168284 5906.54052734375 4.5094075202941895 8.0
+743.209134339646 5914.765625 4.51025390625 8.0
+743.2500006866685 5917.18017578125 4.5088348388671875 8.0
+743.3317336849141 5913.32568359375 4.50931453704834 8.0
+743.4338998162129 5922.10302734375 4.510532379150391 8.0
+743.4543330434535 5917.29541015625 4.509721279144287 8.0
+743.4951994993244 5921.6884765625 4.511023998260498 8.0
+743.5156327277291 5913.07666015625 4.509587287902832 8.0
+743.5360659565922 5925.10009765625 4.510271072387695 8.0
+743.5564991859283 5921.791015625 4.511303424835205 8.0
+743.5769324154971 5920.97998046875 4.5101470947265625 8.0
+743.5973656452989 5920.01611328125 4.510551929473877 8.0
+743.638232106292 5916.3154296875 4.5089640617370605 8.0
+743.6586653374834 5923.85205078125 4.50994348526001 8.0
+743.6790985689149 5912.00244140625 4.509130477905273 8.0
+743.69953190058 5918.61572265625 4.5099196434021 8.0
+743.7199651329356 5921.74658203125 4.510127544403076 8.0
+743.8221312991664 5925.35595703125 4.5109453201293945 8.0
+743.8425645336174 5925.39501953125 4.5099196434021 8.0
+743.8629976683078 5920.63134765625 4.511137962341309 8.0
+743.8834310034654 5928.81787109375 4.511499881744385 8.0
+743.9038642390806 5919.26611328125 4.510862350463867 8.0
+743.9242975749366 5924.556640625 4.511067867279053 8.0
+743.9447307112569 5934.9697265625 4.5124897956848145 8.0
+743.9651639478034 5927.88427734375 4.512086868286133 8.0
+744.0060304220751 5932.34814453125 4.511514663696289 8.0
+744.0264636597858 5925.810546875 4.512226581573486 8.0
+744.0468968979694 5930.7197265625 4.51243782043457 8.0
+744.0673301363859 5936.82763671875 4.512729644775391 8.0
+744.0877633752607 5933.154296875 4.5128173828125 8.0
+744.1081967146092 5939.919921875 4.513115406036377 8.0
+744.1286298541891 5926.736328125 4.512327194213867 8.0
+744.149063193996 5936.61328125 4.512506008148193 8.0
+744.1694964342751 5936.20849609375 4.512816905975342 8.0
+744.189929575019 5936.1943359375 4.511905193328857 8.0
+744.2307961576662 5925.21923828125 4.512121677398682 8.0
+744.2512292993415 5949.04931640625 4.5144147872924805 8.0
+744.2920958840841 5934.1484375 4.512521743774414 8.0
+744.3125292271579 5939.79833984375 4.513381004333496 8.0
+744.3533956139945 5937.33154296875 4.513155937194824 8.0
+744.3738289579924 5937.64501953125 4.513333320617676 8.0
+744.3942621024617 5941.76806640625 4.513090133666992 8.0
+744.4146953473974 5934.10546875 4.5133795738220215 8.0
+744.4351286925666 5941.3359375 4.514318943023682 8.0
+744.475995083827 5933.5556640625 4.51344633102417 8.0
+744.4964284301532 5938.7392578125 4.513688087463379 8.0
+744.5168615767179 5935.4521484375 4.513858795166016 8.0
+744.5372949237499 5937.005859375 4.514135360717773 8.0
+744.5577281712467 5945.7109375 4.515085220336914 8.0
+744.5781613189683 5948.716796875 4.514779090881348 8.0
+744.7211941637725 5947.00341796875 4.515803337097168 8.0
+744.7416274145216 5939.53173828125 4.514858245849609 8.0
+744.7824939171987 5948.90771484375 4.515561103820801 8.0
+744.8029271688865 5946.27001953125 4.5164690017700195 8.0
+744.8233604212655 5952.53466796875 4.516363143920898 8.0
+744.8437936738846 5940.79931640625 4.5146918296813965 8.0
+744.8846602802805 5946.66455078125 4.515130996704102 8.0
+744.9255267880726 5945.259765625 4.515812873840332 8.0
+744.9459600425544 5951.41162109375 4.515621185302734 8.0
+744.9663931972682 5946.4970703125 4.514830589294434 8.0
+744.9868265524419 5939.33935546875 4.514777660369873 8.0
+745.0072598080878 5949.45947265625 4.516541957855225 8.0
+745.0481263205365 5949.82373046875 4.515732765197754 8.0
+745.0685595771138 5953.53564453125 4.515921115875244 8.0
+745.0889927341559 5942.03759765625 4.515381336212158 8.0
+745.109426091658 5957.47509765625 4.51632833480835 8.0
+745.1298593496322 5943.283203125 4.515934467315674 8.0
+745.1707258662718 5958.548828125 4.5178446769714355 8.0
+745.1911591251774 5947.06640625 4.515909671783447 8.0
+745.2115924845493 5952.93896484375 4.517176151275635 8.0
+745.2320256443782 5952.5380859375 4.517014026641846 8.0
+745.2524589044478 5958.56884765625 4.517453193664551 8.0
+745.2933254257441 5952.818359375 4.517056941986084 8.0
+745.3137587867459 5958.29541015625 4.516922950744629 8.0
+745.3341920484454 5947.5849609375 4.516617774963379 8.0
+745.3546253103705 5949.12255859375 4.516485691070557 8.0
+745.3750585727685 5963.97900390625 4.518158435821533 8.0
+745.4159249984878 5948.97119140625 4.517833709716797 8.0
+745.4363583618178 5954.4755859375 4.517360210418701 8.0
+745.4567916256128 5948.3642578125 4.516408920288086 8.0
+745.4772247898654 5958.82373046875 4.517847061157227 8.0
+745.4976581543597 5949.544921875 4.516976356506348 8.0
+745.558957950394 5964.4033203125 4.518091678619385 8.0
+745.6202577496879 5957.1748046875 4.518322467803955 8.0
+745.6406910167425 5960.45361328125 4.518293380737305 8.0
+745.6611243842563 5964.0771484375 4.519130706787109 8.0
+745.6815575522414 5958.388671875 4.518410682678223 8.0
+745.7019908206858 5961.85205078125 4.51780891418457 8.0
+745.7224241893709 5959.2841796875 4.518228054046631 8.0
+745.7428573582874 5954.5322265625 4.516942977905273 8.0
+745.8041571678259 5964.2236328125 4.519122123718262 8.0
+745.8245905383665 5939.31201171875 4.516733169555664 8.0
+745.8858903520959 5959.02978515625 4.517801761627197 8.0
+745.9063236242728 5958.0390625 4.518438339233398 8.0
+745.9676234426588 5959.22314453125 4.518953800201416 8.0
+745.9880567162327 5958.2880859375 4.518344879150391 8.0
+746.0084899900321 5962.0986328125 4.519657611846924 8.0
+746.0902230896754 5956.453125 4.519563674926758 8.0
+746.1106564653455 5959.6787109375 4.519443511962891 8.0
+746.1310896414725 5960.59130859375 4.520016670227051 8.0
+746.1515230180739 5961.72216796875 4.5187482833862305 8.0
+746.1719562951403 5965.552734375 4.519366264343262 8.0
+746.1923894724314 5955.23388671875 4.519168853759766 8.0
+746.2128228499641 5963.265625 4.519322872161865 8.0
+746.2332561279618 5977.2548828125 4.520878791809082 8.0
+746.3149893441296 5960.29052734375 4.520609378814697 8.0
+746.3354225239891 5955.37939453125 4.519025802612305 8.0
+746.3558558043151 5960.41064453125 4.52005672454834 8.0
+746.3762891848673 5968.20751953125 4.519736289978027 8.0
+746.3967223661239 5955.76171875 4.5191826820373535 8.0
+746.4171556473812 5964.568359375 4.519288539886475 8.0
+746.4375890293304 5964.1015625 4.520193099975586 8.0
+746.4580222115183 5958.181640625 4.519253253936768 8.0
+746.5397554439842 5956.12841796875 4.519969940185547 8.0
+746.6010552973021 5959.5908203125 4.519382953643799 8.0
+746.6214885825102 5965.39404296875 4.51936149597168 8.0
+746.6419217681905 5958.24951171875 4.520270824432373 8.0
+746.6623551540979 5962.46044921875 4.519228458404541 8.0
+746.6827884402446 5969.578125 4.5215744972229 8.0
+746.7032216270891 5969.88525390625 4.521459579467773 8.0
+746.7236550141679 5964.912109375 4.521022796630859 8.0
+746.7440883014715 5961.388671875 4.520778656005859 8.0
+746.7645216894816 5965.39208984375 4.52036714553833 8.0
+746.7849548777158 5970.849609375 4.521888256072998 8.0
+746.8053881661908 5972.46875 4.521667957305908 8.0
+746.8258215551323 5955.89990234375 4.520339012145996 8.0
+746.8462547445379 5968.17822265625 4.520328998565674 8.0
+746.8666880341698 5958.99169921875 4.519819259643555 8.0
+746.8871214242754 5959.7861328125 4.520853042602539 8.0
+746.9075546148379 5953.76953125 4.519845008850098 8.0
+746.927988005642 5962.265625 4.519210338592529 8.0
+747.0097211728062 5966.30517578125 4.521909236907959 8.0
+747.0301544654649 5962.8154296875 4.521052837371826 8.0
+747.0505877585965 5961.28662109375 4.520322799682617 8.0
+747.0914543460167 5960.78125 4.520598888397217 8.0
+747.1323209348411 5961.78515625 4.520961761474609 8.0
+747.1527543298289 5973.31787109375 4.520731449127197 8.0
+747.173187625056 5962.2421875 4.521653175354004 8.0
+747.1936208209809 5963.908203125 4.521793365478516 8.0
+747.2140542171328 5953.74169921875 4.519941329956055 8.0
+747.2344875135241 5965.67724609375 4.5214385986328125 8.0
+747.2549207103802 5970.2822265625 4.521850109100342 8.0
+747.2753541076963 5965.33349609375 4.521274566650391 8.0
+747.295787305251 5962.2119140625 4.520028591156006 8.0
+747.3162207032728 5962.076171875 4.521465301513672 8.0
+747.3366540017523 5955.8515625 4.520778179168701 8.0
+747.3570872004711 5957.083984375 4.520978927612305 8.0
+747.3775205996571 5954.89111328125 4.521349906921387 8.0
+747.3979538990679 5965.38427734375 4.521524429321289 8.0
+747.4388204993011 5955.89892578125 4.520792484283447 8.0
+747.459253799876 5962.61474609375 4.521395683288574 8.0
+747.4796870009231 5960.00048828125 4.521315574645996 8.0
+747.5001204024375 5967.19775390625 4.520908832550049 8.0
+747.5205537041766 5961.92626953125 4.521023750305176 8.0
+747.5409871063894 5952.25537109375 4.519914150238037 8.0
+747.5614203088335 5963.52587890625 4.521827697753906 8.0
+747.5818536117367 5956.11376953125 4.520934581756592 8.0
+747.6022870151137 5950.115234375 4.5204081535339355 8.0
+747.622720218722 5961.18212890625 4.521932125091553 8.0
+747.6431535227894 5952.6083984375 4.519628524780273 8.0
+747.6635869273305 5952.9091796875 4.519012451171875 8.0
+747.6840201321029 5957.2802734375 4.518768310546875 8.0
+747.7453201487369 5956.5634765625 4.520987033843994 8.0
+747.7657534551399 5953.64013671875 4.52029275894165 8.0
+747.7861867617758 5950.9345703125 4.520450115203857 8.0
+747.8474866842371 5956.44580078125 4.520415306091309 8.0
+747.8679199924954 5957.46240234375 4.520808219909668 8.0
+747.8883534009947 5947.72900390625 4.520236492156982 8.0
+747.908786609958 5957.4072265625 4.521176338195801 8.0
+747.9292200193813 5955.51513671875 4.521301746368408 8.0
+747.9496532290432 5951.1630859375 4.5217742919921875 8.0
+747.9905199497589 5955.0224609375 4.521642684936523 8.0
+748.0518198833961 5963.9267578125 4.523434638977051 8.0
+748.0722530953863 5945.77685546875 4.520475387573242 8.0
+748.1131198205258 5946.41015625 4.521123886108398 8.0
+748.1335530336801 5955.2353515625 4.521311283111572 8.0
+748.1539864473016 5947.28955078125 4.521354675292969 8.0
+748.1948529754663 5948.3759765625 4.520320892333984 8.0
+748.2152863900192 5952.26123046875 4.520998001098633 8.0
+748.2357197050296 5946.97705078125 4.520483016967773 8.0
+748.256153020513 5950.5849609375 4.5219035148620605 8.0
+748.2765863362292 5950.48974609375 4.5214715003967285 8.0
+748.2970196524038 5947.93505859375 4.52177619934082 8.0
+748.3174530690521 5942.8408203125 4.521548748016357 8.0
+748.3378862859317 5938.67919921875 4.5205559730529785 8.0
+748.3583196032705 5950.57373046875 4.521713733673096 8.0
+748.3787530208501 5944.7509765625 4.521448135375977 8.0
+748.3991863388947 5942.66650390625 4.52065372467041 8.0
+748.4196195573968 5935.34814453125 4.5204620361328125 8.0
+748.4400529761406 5944.9892578125 4.521271228790283 8.0
+748.460486295342 5935.314453125 4.521372318267822 8.0
+748.4809195150156 5940.40185546875 4.519526958465576 8.0
+748.5013529349235 5939.736328125 4.520248889923096 8.0
+748.5217862552963 5946.65478515625 4.52181339263916 8.0
+748.5422195761275 5934.84716796875 4.519710063934326 8.0
+748.5626528971989 5945.71923828125 4.52047061920166 8.0
+748.5830861187351 5934.380859375 4.520324230194092 8.0
+748.6035195404984 5937.27978515625 4.520592212677002 8.0
+748.6239528627339 5928.49609375 4.518580913543701 8.0
+748.6443860854342 5944.57177734375 4.521862983703613 8.0
+748.6648195083617 5932.06201171875 4.519639015197754 8.0
+748.6852528317613 5941.5869140625 4.520801067352295 8.0
+748.705686055393 5936.703125 4.519798278808594 8.0
+748.7261194797175 5930.609375 4.518966197967529 8.0
+748.7465528040484 5931.43212890625 4.519058704376221 8.0
+748.7874194543328 5934.0234375 4.519903659820557 8.0
+748.8078527800608 5934.64501953125 4.520479679107666 8.0
+748.828286206015 5933.1904296875 4.519194602966309 8.0
+748.8691527593328 5916.9638671875 4.517226696014404 8.0
+748.8895861864512 5919.7412109375 4.517814636230469 8.0
+748.9100195140418 5920.22900390625 4.517426013946533 8.0
+748.950886170147 5927.44775390625 4.519308090209961 8.0
+748.9917528278893 5929.54248046875 4.520052909851074 8.0
+749.0121861575681 5924.97509765625 4.517914772033691 8.0
+749.0326194872541 5933.07421875 4.519383430480957 8.0
+749.0530529174066 5928.3857421875 4.51952600479126 8.0
+749.073486148016 5931.236328125 4.518718719482422 8.0
+749.093919479099 5917.63818359375 4.518253803253174 8.0
+749.1143528104149 5919.06982421875 4.519007205963135 8.0
+749.1347861421891 5920.390625 4.518404006958008 8.0
+749.1756529069171 5921.83203125 4.519933700561523 8.0
+749.1960861396219 5931.25 4.520491600036621 8.0
+749.216519573034 5919.126953125 4.519481658935547 8.0
+749.2573861405472 5926.79736328125 4.520205020904541 8.0
+749.2778195751234 5921.310546875 4.519139766693115 8.0
+749.298252809931 5922.810546875 4.519082069396973 8.0
+749.3186862449656 5921.2509765625 4.518444061279297 8.0
+749.3391195804725 5916.283203125 4.518360137939453 8.0
+749.3595528164442 5920.34326171875 4.518923759460449 8.0
+749.3799862528758 5919.7158203125 4.517943382263184 8.0
+749.4004195895468 5914.91064453125 4.518441200256348 8.0
+749.4208529264506 5912.84228515625 4.519076347351074 8.0
+749.4412862640456 5914.1318359375 4.518173694610596 8.0
+749.4617196018808 5918.6494140625 4.519437789916992 8.0
+749.4821529399487 5917.3076171875 4.518935203552246 8.0
+749.5025862787079 5916.5234375 4.519188404083252 8.0
+749.5230196177072 5922.6064453125 4.520496845245361 8.0
+749.5434530569328 5916.365234375 4.518106937408447 8.0
+749.6047530771903 5899.98095703125 4.516500949859619 8.0
+749.6251864182777 5910.52001953125 4.518278121948242 8.0
+749.6660531011585 5916.9814453125 4.519400596618652 8.0
+749.7069196854427 5914.98583984375 4.5203447341918945 8.0
+749.7273531284009 5910.9697265625 4.518367767333984 8.0
+749.747786471351 5915.486328125 4.519220352172852 8.0
+749.7682198150069 5904.72802734375 4.517551898956299 8.0
+749.7886531588883 5908.33154296875 4.517820835113525 8.0
+749.8090865032427 5904.4599609375 4.517529010772705 8.0
+749.8499531931157 5903.83349609375 4.517623424530029 8.0
+749.911253230588 5906.2646484375 4.518612861633301 8.0
+749.9316866770387 5905.81591796875 4.518002510070801 8.0
+749.9521199241863 5907.49462890625 4.518671035766602 8.0
+749.9725532715674 5914.47119140625 4.519235610961914 8.0
+749.992986719175 5903.67529296875 4.51802396774292 8.0
+750.0134199672539 5895.85205078125 4.518250942230225 8.0
+750.0338533157919 5901.7412109375 4.518632888793945 8.0
+750.0542867648037 5902.86083984375 4.518084526062012 8.0
+750.0747201140475 5894.318359375 4.5180745124816895 8.0
+750.0951533637563 5902.482421875 4.517765045166016 8.0
+750.1360201641 5901.7509765625 4.51774787902832 8.0
+750.1564535149664 5895.55126953125 4.51786994934082 8.0
+750.1768868660729 5896.7333984375 4.517714977264404 8.0
+750.2586202746825 5900.79931640625 4.5173468589782715 8.0
+750.2790537276451 5903.3330078125 4.518187999725342 8.0
+750.3199204349803 5897.2275390625 4.5179009437561035 8.0
+750.3403537893391 5896.615234375 4.5182204246521 8.0
+750.3607870439373 5886.58984375 4.516433238983154 8.0
+750.4016538542928 5883.65185546875 4.516519069671631 8.0
+750.4220871100551 5899.541015625 4.518476963043213 8.0
+750.4425205660518 5898.3681640625 4.518229961395264 8.0
+750.4629538227382 5890.07080078125 4.518559455871582 8.0
+750.4833871796654 5897.5791015625 4.518147945404053 8.0
+750.5038206368263 5894.27978515625 4.517673015594482 8.0
+750.524253894444 5899.1552734375 4.5173492431640625 8.0
+750.5446873525361 5892.10302734375 4.517197132110596 8.0
+750.5651207110932 5886.20068359375 4.517121315002441 8.0
+750.585553969875 5898.93017578125 4.518378734588623 8.0
+750.6059874291313 5886.95068359375 4.516646862030029 8.0
+750.6264207886197 5887.39404296875 4.51809024810791 8.0
+750.6468541485665 5885.4345703125 4.516878604888916 8.0
+750.6877208696387 5885.89404296875 4.517596244812012 8.0
+750.7081542307496 5891.5234375 4.517154216766357 8.0
+750.7490209541429 5888.62255859375 4.517475128173828 8.0
+750.769454416426 5890.529296875 4.51713228225708 8.0
+750.789887779174 5888.9453125 4.517149925231934 8.0
+750.8103210421541 5887.0078125 4.517782688140869 8.0
+750.8307545055941 5889.86865234375 4.5176568031311035 8.0
+750.8511878695062 5885.79541015625 4.517382621765137 8.0
+750.8716211336432 5890.69482421875 4.517580509185791 8.0
+750.9124879630981 5903.12939453125 4.519862174987793 8.0
+750.9329214284007 5883.796875 4.517850399017334 8.0
+750.9737880601824 5885.5078125 4.5181450843811035 8.0
+751.0146547935874 5874.23388671875 4.516632556915283 8.0
+751.0350881607592 5882.46044921875 4.517409801483154 8.0
+751.0963881648277 5880.5087890625 4.516961574554443 8.0
+751.1168216336227 5883.96484375 4.517186641693115 8.0
+751.1372550026572 5883.23291015625 4.516913890838623 8.0
+751.1576884723909 5879.11376953125 4.517336368560791 8.0
+751.1781217421158 5883.091796875 4.517748832702637 8.0
+751.1985551125472 5882.40966796875 4.517905235290527 8.0
+751.2189885832122 5881.48828125 4.517449855804443 8.0
+751.2394218543341 5877.466796875 4.516854286193848 8.0
+751.280288697526 5873.7392578125 4.51615047454834 8.0
+751.3415888153322 5871.08984375 4.516963005065918 8.0
+751.3620221887832 5877.7978515625 4.516792297363281 8.0
+751.3824555624742 5881.0341796875 4.517922401428223 8.0
+751.4028889366309 5875.630859375 4.515775680541992 8.0
+751.5254891894729 5871.86328125 4.518065452575684 8.0
+751.545922666417 5874.4140625 4.517150402069092 8.0
+751.5663560436005 5877.88330078125 4.517984390258789 8.0
+751.586789321249 5870.85107421875 4.517306327819824 8.0
+751.6072227991244 5880.3984375 4.516977787017822 8.0
+751.6276561774721 5880.45458984375 4.517375946044922 8.0
+751.6889563148361 5864.310546875 4.516770362854004 8.0
+751.7298230750166 5878.15673828125 4.517969131469727 8.0
+751.7706898368342 5874.98046875 4.516982078552246 8.0
+751.8728567476501 5867.04833984375 4.5178914070129395 8.0
+751.89329013112 5874.82958984375 4.518773078918457 8.0
+751.9137235148155 5867.509765625 4.517644882202148 8.0
+751.9341569989847 5871.0283203125 4.51745080947876 8.0
+751.9545903833787 5865.10107421875 4.5170512199401855 8.0
+751.9750236682448 5867.18603515625 4.517322540283203 8.0
+751.9954571535782 5871.12255859375 4.516949653625488 8.0
+752.0158905391363 5870.203125 4.518006801605225 8.0
+752.0363238253994 5864.92138671875 4.517194747924805 8.0
+752.0567573116641 5864.2705078125 4.517485618591309 8.0
+752.0771906986192 5866.85400390625 4.517873287200928 8.0
+752.0976239858137 5870.06494140625 4.51863431930542 8.0
+752.1180574732425 5867.25439453125 4.518497467041016 8.0
+752.138490861129 5870.34619140625 4.518293380737305 8.0
+752.1589243494891 5861.61669921875 4.518120765686035 8.0
+752.199791027364 5863.63134765625 4.517651557922363 8.0
+752.3632581542479 5859.97216796875 4.517812728881836 8.0
+752.4245583330558 5863.0185546875 4.518223762512207 8.0
+752.4449918267637 5857.48681640625 4.517498016357422 8.0
+752.4654252209439 5872.65869140625 4.518273830413818 8.0
+752.5062920102282 5857.0810546875 4.517858028411865 8.0
+752.5267254055725 5853.51123046875 4.517457008361816 8.0
+752.5471588011496 5865.44775390625 4.518364906311035 8.0
+752.5675921971851 5860.65283203125 4.517837047576904 8.0
+752.6901925813436 5862.31640625 4.518343925476074 8.0
+752.7106260801811 5853.31103515625 4.517658233642578 8.0
+752.7310594792507 5861.96630859375 4.519614219665527 8.0
+752.7514927787779 5859.67822265625 4.51850700378418 8.0
+752.7719262785467 5861.56103515625 4.519339084625244 8.0
+752.7923596787732 5857.55419921875 4.518278121948242 8.0
+752.8127929794719 5860.40771484375 4.51983642578125 8.0
+752.8536598820356 5862.27685546875 4.5193681716918945 8.0
+752.8740931838911 5866.5869140625 4.520187854766846 8.0
+752.8945266859882 5860.41259765625 4.518881797790527 8.0
+752.914960088543 5854.42529296875 4.5178914070129395 8.0
+752.9353934915707 5856.37646484375 4.518668174743652 8.0
+752.9558268948313 5859.78515625 4.519293785095215 8.0
+753.0171271071667 5855.76513671875 4.518594264984131 8.0
+753.0375605120498 5856.03466796875 4.519057273864746 8.0
+753.2214612735042 5854.98681640625 4.51829195022583 8.0
+753.2418946821199 5850.0439453125 4.517683506011963 8.0
+753.3031949107535 5859.31103515625 4.519627571105957 8.0
+753.3236284209997 5857.20703125 4.5186052322387695 8.0
+753.3440617317028 5858.732421875 4.518743515014648 8.0
+753.3644951426468 5854.6201171875 4.518128395080566 8.0
+753.446228890607 5856.77734375 4.5187668800354 8.0
+753.4666622036384 5852.173828125 4.518424034118652 8.0
+753.4870956171435 5852.82470703125 4.518004417419434 8.0
+753.5892626895438 5858.833984375 4.519612789154053 8.0
+753.6301296214369 5849.6279296875 4.518579959869385 8.0
+753.6505629377352 5852.51416015625 4.518843650817871 8.0
+753.6709964547335 5857.4970703125 4.519145488739014 8.0
+753.7118632894199 5852.89990234375 4.518410682678223 8.0
+753.7322967075816 5855.681640625 4.519267559051514 8.0
+753.7731635445962 5846.06005859375 4.518816947937012 8.0
+753.7935969636892 5850.1201171875 4.518787384033203 8.0
+753.8140303832479 5857.263671875 4.519851207733154 8.0
+753.8344639032657 5861.9736328125 4.5197930335998535 8.0
+753.8548972235221 5857.771484375 4.5191650390625 8.0
+753.8753306442377 5854.1923828125 4.518441200256348 8.0
+753.895764165427 5854.2744140625 4.518959045410156 8.0
+753.9161974868475 5864.23828125 4.519918918609619 8.0
+753.936631008728 5856.7099609375 4.518399238586426 8.0
+753.9570644308478 5862.40380859375 4.519618034362793 8.0
+753.9774977534325 5859.173828125 4.519530296325684 8.0
+753.9979312764772 5858.51513671875 4.51983642578125 8.0
+754.018364699994 5854.48828125 4.5186238288879395 8.0
+754.0387980237429 5849.423828125 4.518158912658691 8.0
+754.0592315479516 5853.79931640625 4.518701076507568 8.0
+754.0796649723998 5859.138671875 4.519341945648193 8.0
+754.1205318226857 5863.70361328125 4.520352840423584 8.0
+754.140965248298 5859.619140625 4.51936149597168 8.0
+754.1613987743767 5861.2431640625 4.518564701080322 8.0
+754.2022655279216 5863.09033203125 4.519307613372803 8.0
+754.2226989551637 5854.173828125 4.517741680145264 8.0
+754.2431323826313 5849.9189453125 4.518475532531738 8.0
+754.2635658108047 5868.06689453125 4.520575523376465 8.0
+754.283999239211 5859.48974609375 4.519208908081055 8.0
+754.3044326680756 5861.60205078125 4.51936674118042 8.0
+754.3248661971811 5859.57666015625 4.5191874504089355 8.0
+754.3452996267515 5854.09912109375 4.518531322479248 8.0
+754.3657329567795 5853.259765625 4.518813610076904 8.0
+754.4065999177838 5857.51220703125 4.519145965576172 8.0
+754.4270332489759 5859.0390625 4.519085884094238 8.0
+754.4474667804097 5861.76708984375 4.5191216468811035 8.0
+754.4679002123085 5860.85400390625 4.519246578216553 8.0
+754.5087670772627 5857.9189453125 4.519073009490967 8.0
+754.5292005103256 5858.22802734375 4.5196099281311035 8.0
+754.5700673776082 5870.794921875 4.520522117614746 8.0
+754.6109343462886 5856.625 4.5187296867370605 8.0
+754.6313676814461 5857.232421875 4.518795967102051 8.0
+754.6518011166045 5859.72802734375 4.518791675567627 8.0
+754.6722346524548 5859.9951171875 4.519289493560791 8.0
+754.6926679885437 5862.02783203125 4.519452095031738 8.0
+754.7131015250925 5860.13232421875 4.519781112670898 8.0
+754.7335349621135 5862.5751953125 4.51877498626709 8.0
+754.7539682993665 5863.30517578125 4.520321369171143 8.0
+754.7948352750318 5865.0810546875 4.519557952880859 8.0
+754.8357021523261 5871.166015625 4.520837783813477 8.0
+754.8561355916754 5859.04296875 4.518833637237549 8.0
+754.8765690312575 5869.97998046875 4.520756244659424 8.0
+754.9378693525578 5864.09912109375 4.52021598815918 8.0
+754.9787362352072 5863.333984375 4.519808769226074 8.0
+754.9991696771176 5869.19384765625 4.519336223602295 8.0
+755.0196031194937 5869.91552734375 4.520505905151367 8.0
+755.0400365620953 5867.64892578125 4.5195746421813965 8.0
+755.0604701051707 5863.24169921875 4.5191216468811035 8.0
+755.0809034487029 5873.35791015625 4.520788192749023 8.0
+755.1013369927095 5871.7294921875 4.520442962646484 8.0
+755.1217704369483 5879.6142578125 4.522078990936279 8.0
+755.1422037816519 5872.24755859375 4.520611763000488 8.0
+755.1626373265826 5864.97314453125 4.519654273986816 8.0
+755.2239376639482 5868.04248046875 4.519207954406738 8.0
+755.2443711105152 5877.29443359375 4.519743919372559 8.0
+755.2648044575471 5867.5556640625 4.52018928527832 8.0
+755.285238005039 5876.06396484375 4.5217671394348145 8.0
+755.3056714527702 5867.08740234375 4.519968509674072 8.0
+755.3261050007277 5869.59619140625 4.521183490753174 8.0
+755.3465383493894 5871.18994140625 4.520306587219238 8.0
+755.3669717982848 5879.63037109375 4.521308898925781 8.0
+755.4078386972324 5874.74365234375 4.522036552429199 8.0
+755.4282721472919 5869.81201171875 4.521839618682861 8.0
+755.5100060514742 5880.78564453125 4.521199703216553 8.0
+755.5713064086303 5875.9970703125 4.521939277648926 8.0
+755.5917397617159 5878.6796875 4.521780490875244 8.0
+755.6121733152686 5874.3544921875 4.522241592407227 8.0
+755.6326067692789 5879.5029296875 4.5219221115112305 8.0
+755.69390713342 5882.05322265625 4.5228095054626465 8.0
+755.7143406888354 5879.6123046875 4.521636486053467 8.0
+755.7347740447149 5875.939453125 4.5219645500183105 8.0
+755.7552075010535 5880.77587890625 4.523029804229736 8.0
+755.775641057633 5875.7783203125 4.522398471832275 8.0
+755.7960744146767 5876.62939453125 4.522080421447754 8.0
+755.8165078721795 5881.72802734375 4.521953105926514 8.0
+755.8369414299232 5880.0849609375 4.522442817687988 8.0
+755.857374788131 5879.666015625 4.522754669189453 8.0
+755.8778083467987 5888.15673828125 4.523285388946533 8.0
+755.8982418057058 5890.83935546875 4.523880958557129 8.0
+755.9186751650705 5884.45703125 4.5235395431518555 8.0
+755.9799756455104 5879.00927734375 4.522387504577637 8.0
+756.0208425677483 5890.27197265625 4.523828983306885 8.0
+756.1230098799642 5896.330078125 4.5243821144104 8.0
+756.16387680755 5891.60107421875 4.523591041564941 8.0
+756.184310272045 5894.423828125 4.523239612579346 8.0
+756.2047437367728 5900.7099609375 4.524693965911865 8.0
+756.2251773019598 5888.828125 4.523301124572754 8.0
+756.2456106676182 5903.0849609375 4.52426815032959 8.0
+756.2660441335101 5884.6796875 4.521420478820801 8.0
+756.2864776998613 5890.67333984375 4.523112773895264 8.0
+756.306911066451 5895.02490234375 4.5225934982299805 8.0
+756.3273446337407 5901.384765625 4.524099826812744 8.0
+756.3477781012552 5901.54052734375 4.5245866775512695 8.0
+756.3682114690091 5891.7412109375 4.5223612785339355 8.0
+756.3886450372302 5899.701171875 4.523929119110107 8.0
+756.4090785059088 5894.861328125 4.523462772369385 8.0
+756.4295118750597 5894.73046875 4.523203372955322 8.0
+756.4499454444449 5899.45556640625 4.524388313293457 8.0
+756.4703789142877 5901.78662109375 4.523794174194336 8.0
+756.4908124843714 5900.619140625 4.524727821350098 8.0
+756.5112458551521 5891.50634765625 4.522884845733643 8.0
+756.5316793261591 5900.9931640625 4.524036884307861 8.0
+756.5521128974069 5904.53955078125 4.524940013885498 8.0
+756.5725462691189 5904.99560546875 4.524064540863037 8.0
+756.59297974129 5904.0498046875 4.523890018463135 8.0
+756.6134133139349 5904.7705078125 4.524148941040039 8.0
+756.633846686811 5892.57373046875 4.523985385894775 8.0
+756.6542801601463 5912.48388671875 4.526671409606934 8.0
+756.6747137337225 5907.130859375 4.525329113006592 8.0
+756.6951472079963 5907.8876953125 4.52553129196167 8.0
+756.7155806824958 5903.533203125 4.524555206298828 8.0
+756.7360141572353 5908.4892578125 4.525832653045654 8.0
+756.7564476324333 5908.64013671875 4.524920463562012 8.0
+756.7768811081041 5906.46484375 4.524697780609131 8.0
+756.7973145842407 5908.126953125 4.526421546936035 8.0
+756.8177479606093 5905.7607421875 4.523547649383545 8.0
+756.8381815374378 5913.4404296875 4.525979042053223 8.0
+756.8586150145056 5910.63818359375 4.526292324066162 8.0
+756.8790484922647 5910.82470703125 4.526777744293213 8.0
+756.899481970031 5912.509765625 4.527383327484131 8.0
+756.9199154484959 5918.67919921875 4.5275797843933105 8.0
+757.0220828461606 5915.935546875 4.527101039886475 8.0
+757.0425163267209 5917.4873046875 4.525887489318848 8.0
+757.0629499077404 5916.41455078125 4.526442050933838 8.0
+757.1038168711893 5911.38330078125 4.526722431182861 8.0
+757.1651173189166 5918.47119140625 4.526859760284424 8.0
+757.2672847398644 5915.98486328125 4.526573657989502 8.0
+757.3285852969057 5935.63134765625 4.5292067527771 8.0
+757.3490187835196 5933.92431640625 4.530228137969971 8.0
+757.3694521703583 5925.1533203125 4.530170917510986 8.0
+757.3898857576714 5927.87890625 4.528676509857178 8.0
+757.4103192454495 5931.38525390625 4.529081344604492 8.0
+757.4307526334524 5930.65869140625 4.529511451721191 8.0
+757.4511862219297 5929.2099609375 4.529201507568359 8.0
+757.4716196106383 5928.27294921875 4.529955863952637 8.0
+757.4920531998068 5922.1806640625 4.529094696044922 8.0
+757.5124866894475 5928.98681640625 4.5296101570129395 8.0
+757.5329200795532 5928.12060546875 4.529328346252441 8.0
+757.5533536698858 5932.22900390625 4.530350208282471 8.0
+757.5737871606907 5926.40185546875 4.529635429382324 8.0
+757.5942205517276 5934.7314453125 4.527865409851074 8.0
+757.6555210276274 5933.7236328125 4.529994010925293 8.0
+757.6759546202884 5933.56884765625 4.530176639556885 8.0
+757.6963881134216 5938.74560546875 4.531439304351807 8.0
+757.7372551008448 5952.19482421875 4.532110214233398 8.0
+757.7576885949093 5941.6845703125 4.53090238571167 8.0
+757.8394226760429 5940.12939453125 4.530722141265869 8.0
+757.8598561722029 5938.06591796875 4.530889511108398 8.0
+757.9007231656869 5938.7080078125 4.530608654022217 8.0
+757.9415901607936 5937.34423828125 4.531613349914551 8.0
+757.9620236590417 5942.251953125 4.5321807861328125 8.0
+757.98245715753 5942.7060546875 4.532984256744385 8.0
+758.0028907564847 5942.068359375 4.531132221221924 8.0
+758.0233241556707 5951.52880859375 4.53239107131958 8.0
+758.064191155434 5945.49169921875 4.5323805809021 8.0
+758.0846246560104 5946.4521484375 4.532310962677002 8.0
+758.1050582568278 5941.603515625 4.531938552856445 8.0
+758.186792164277 5943.42724609375 4.532888889312744 8.0
+758.2276592700946 5941.52197265625 4.532336711883545 8.0
+758.2685262777741 5958.1123046875 4.534050464630127 8.0
+758.2889597820831 5957.18603515625 4.533540725708008 8.0
+758.309393186857 5950.97265625 4.53297233581543 8.0
+758.3298267920909 5949.9111328125 4.533463478088379 8.0
+758.370693803503 5949.0009765625 4.5331854820251465 8.0
+758.3911273096674 5951.65478515625 4.534478664398193 8.0
+758.4524278309691 5954.92626953125 4.53375768661499 8.0
+758.4728613387706 5958.10595703125 4.534506320953369 8.0
+758.5137283557633 5959.20263671875 4.534815311431885 8.0
+758.534161864729 5955.08154296875 4.5337958335876465 8.0
+758.554595474161 5947.86376953125 4.532816410064697 8.0
+758.5750289838179 5959.9326171875 4.535190105438232 8.0
+758.595462393947 5956.44677734375 4.535017013549805 8.0
+758.6158960045432 5962.3505859375 4.535655498504639 8.0
+758.636329515597 5960.79052734375 4.534970760345459 8.0
+758.6771965386433 5956.4619140625 4.533638954162598 8.0
+758.6976300508686 5965.91064453125 4.535203456878662 8.0
+758.7384970762505 5960.36865234375 4.535627841949463 8.0
+758.7589304893991 5970.74755859375 4.535287380218506 8.0
+758.7997976173356 5960.9150390625 4.535309314727783 8.0
+758.8202310316556 5956.69580078125 4.535221576690674 8.0
+758.8406646464427 5964.5302734375 4.535425662994385 8.0
+758.8610981616948 5959.76025390625 4.535677909851074 8.0
+758.881531777406 5962.2119140625 4.535080432891846 8.0
+758.9019651933559 5968.04833984375 4.536070823669434 8.0
+758.9223987097648 5965.5029296875 4.535459995269775 8.0
+758.9428323266475 5962.3330078125 4.535379886627197 8.0
+758.9632657437614 5970.99609375 4.535540580749512 8.0
+758.9836992613418 5962.162109375 4.53588342666626 8.0
+759.0041328793814 5966.1865234375 4.535654067993164 8.0
+759.0245662976595 5969.43994140625 4.536947727203369 8.0
+759.0449998163967 5970.4189453125 4.536279678344727 8.0
+759.0654334353749 5972.5439453125 4.536830425262451 8.0
+759.0858669550507 5973.1328125 4.535678386688232 8.0
+759.1063004749521 5962.90966796875 4.535789489746094 8.0
+759.1471675157009 5969.0732421875 4.5364298820495605 8.0
+759.1676010367664 5961.01953125 4.535958290100098 8.0
+759.1880345583049 5971.0 4.536376953125 8.0
+759.2084680800763 5972.88330078125 4.536729335784912 8.0
+759.2289017023068 5971.82666015625 4.536253452301025 8.0
+759.2697687479449 5965.81494140625 4.536706447601318 8.0
+759.290202171338 5973.03125 4.537252902984619 8.0
+759.3106356952048 5961.61376953125 4.535331726074219 8.0
+759.3719362688935 5973.0078125 4.537006378173828 8.0
+759.392369894158 5979.6748046875 4.540032386779785 8.0
+759.4128033198795 5973.8818359375 4.537400245666504 8.0
+759.4332368460746 5973.5908203125 4.538455963134766 8.0
+759.4536704725033 5977.74462890625 4.538706302642822 8.0
+759.4945375265161 5976.1103515625 4.537389278411865 8.0
+759.5558381106821 5980.75634765625 4.53995418548584 8.0
+759.5762716396712 5972.41357421875 4.537715911865234 8.0
+759.5967051688858 5979.13671875 4.540768623352051 8.0
+759.6171386983406 5978.06884765625 4.539397716522217 8.0
+759.6375722284938 5974.712890625 4.537838459014893 8.0
+759.6784392894915 5970.67822265625 4.538628101348877 8.0
+759.6988728208089 5976.28662109375 4.540720462799072 8.0
+759.7193064523526 5983.8720703125 4.5414886474609375 8.0
+759.7397399841357 5977.63818359375 4.541486740112305 8.0
+759.7601734166165 5981.76025390625 4.540912628173828 8.0
+759.7806070493243 5980.7568359375 4.5417160987854 8.0
+759.8010405822715 5990.87158203125 4.542171478271484 8.0
+759.8214740159165 5977.86572265625 4.540974140167236 8.0
+759.8419076497885 5970.02587890625 4.5393829345703125 8.0
+759.8623411838998 5975.9150390625 4.540731906890869 8.0
+759.8827748187032 5975.04345703125 4.539704322814941 8.0
+759.9032082537451 5976.5947265625 4.541378021240234 8.0
+759.9440753249946 5989.384765625 4.541861057281494 8.0
+759.9645088611942 5974.76025390625 4.541895389556885 8.0
+759.9849422978659 5976.86865234375 4.542145252227783 8.0
+760.0053759347647 5976.92041015625 4.541206359863281 8.0
+760.0258094721357 5979.28564453125 4.542211532592773 8.0
+760.0666765480419 5974.75927734375 4.54136848449707 8.0
+760.0871100865697 5980.93798828125 4.541335582733154 8.0
+760.1279771647969 5981.06884765625 4.5416083335876465 8.0
+760.1484107044962 5981.80078125 4.5415754318237305 8.0
+760.1688443446619 5979.2099609375 4.539433479309082 8.0
+760.189277785059 5974.18798828125 4.541244983673096 8.0
+760.2097113259151 5989.02490234375 4.542868614196777 8.0
+760.230144967245 5992.87353515625 4.541590690612793 8.0
+760.2505785087997 5985.45849609375 4.541398525238037 8.0
+760.2710120510601 5981.6865234375 4.541052341461182 8.0
+760.2914455933205 5985.888671875 4.542353630065918 8.0
+760.3118791362722 5987.97216796875 4.54204797744751 8.0
+760.3323126794639 5986.26025390625 4.540647506713867 8.0
+760.3527462228885 5984.9482421875 4.541279315948486 8.0
+760.3731797670043 5976.10009765625 4.539939880371094 8.0
+760.393613411361 5986.33056640625 4.540488243103027 8.0
+760.4140468561818 5984.32861328125 4.5402631759643555 8.0
+760.4344805012297 5986.4287109375 4.540262222290039 8.0
+760.4549140467498 5993.1611328125 4.541843891143799 8.0
+760.4753474927347 5975.0009765625 4.540085792541504 8.0
+760.4957811389468 5974.8173828125 4.53996467590332 8.0
+760.516214685631 5988.23046875 4.540811538696289 8.0
+760.5366481327801 5983.02587890625 4.540579319000244 8.0
+760.5570817803891 5988.970703125 4.54086971282959 8.0
+760.5775153282375 5984.5146484375 4.539817810058594 8.0
+760.6183824250911 5990.44091796875 4.541340351104736 8.0
+760.6388158741029 5986.9462890625 4.541680335998535 8.0
+760.6592495235818 5984.89013671875 4.539024829864502 8.0
+760.6796830732856 5987.591796875 4.539961338043213 8.0
+760.7001165234615 5985.98974609375 4.540250778198242 8.0
+760.7409837249725 5998.1689453125 4.542257308959961 8.0
+760.7614171765454 5988.70068359375 4.540841579437256 8.0
+760.7818508281198 5990.24365234375 4.540871620178223 8.0
+760.8022843803847 5978.578125 4.540225028991699 8.0
+760.8227180328904 5986.14208984375 4.5407209396362305 8.0
+760.8431514858603 5985.015625 4.540908336639404 8.0
+760.8635850390565 5986.3798828125 4.541651725769043 8.0
+760.8840186927264 5984.1015625 4.540882110595703 8.0
+760.9044521468604 5991.77490234375 4.541292667388916 8.0
+760.9248857012208 5979.9150390625 4.540402889251709 8.0
+760.9453193562877 5988.8671875 4.540502071380615 8.0
+760.9657529113465 5974.6923828125 4.540407657623291 8.0
+760.9861863671103 5986.47021484375 4.540285110473633 8.0
+761.0066200231086 5986.8046875 4.540682315826416 8.0
+761.0270535795717 5984.00830078125 4.54025936126709 8.0
+761.0474872362611 5985.4931640625 4.537117004394531 8.0
+763.7651379547533 5954.291015625 4.485696315765381 8.0
+763.7855715636033 5955.0087890625 4.493117809295654 8.0
+763.8060051726789 5961.6650390625 4.495923042297363 8.0
+763.8264387822273 5963.3896484375 4.499939441680908 8.0
+763.8468723922415 5959.03662109375 4.505034446716309 8.0
+763.8673061027148 5952.3935546875 4.5073957443237305 8.0
+763.8877396134267 5966.9287109375 4.5089802742004395 8.0
+763.9081733246057 5962.94140625 4.511685848236084 8.0
+763.9490404481185 5963.63134765625 4.517755508422852 8.0
+763.9694741604617 5954.59716796875 4.5176568031311035 8.0
+763.9899077730297 5954.7587890625 4.520427227020264 8.0
+764.0103412860699 5958.783203125 4.521641254425049 8.0
+764.0307749995773 5959.65380859375 4.5231146812438965 8.0
+764.0716421277466 5948.21728515625 4.524913787841797 8.0
+764.0920758424181 5952.09521484375 4.52604866027832 8.0
+764.1533766887515 5946.39794921875 4.528848648071289 8.0
+764.1738103048119 5947.29736328125 4.528857231140137 8.0
+764.1942439213453 5945.32177734375 4.5292463302612305 8.0
+764.2146775383444 5947.39306640625 4.530683517456055 8.0
+764.2351111558019 5947.5126953125 4.532188892364502 8.0
+764.2555447734994 5940.09228515625 4.531162738800049 8.0
+764.2759783916626 5950.54296875 4.533548831939697 8.0
+764.2964121100522 5939.27392578125 4.5328497886657715 8.0
+764.3168456289131 5944.20849609375 4.534059047698975 8.0
+764.3781465880529 5946.78466796875 4.534672260284424 8.0
+764.3985801085437 5935.31982421875 4.534665584564209 8.0
+764.4190138292615 5935.61083984375 4.535109996795654 8.0
+764.4394474506844 5937.67138671875 4.535164833068848 8.0
+764.4598809721065 5949.90673828125 4.536876678466797 8.0
+764.4803146942213 5931.056640625 4.534246444702148 8.0
+764.5007483165755 5943.61083984375 4.536951541900635 8.0
+764.521181939388 5939.7080078125 4.5369672775268555 8.0
+764.5620491861919 5935.64794921875 4.536448001861572 8.0
+764.5824829099365 5940.57080078125 4.5370683670043945 8.0
+764.6029164343854 5937.744140625 4.5367255210876465 8.0
+764.6233500590679 5936.3115234375 4.535006999969482 8.0
+764.6437837842095 5932.98193359375 4.5350661277771 8.0
+764.6642173095897 5928.93408203125 4.532557487487793 8.0
+764.6846510354371 5938.93017578125 4.535345077514648 8.0
+764.7050846617421 5946.06689453125 4.537728309631348 8.0
+764.7255181885193 5925.23681640625 4.5318284034729 8.0
+764.7459519155309 5925.43408203125 4.532752990722656 8.0
+764.7663855427672 5925.7900390625 4.532583713531494 8.0
+764.7868190707086 5927.82373046875 4.531461238861084 8.0
+764.8072527988843 5932.30224609375 4.532557487487793 8.0
+764.8276864275176 5929.5537109375 4.533589839935303 8.0
+764.848120056391 5925.37158203125 4.5323872566223145 8.0
+764.8685536857301 5934.23388671875 4.5336480140686035 8.0
+764.8889872155269 5930.46728515625 4.533012390136719 8.0
+764.9094209455652 5923.80859375 4.532045364379883 8.0
+764.9298545763013 5921.5244140625 4.532219886779785 8.0
+764.9502882070301 5929.6103515625 4.53233003616333 8.0
+764.9707218384647 5924.6083984375 4.5322041511535645 8.0
+764.9911554701321 5919.04248046875 4.531604766845703 8.0
+765.011589102025 5930.63720703125 4.532406806945801 8.0
+765.0320228346245 5930.5400390625 4.532421112060547 8.0
+765.072890100746 5919.9404296875 4.531414031982422 8.0
+765.093323734276 5926.84423828125 4.532052516937256 8.0
+765.113757268271 5919.134765625 4.531098365783691 8.0
+765.1341910027259 5926.63916015625 4.532680988311768 8.0
+765.15462463742 5915.9326171875 4.530821323394775 8.0
+765.1750581725792 5927.990234375 4.531316757202148 8.0
+765.1954919081982 5921.56396484375 4.5322465896606445 8.0
+765.2159255440565 5915.173828125 4.530777454376221 8.0
+765.2363590803798 5920.8662109375 4.531925678253174 8.0
+765.2567928171629 5921.58349609375 4.531005382537842 8.0
+765.2976601916671 5918.431640625 4.531412124633789 8.0
+765.3180937296202 5923.66015625 4.530716896057129 8.0
+765.3589611064526 5922.3544921875 4.530470371246338 8.0
+765.3793946455698 5917.45361328125 4.531671047210693 8.0
+765.3998282849207 5909.43505859375 4.530274868011475 8.0
+765.4202620247306 5916.869140625 4.530027389526367 8.0
+765.440695565012 5910.4736328125 4.530215740203857 8.0
+765.4611293055277 5912.05419921875 4.529746055603027 8.0
+765.4815628465003 5907.66748046875 4.530610084533691 8.0
+765.5019964877138 5908.81787109375 4.530090808868408 8.0
+765.5224302296265 5913.9873046875 4.530169486999512 8.0
+765.5428637717705 5913.4501953125 4.529829502105713 8.0
+765.5632974141408 5904.56103515625 4.529781818389893 8.0
+765.5837311569849 5916.33251953125 4.530694961547852 8.0
+765.6041648002865 5911.419921875 4.530324935913086 8.0
+765.6245983440604 5904.232421875 4.5282511711120605 8.0
+765.6654657325344 5901.68994140625 4.529394149780273 8.0
+765.6858993772403 5903.36865234375 4.528492450714111 8.0
+765.7063330226447 5899.833984375 4.529667854309082 8.0
+765.7267666682746 5910.08349609375 4.531232833862305 8.0
+765.7472004141455 5899.193359375 4.528796672821045 8.0
+765.7880676072746 5900.79296875 4.530050754547119 8.0
+765.8085013545424 5906.42431640625 4.529701232910156 8.0
+765.8289349020415 5903.99609375 4.52880334854126 8.0
+765.8493686500005 5902.67138671875 4.528839588165283 8.0
+765.8698022981989 5903.4892578125 4.528133392333984 8.0
+765.8902358468622 5904.9228515625 4.529089450836182 8.0
+765.9106695959854 5906.71923828125 4.5301713943481445 8.0
+765.9719705454627 5905.85546875 4.528653621673584 8.0
+765.9924041962222 5900.22021484375 4.528797149658203 8.0
+766.0128378472145 5892.8662109375 4.52753210067749 8.0
+766.0332714986653 5897.45849609375 4.5287885665893555 8.0
+766.0537051503561 5897.33447265625 4.52810525894165 8.0
+766.0945724551275 5915.244140625 4.53048038482666 8.0
+766.1150061079825 5908.654296875 4.530308246612549 8.0
+766.1558734150822 5910.6748046875 4.530548095703125 8.0
+766.1763070691013 5901.16845703125 4.528488636016846 8.0
+766.1967407235861 5894.57568359375 4.528258323669434 8.0
+766.2171743785293 5898.58984375 4.529663562774658 8.0
+766.2376081337134 5900.75634765625 4.528318881988525 8.0
+766.2580417893623 5903.3837890625 4.530370235443115 8.0
+766.2784753454689 5898.20849609375 4.5283660888671875 8.0
+766.2989091018171 5892.00244140625 4.528030872344971 8.0
+766.339776315901 5889.92041015625 4.528195381164551 8.0
+766.3602100734133 5892.13623046875 4.527735233306885 8.0
+766.3806437313906 5893.91552734375 4.529120445251465 8.0
+766.401077489827 5888.41845703125 4.528077125549316 8.0
+766.421511048502 5888.66943359375 4.528316020965576 8.0
+766.4419447076361 5892.8349609375 4.528181076049805 8.0
+766.4623784670111 5885.51611328125 4.5278496742248535 8.0
+766.4828120270831 5889.45654296875 4.527064323425293 8.0
+766.5032456873887 5900.70751953125 4.529585838317871 8.0
+766.5236794479206 5891.0966796875 4.528151988983154 8.0
+766.5441130089239 5890.080078125 4.52827262878418 8.0
+766.5645466703863 5877.8876953125 4.525820255279541 8.0
+766.5849804323225 5889.69873046875 4.526838302612305 8.0
+766.6054139944899 5890.7021484375 4.528782367706299 8.0
+766.6258477571173 5891.0048828125 4.528472423553467 8.0
+766.646281419984 5878.2119140625 4.52606725692749 8.0
+766.6667149833156 5885.58544921875 4.526721954345703 8.0
+766.6871487471071 5884.6064453125 4.5277886390686035 8.0
+766.7075824113708 5895.443359375 4.528190612792969 8.0
+766.7280160758673 5884.533203125 4.527490615844727 8.0
+766.7484497405894 5887.65576171875 4.527585029602051 8.0
+766.7688834060173 5884.13427734375 4.526828289031982 8.0
+766.7893170716779 5888.24755859375 4.527569770812988 8.0
+766.809750737797 5879.13671875 4.5262250900268555 8.0
+766.8301844041562 5886.6962890625 4.527288436889648 8.0
+766.850618070981 5879.939453125 4.527372360229492 8.0
+766.8710517382642 5894.46044921875 4.529061794281006 8.0
+766.8914854057875 5877.93798828125 4.526113986968994 8.0
+766.9119191737773 5887.8369140625 4.527464866638184 8.0
+766.9323527422239 5879.47705078125 4.526288986206055 8.0
+766.9527864109114 5888.0439453125 4.527185916900635 8.0
+766.9732201800653 5884.216796875 4.528141021728516 8.0
+766.993653749676 5876.33203125 4.527087211608887 8.0
+767.0140875195284 5896.73046875 4.527763843536377 8.0
+767.0345211898457 5879.7060546875 4.527054309844971 8.0
+767.0549547606206 5883.9375 4.5255351066589355 8.0
+767.1162557748248 5877.091796875 4.526963710784912 8.0
+767.1571232198839 5886.880859375 4.527116298675537 8.0
+767.1775569927559 5880.42431640625 4.526586532592773 8.0
+767.2184242399089 5888.330078125 4.527190685272217 8.0
+767.2388580141778 5887.42529296875 4.5274529457092285 8.0
+767.2592915886853 5879.83642578125 4.5274152755737305 8.0
+767.2797252636592 5880.77197265625 4.527310848236084 8.0
+767.3001590388594 5881.54833984375 4.527376174926758 8.0
+767.320592614531 5880.478515625 4.527854919433594 8.0
+767.3410262906691 5879.16748046875 4.527332305908203 8.0
+767.3614599670327 5882.19775390625 4.527100086212158 8.0
+767.38189374387 5884.443359375 4.526462078094482 8.0
+767.402327421165 5866.515625 4.525883674621582 8.0
+767.4227610989328 5885.072265625 4.526927947998047 8.0
+767.4431946769328 5888.27001953125 4.526629447937012 8.0
+767.463628455167 5880.86328125 4.526645660400391 8.0
+767.4840621340918 5876.03076171875 4.526019096374512 8.0
+767.5044957132559 5880.74560546875 4.526413440704346 8.0
+767.5249294926471 5873.9453125 4.525875091552734 8.0
+767.5862305336341 5875.85205078125 4.526724815368652 8.0
+767.6270979961482 5878.8671875 4.526815891265869 8.0
+767.647531578099 5883.7431640625 4.526915073394775 8.0
+767.6679652602907 5876.2900390625 4.52744197845459 8.0
+767.6883990429487 5871.2294921875 4.525145053863525 8.0
+767.7088326260637 5878.53369140625 4.526559829711914 8.0
+767.7292664094202 5870.10595703125 4.5267839431762695 8.0
+767.7497000932417 5876.83642578125 4.526556968688965 8.0
+767.770133677288 5881.541015625 4.526845932006836 8.0
+767.8110011467943 5866.64501953125 4.5249810218811035 8.0
+767.8314347320047 5885.4921875 4.526278495788574 8.0
+767.8518685179224 5875.67822265625 4.526208400726318 8.0
+767.8723022038394 5871.84765625 4.525818824768066 8.0
+767.8927358904475 5875.57080078125 4.526582717895508 8.0
+767.9131695772958 5876.27587890625 4.526889801025391 8.0
+767.9336032646097 5869.4248046875 4.526844024658203 8.0
+767.9540369521492 5866.365234375 4.52620792388916 8.0
+767.9744706401616 5868.66015625 4.527505397796631 8.0
+767.9949043286397 5875.607421875 4.527440547943115 8.0
+768.0153380173433 5876.56982421875 4.526972770690918 8.0
+768.0357717065199 5883.01171875 4.527947425842285 8.0
+768.0562053959293 5880.29833984375 4.527897357940674 8.0
+768.0766390860299 5878.50732421875 4.527590274810791 8.0
+768.0970727763706 5872.630859375 4.525619983673096 8.0
+768.1175065669377 5878.8720703125 4.527750015258789 8.0
+768.1379402579769 5877.033203125 4.527360916137695 8.0
+768.158373849481 5877.80419921875 4.527477741241455 8.0
+768.1788076414523 5879.921875 4.5279765129089355 8.0
+768.1992413336484 5879.18212890625 4.527531623840332 8.0
+768.2196749263167 5864.65576171875 4.526113510131836 8.0
+768.240108719212 5876.341796875 4.527061939239502 8.0
+768.2605424125795 5880.6083984375 4.527406215667725 8.0
+768.280976006412 5873.51904296875 4.527035236358643 8.0
+768.3014098007116 5877.4921875 4.526828765869141 8.0
+768.321843495236 5879.2470703125 4.527301788330078 8.0
+768.3422772900012 5880.85400390625 4.527815818786621 8.0
+768.3627108854562 5878.44140625 4.527250289916992 8.0
+768.383144581152 5880.71875 4.527721405029297 8.0
+768.4035783770814 5875.9736328125 4.52791166305542 8.0
+768.4240119737078 5874.61572265625 4.527090549468994 8.0
+768.4444456705605 5880.6103515625 4.527795314788818 8.0
+768.4648794676541 5878.19677734375 4.527474403381348 8.0
+768.4853130654374 5875.24267578125 4.5264716148376465 8.0
+768.5057468632294 5882.865234375 4.527927875518799 8.0
+768.5261805617192 5873.57861328125 4.52809476852417 8.0
+768.5466141604411 5877.03515625 4.526891231536865 8.0
+768.5670479596229 5880.53173828125 4.527562141418457 8.0
+768.5874816592768 5870.33056640625 4.526224136352539 8.0
+768.6079153591563 5879.330078125 4.5278239250183105 8.0
+768.6283490595088 5883.740234375 4.528692245483398 8.0
+768.648782760094 5880.08447265625 4.5273542404174805 8.0
+768.6692164611377 5890.51220703125 4.528503894805908 8.0
+768.6896501626543 5881.91650390625 4.527631759643555 8.0
+768.7100838644037 5883.4326171875 4.527626037597656 8.0
+768.7305175666115 5886.47998046875 4.528359413146973 8.0
+768.7509512692923 5885.1435546875 4.528783321380615 8.0
+768.7713849722059 5880.92578125 4.5281147956848145 8.0
+768.7918187755786 5877.982421875 4.5282206535339355 8.0
+768.8326860835004 5873.12255859375 4.5267333984375 8.0
+768.8531198880373 5879.61669921875 4.527287483215332 8.0
+768.9348546099282 5879.68310546875 4.5283684730529785 8.0
+768.9552884165678 5885.6240234375 4.52919864654541 8.0
+768.9757221231994 5880.77392578125 4.52802038192749 8.0
+769.0165895381069 5876.689453125 4.5274434089660645 8.0
+769.0370232461355 5884.7890625 4.528116226196289 8.0
+769.057457054405 5878.43359375 4.527837753295898 8.0
+769.0778906631385 5882.64794921875 4.528112411499023 8.0
+769.0983243723313 5888.03759765625 4.528004169464111 8.0
+769.1187581817649 5883.56103515625 4.528268814086914 8.0
+769.1391917916626 5887.85107421875 4.52728271484375 8.0
+769.1596255020195 5886.36181640625 4.528282642364502 8.0
+769.1800593126172 5879.49365234375 4.528967380523682 8.0
+769.2004929236791 5890.37060546875 4.529069900512695 8.0
+769.2209266352002 5891.98583984375 4.5292558670043945 8.0
+769.2413604469621 5893.3203125 4.52987813949585 8.0
+769.2617940591881 5883.40869140625 4.527495861053467 8.0
+769.2822278716412 5888.06640625 4.528717517852783 8.0
+769.3435290118068 5883.74267578125 4.528501033782959 8.0
+769.404830155232 5875.08447265625 4.528507709503174 8.0
+769.4252638704857 5897.580078125 4.5307207107543945 8.0
+769.4456976859656 5895.244140625 4.529710292816162 8.0
+769.4661313021497 5887.85009765625 4.529285907745361 8.0
+769.4865650185675 5894.2158203125 4.529232501983643 8.0
+769.5274324525599 5890.04931640625 4.529943943023682 8.0
+769.547866169909 5892.84619140625 4.530102729797363 8.0
+769.56829998795 5892.77978515625 4.530458450317383 8.0
+769.5887336062297 5891.841796875 4.529507160186768 8.0
+769.6091673249757 5885.359375 4.528800964355469 8.0
+769.6296011439481 5894.11865234375 4.52970552444458 8.0
+769.6704685833029 5893.21484375 4.530004501342773 8.0
+769.6909023036715 5895.0244140625 4.531078815460205 8.0
+769.7317697451217 5890.8818359375 4.529016494750977 8.0
+769.7522034666545 5885.9267578125 4.5292534828186035 8.0
+769.7726371884273 5905.4443359375 4.531765937805176 8.0
+769.793070910433 5898.0 4.530998706817627 8.0
+769.874805802865 5886.6328125 4.5301899909973145 8.0
+769.8952396269669 5901.5478515625 4.5314860343933105 8.0
+769.9156732513002 5901.70166015625 4.531660556793213 8.0
+769.9361069760926 5903.9326171875 4.531946182250977 8.0
+769.9565407013579 5898.4970703125 4.5316877365112305 8.0
+769.976974426856 5901.31640625 4.531134128570557 8.0
+770.0178419792428 5894.6787109375 4.5312418937683105 8.0
+770.0382756059043 5901.357421875 4.531522274017334 8.0
+770.0587094330258 5902.06591796875 4.532271862030029 8.0
+770.0791431606194 5894.541015625 4.530950546264648 8.0
+770.0995767884451 5911.00244140625 4.5327582359313965 8.0
+770.1404443454885 5896.79248046875 4.531035423278809 8.0
+770.1813118039281 5908.23681640625 4.532167434692383 8.0
+770.2017455336172 5904.9951171875 4.531239986419678 8.0
+770.2221793637727 5893.85595703125 4.530373573303223 8.0
+770.2426129943851 5904.98193359375 4.532280445098877 8.0
+770.2630467252384 5911.798828125 4.532329559326172 8.0
+770.3039141883346 5910.07177734375 4.531291484832764 8.0
+770.324347920352 5909.69384765625 4.532479763031006 8.0
+770.3447817528358 5900.04736328125 4.531477928161621 8.0
+770.3652153855437 5896.8896484375 4.5315985679626465 8.0
+770.3856491189581 5906.35693359375 4.531411647796631 8.0
+770.406082952366 5903.4267578125 4.531796932220459 8.0
+770.4265165864781 5902.68701171875 4.53139066696167 8.0
+770.4469504208246 5899.4140625 4.531445026397705 8.0
+770.4673841556287 5904.7275390625 4.532223701477051 8.0
+770.4878178906729 5899.951171875 4.5313615798950195 8.0
+770.5082516261828 5897.81640625 4.531909942626953 8.0
+770.528685362151 5911.19580078125 4.533090114593506 8.0
+770.5491189983586 5917.80908203125 4.533727645874023 8.0
+770.5695528350334 5913.1982421875 4.532968521118164 8.0
+770.5899865721658 5900.4013671875 4.531642436981201 8.0
+770.6104203095383 5907.9541015625 4.531636714935303 8.0
+770.6308540473765 5902.587890625 4.532601833343506 8.0
+770.6512877854402 5903.82666015625 4.532520294189453 8.0
+770.6717216239776 5921.26123046875 4.534145832061768 8.0
+770.6921552629792 5910.93115234375 4.533300876617432 8.0
+770.7125890022071 5904.37548828125 4.532293796539307 8.0
+770.7330228419087 5911.8896484375 4.5334858894348145 8.0
+770.7534564820744 5916.650390625 4.533036231994629 8.0
+770.7738903224672 5905.62158203125 4.532093048095703 8.0
+770.7943240633322 5916.5859375 4.533300876617432 8.0
+770.814757704662 5912.67431640625 4.533444881439209 8.0
+770.835191546219 5904.07470703125 4.532562255859375 8.0
+770.8760589307421 5915.11328125 4.534379005432129 8.0
+770.8964927734633 5929.51416015625 4.53452730178833 8.0
+770.9169265164237 5915.78857421875 4.533947944641113 8.0
+770.9373602600826 5922.68798828125 4.5347580909729 8.0
+770.9577940039671 5920.1494140625 4.53310489654541 8.0
+770.9782277483246 5914.64306640625 4.53401517868042 8.0
+770.9986615929083 5915.9091796875 4.534046649932861 8.0
+771.0190952379635 5912.603515625 4.534335136413574 8.0
+771.0395289832522 5921.10302734375 4.534563064575195 8.0
+771.0599628292402 5917.09912109375 4.534905910491943 8.0
+771.080396575453 5923.71484375 4.534931659698486 8.0
+771.1008302219052 5916.80126953125 4.5344438552856445 8.0
+771.1212639688238 5914.18896484375 4.534357070922852 8.0
+771.1416978162015 5916.833984375 4.534499645233154 8.0
+771.1621315638185 5914.20947265625 4.534712314605713 8.0
+771.1825653119013 5921.623046875 4.534679889678955 8.0
+771.2029989604416 5918.873046875 4.5339035987854 8.0
+771.2234328092236 5922.5224609375 4.535284519195557 8.0
+771.2438665584632 5924.8193359375 4.5357513427734375 8.0
+771.264300208175 5924.0693359375 4.536111831665039 8.0
+771.2847340581211 5919.37451171875 4.53497838973999 8.0
+771.325601459168 5921.0400390625 4.535499572753906 8.0
+771.3460353102782 5930.11962890625 4.536374092102051 8.0
+771.4277703186672 5924.3779296875 4.535653591156006 8.0
+771.4482041716328 5923.57080078125 4.535419940948486 8.0
+771.4686378250699 5924.07568359375 4.535547256469727 8.0
+771.5095054331032 5932.15625 4.53602409362793 8.0
+771.5299390877044 5926.9521484375 4.5361409187316895 8.0
+771.5503729425327 5927.54541015625 4.536353588104248 8.0
+771.5708066978332 5926.2177734375 4.536099433898926 8.0
+771.5912403535986 5926.60888671875 4.535982608795166 8.0
+771.6525417229859 5926.81689453125 4.5357136726379395 8.0
+771.6934092377705 5932.033203125 4.536694526672363 8.0
+771.7138429956321 5945.8310546875 4.538001537322998 8.0
+771.7547105127451 5932.9580078125 4.537458896636963 8.0
+771.7751442717708 5933.623046875 4.536652565002441 8.0
+771.7955780314878 5937.78125 4.537224769592285 8.0
+771.8160117912121 5944.09130859375 4.53806209564209 8.0
+771.836445551402 5944.7548828125 4.5384202003479 8.0
+771.8568793120503 5931.43017578125 4.536550521850586 8.0
+771.8773130731715 5936.57080078125 4.537141799926758 8.0
+771.9181805963381 5937.70166015625 4.5370635986328125 8.0
+771.9386144583914 5934.111328125 4.536891460418701 8.0
+771.9590482209096 5934.7216796875 4.536221981048584 8.0
+771.9794818838855 5948.20458984375 4.538549900054932 8.0
+771.9999157471029 5943.6875 4.53816032409668 8.0
+772.0203495107853 5941.9833984375 4.537301063537598 8.0
+772.0407831749253 5940.8896484375 4.537198543548584 8.0
+772.0612170393069 5940.72119140625 4.537486553192139 8.0
+772.0816508041535 5944.60693359375 4.5382561683654785 8.0
+772.1020844692248 5944.91650390625 4.537168979644775 8.0
+772.1225183347706 5943.326171875 4.538540363311768 8.0
+772.1429521007813 5941.30615234375 4.537997245788574 8.0
+772.1633859670183 5942.779296875 4.537551403045654 8.0
+772.1838196337267 5945.03759765625 4.538039207458496 8.0
+772.2042534009015 5947.6279296875 4.5380539894104 8.0
+772.2451209361752 5942.5234375 4.538052558898926 8.0
+772.3064223418842 5944.11181640625 4.537692546844482 8.0
+772.32685611138 5949.27734375 4.539349555969238 8.0
+772.347289881116 5951.1103515625 4.538382530212402 8.0
+772.3677236510848 5964.4150390625 4.540230751037598 8.0
+772.4085911924121 5958.2890625 4.539488792419434 8.0
+772.4290249637779 5951.2802734375 4.538658142089844 8.0
+772.4494587353693 5954.36181640625 4.538889408111572 8.0
+772.4698925074335 5953.0625 4.540185928344727 8.0
+772.4903263797314 5947.228515625 4.539437294006348 8.0
+772.5107600524934 5950.576171875 4.5389204025268555 8.0
+772.5311938257146 5941.4697265625 4.538021564483643 8.0
+772.5516276991766 5950.5546875 4.539008617401123 8.0
+772.5720613730955 5961.9814453125 4.539927959442139 8.0
+772.6129290218814 5950.18798828125 4.539374351501465 8.0
+772.6333626969717 5951.19140625 4.540040016174316 8.0
+772.6537964722884 5953.40087890625 4.540257930755615 8.0
+772.6742303480787 5955.1748046875 4.54062557220459 8.0
+772.6946640243259 5949.64306640625 4.539113521575928 8.0
+772.7150979008147 5959.0107421875 4.539437770843506 8.0
+772.7355316777684 5964.16552734375 4.540796279907227 8.0
+772.7559653551871 5955.08984375 4.539126396179199 8.0
+772.7763992328328 5953.234375 4.539790153503418 8.0
+772.7968330109506 5959.8193359375 4.5400848388671875 8.0
+772.8172667892941 5962.1376953125 4.540248870849609 8.0
+772.8377005681104 5956.48095703125 4.539248943328857 8.0
+772.8785682269008 5954.62548828125 4.540318489074707 8.0
+772.9194356870939 5959.01513671875 4.539401531219482 8.0
+772.9398695677664 5963.591796875 4.54008150100708 8.0
+772.9603033489111 5967.626953125 4.540832996368408 8.0
+772.9807370302879 5953.26904296875 4.53923225402832 8.0
+773.0011709121245 5955.9677734375 4.539493560791016 8.0
+773.0216045944326 5958.208984375 4.53928804397583 8.0
+773.0420383769742 5966.86572265625 4.541022300720215 8.0
+773.062472259975 5955.95556640625 4.539459705352783 8.0
+773.1237736110852 5967.85302734375 4.5394287109375 8.0
+773.1442072954887 5958.431640625 4.539985656738281 8.0
+773.1850749656878 5973.19482421875 4.540593147277832 8.0
+773.2055086512555 5956.06005859375 4.539360523223877 8.0
+773.2259425372904 5962.20751953125 4.540071487426758 8.0
+773.2463763235501 5959.29833984375 4.540302276611328 8.0
+773.2668102102834 5963.4912109375 4.539967060089111 8.0
+773.2872438974737 5966.875 4.540862560272217 8.0
+773.3076776851376 5962.04296875 4.540339946746826 8.0
+773.3281115728023 5956.3720703125 4.539360523223877 8.0
+773.348545261164 5972.4111328125 4.542306900024414 8.0
+773.3689790497519 5955.32373046875 4.539751052856445 8.0
+773.3894129388136 5968.30615234375 4.541338920593262 8.0
+773.4098466280993 5964.44482421875 4.540692329406738 8.0
+773.4302804178587 5965.3330078125 4.5400261878967285 8.0
+773.4507143080846 5964.78076171875 4.540980339050293 8.0
+773.4711479985417 5958.3916015625 4.5397772789001465 8.0
+773.4915818894588 5964.8974609375 4.540205001831055 8.0
+773.512015680848 5960.8427734375 4.539942741394043 8.0
+773.5324494724628 5964.9677734375 4.540564060211182 8.0
+773.5528832643176 5976.107421875 4.541295051574707 8.0
+773.573317056871 5977.7666015625 4.542613983154297 8.0
+773.59375084965 5961.6767578125 4.53998327255249 8.0
+773.614184642669 5964.423828125 4.540609836578369 8.0
+773.6346184361537 5962.08837890625 4.540456295013428 8.0
+773.6550523300975 5966.35693359375 4.540609359741211 8.0
+773.6754860245128 5970.4013671875 4.541255474090576 8.0
+773.6959198191616 5967.9794921875 4.54146146774292 8.0
+773.7163537140368 5969.61279296875 4.540533542633057 8.0
+773.7367874096162 5970.78857421875 4.541186332702637 8.0
+773.7572212054292 5966.2041015625 4.541443824768066 8.0
+773.7776551014686 5968.1298828125 4.541101932525635 8.0
+773.7980887979793 5968.65478515625 4.541849136352539 8.0
+773.8185225949564 5969.79248046875 4.541820049285889 8.0
+773.8389564921599 5969.4794921875 4.540868759155273 8.0
+773.8593901898348 5972.380859375 4.540523052215576 8.0
+773.8798240879769 5966.18408203125 4.540102005004883 8.0
+773.9002578863438 5967.021484375 4.541049480438232 8.0
+773.9206915851828 5964.4052734375 4.541182994842529 8.0
+773.941125484489 5976.3564453125 4.542794227600098 8.0
+773.96155928402 5964.46337890625 4.5407304763793945 8.0
+773.9819929837904 5975.74951171875 4.542481422424316 8.0
+774.0024268842608 5969.3837890625 4.541667461395264 8.0
+774.022860684956 5974.64111328125 4.54153299331665 8.0
+774.043294585892 5977.05615234375 4.5430426597595215 8.0
+774.0637282872922 5973.80224609375 4.5419182777404785 8.0
+774.0841620891515 5972.8759765625 4.542287826538086 8.0
+774.1045959912517 5972.24560546875 4.541889667510986 8.0
+774.125029693816 5969.12841796875 4.541470527648926 8.0
+774.1454634968395 5965.08447265625 4.541008472442627 8.0
+774.1658974001039 5965.076171875 4.541816234588623 8.0
+774.1863312038331 5958.75830078125 4.541324615478516 8.0
+774.2067649077871 5971.3544921875 4.540863037109375 8.0
+774.2271988122156 5968.689453125 4.542586326599121 8.0
+774.2476326171018 5962.74462890625 4.540843486785889 8.0
+774.268066422228 5964.65673828125 4.541529178619385 8.0
+774.2885002278199 5961.919921875 4.540894508361816 8.0
+774.3089340338774 5968.94384765625 4.540481090545654 8.0
+774.3293678401606 5971.7568359375 4.542009353637695 8.0
+774.3498016469166 5965.17724609375 4.540868759155273 8.0
+774.3702353539047 5977.28369140625 4.542069911956787 8.0
+774.3906692613527 5970.154296875 4.540529251098633 8.0
+774.4111030692729 5971.6015625 4.541562080383301 8.0
+774.4315369774195 5974.52001953125 4.5419487953186035 8.0
+774.4519706860374 5965.42333984375 4.540834426879883 8.0
+774.4724044948889 5964.86474609375 4.541098594665527 8.0
+774.4928384041996 5967.2509765625 4.541823863983154 8.0
+774.5132721139817 5974.7958984375 4.541958808898926 8.0
+774.5337059239973 5977.74072265625 4.541952133178711 8.0
+774.5541398344722 5978.96826171875 4.542461395263672 8.0
+774.5745735451856 5963.35009765625 4.540111064910889 8.0
+774.5950074563661 5968.28271484375 4.541690826416016 8.0
+774.6154412680044 5960.6650390625 4.540000915527344 8.0
+774.6358749798819 5968.8359375 4.541321277618408 8.0
+774.6563088922267 5972.0 4.540036201477051 8.0
+774.6971765180715 5968.83203125 4.541251182556152 8.0
+774.7176103313468 5972.80224609375 4.5417938232421875 8.0
+774.7380441453133 5968.21923828125 4.541183948516846 8.0
+774.7789117739594 5969.267578125 4.541860103607178 8.0
+774.7993455888572 5961.17041015625 4.539781093597412 8.0
+774.8197795042288 5970.98095703125 4.541857719421387 8.0
+774.8402133200652 5963.5234375 4.540571689605713 8.0
+774.8606470361265 5967.048828125 4.54196310043335 8.0
+774.9015147691971 5970.39306640625 4.541980743408203 8.0
+774.9219484864225 5969.1943359375 4.541883945465088 8.0
+774.9423824041223 5970.43798828125 4.541747570037842 8.0
+775.003683859075 5961.8046875 4.540294170379639 8.0
+775.0241175781703 5969.66015625 4.540695667266846 8.0
+775.0649853172872 5972.35791015625 4.54202938079834 8.0
+775.0854190375467 5978.1201171875 4.541802883148193 8.0
+775.1262867789919 5968.8359375 4.541584491729736 8.0
+775.1467205001827 5966.00927734375 4.540097236633301 8.0
+775.1671544218334 5971.466796875 4.5419464111328125 8.0
+775.1875882439563 5964.4404296875 4.540448188781738 8.0
+775.2080221665383 5974.0625 4.542184352874756 8.0
+775.228455889126 5966.2646484375 4.541281700134277 8.0
+775.2488897124131 5965.80126953125 4.541193008422852 8.0
+775.2693236359337 5973.2119140625 4.540826797485352 8.0
+775.2897573599112 5973.990234375 4.542534828186035 8.0
+775.3101911841295 5963.25048828125 4.541086673736572 8.0
+775.330625108807 5976.267578125 4.54266881942749 8.0
+775.3510589339567 5960.04638671875 4.539735317230225 8.0
+775.3714927593392 5968.9365234375 4.541644096374512 8.0
+775.3919265851873 5972.37158203125 4.5420122146606445 8.0
+775.412360411261 5965.68115234375 4.54100227355957 8.0
+775.4327942378077 5967.25537109375 4.541055202484131 8.0
+775.4532280645799 5963.66064453125 4.540778636932373 8.0
+775.4736618920579 5976.96923828125 4.542158603668213 8.0
+775.4940957195358 5960.04541015625 4.540780544281006 8.0
+775.5145295477123 5968.18115234375 4.541645050048828 8.0
+775.5349633761143 5970.76806640625 4.541648864746094 8.0
+775.5553972047564 5963.7607421875 4.541100978851318 8.0
+775.5758310340898 5966.447265625 4.540528297424316 8.0
+775.5962649634312 5964.71533203125 4.5406904220581055 8.0
+775.6166986934695 5963.86083984375 4.5413384437561035 8.0
+775.6371325237342 5957.02392578125 4.54025936126709 8.0
+775.6575664542397 5967.93115234375 4.541543960571289 8.0
+775.6780001854422 5955.86181640625 4.539460182189941 8.0
+775.6984340166382 5972.01123046875 4.541945457458496 8.0
+775.7188679485407 5964.60302734375 4.540182590484619 8.0
+775.7393016806745 5962.220703125 4.541158676147461 8.0
+775.7597356130354 5966.2236328125 4.541214466094971 8.0
+775.8414709469216 5966.36376953125 4.541955471038818 8.0
+775.8619046811509 5966.1318359375 4.541525840759277 8.0
+775.882338616073 5966.7373046875 4.541804313659668 8.0
+775.9027724510015 5961.7998046875 4.540816307067871 8.0
+775.9232062866286 5960.984375 4.540864944458008 8.0
+775.9436401224812 5966.7138671875 4.5423736572265625 8.0
+775.9845078953658 5958.41650390625 4.54141902923584 8.0
+776.0458094073547 5960.97607421875 4.5414886474609375 8.0
+776.06624324531 5957.716796875 4.540371894836426 8.0
+776.0866769839631 5968.97216796875 4.5420684814453125 8.0
+776.1071109226177 5957.1611328125 4.540913105010986 8.0
+776.1275447619628 5961.2197265625 4.541508197784424 8.0
+776.147978601548 5960.37744140625 4.541586875915527 8.0
+776.2092801223916 5958.80078125 4.541191577911377 8.0
+776.2297139636066 5957.55224609375 4.540982246398926 8.0
+776.2501478050472 5963.0478515625 4.541329860687256 8.0
+776.2705816467278 5957.994140625 4.540339469909668 8.0
+776.311449231478 5961.6630859375 4.540314674377441 8.0
+776.3318831745564 5957.51953125 4.540332794189453 8.0
+776.3523170178669 5966.58447265625 4.540919303894043 8.0
+776.3727509614037 5957.3134765625 4.540325164794922 8.0
+776.4340524945874 5963.64404296875 4.540858268737793 8.0
+776.4544862397597 5961.48291015625 4.540367603302002 8.0
+776.4749200853985 5963.26953125 4.540868282318115 8.0
+776.4953540312636 5957.62890625 4.5402512550354 8.0
+776.5157877776 5957.34033203125 4.540173530578613 8.0
+776.5362217241636 5953.5185546875 4.539679527282715 8.0
+776.5566555711994 5954.05126953125 4.5401082038879395 8.0
+776.577089418468 5952.38037109375 4.539946556091309 8.0
+776.5975232661949 5956.44189453125 4.540430545806885 8.0
+776.6179571143948 5952.48974609375 4.540052890777588 8.0
+776.6383909628275 5948.99267578125 4.539757251739502 8.0
+776.6588248117187 5953.1640625 4.539367198944092 8.0
+776.6996925106796 5948.33251953125 4.539312839508057 8.0
+776.7201264605028 5954.18359375 4.539708614349365 8.0
+776.7405602110302 5959.65234375 4.539588451385498 8.0
+776.760994161792 5948.4716796875 4.539633750915527 8.0
+776.7814280127786 5947.06005859375 4.539164066314697 8.0
+776.8018617642374 5954.0 4.53947639465332 8.0
+776.8222957161634 5953.349609375 4.539961338043213 8.0
+776.8427294683133 5961.15576171875 4.539819717407227 8.0
+776.863163320937 5952.2158203125 4.539715766906738 8.0
+776.8835972737943 5943.748046875 4.538504123687744 8.0
+776.9040310271084 5947.2294921875 4.538754463195801 8.0
+776.924464980897 5950.671875 4.539724826812744 8.0
+776.9448988349177 5949.0908203125 4.539702415466309 8.0
+777.0062003993007 5943.1259765625 4.538392066955566 8.0
+777.0266341547103 5943.591796875 4.538462162017822 8.0
+777.1288035380785 5948.1552734375 4.538961887359619 8.0
+777.1492374958179 5948.6240234375 4.539269924163818 8.0
+777.169671253796 5948.2626953125 4.538890838623047 8.0
+777.2105390713768 5942.91748046875 4.537498950958252 8.0
+777.2309729305198 5943.89599609375 4.539093971252441 8.0
+777.2718406499625 5946.93408203125 4.5389862060546875 8.0
+777.2922745105025 5945.9375 4.539068222045898 8.0
+777.3127083710424 5953.2119140625 4.5400190353393555 8.0
+777.3331422322735 5946.8193359375 4.539297103881836 8.0
+777.3535760937448 5942.62109375 4.539188385009766 8.0
+777.3740100554423 5932.26953125 4.538754463195801 8.0
+777.3944438176113 5937.43017578125 4.5391435623168945 8.0
+777.4148776802467 5949.40869140625 4.53994083404541 8.0
+777.4353116431084 5949.455078125 4.540013313293457 8.0
+777.4557454064416 5954.49169921875 4.541135311126709 8.0
+777.4761792702411 5946.62841796875 4.539679050445557 8.0
+777.4966131342662 5951.677734375 4.540312767028809 8.0
+777.5170469985314 5940.12744140625 4.539350986480713 8.0
+777.5374809634959 5928.0126953125 4.538370609283447 8.0
+777.5579147284589 5937.5107421875 4.540132522583008 8.0
+777.5783485941138 5943.24072265625 4.539602279663086 8.0
+777.5987825600096 5947.73828125 4.540770530700684 8.0
+777.6396501927229 5933.47412109375 4.539350509643555 8.0
+777.6600841597829 5935.17822265625 4.538613796234131 8.0
+777.6805179270741 5935.23974609375 4.5393781661987305 8.0
+777.7009518948253 5932.197265625 4.5390305519104 8.0
+777.7213857630486 5935.11376953125 4.539449691772461 8.0
+777.7418195314967 5934.44384765625 4.5390472412109375 8.0
+777.7622535001865 5933.67822265625 4.5389485359191895 8.0
+777.782687369574 5929.80859375 4.538268566131592 8.0
+777.843988979359 5934.77099609375 4.539258003234863 8.0
+777.8848568209214 5937.7470703125 4.539350509643555 8.0
+777.9052905924036 5928.93115234375 4.537868022918701 8.0
+777.9257245641129 5926.67626953125 4.537505626678467 8.0
+777.9461584362944 5926.56591796875 4.537247657775879 8.0
+777.9665922089407 5926.984375 4.536557197570801 8.0
+777.9870261818141 5931.20751953125 4.53711462020874 8.0
+778.0074600549269 5927.4697265625 4.537822723388672 8.0
+778.0278938287374 5929.9443359375 4.536670207977295 8.0
+778.0483278025422 5924.51513671875 4.536973476409912 8.0
+778.068761677052 5924.4140625 4.535747051239014 8.0
+778.0891955517945 5924.5126953125 4.536585807800293 8.0
+778.1096294267627 5931.251953125 4.537652969360352 8.0
+778.130063202203 5922.2734375 4.535984039306641 8.0
+778.1504971781105 5923.28466796875 4.535212516784668 8.0
+778.1709310542428 5919.5322265625 4.536246299743652 8.0
+778.1913648308473 5917.4111328125 4.536111831665039 8.0
+778.2322326849826 5925.05615234375 4.536270618438721 8.0
+778.2526666627527 5923.51904296875 4.536596775054932 8.0
+778.3344020770746 5928.58544921875 4.536606788635254 8.0
+778.3548359564738 5920.4287109375 4.535258769989014 8.0
+778.3957038166627 5919.9736328125 4.534571170806885 8.0
+778.4161375972253 5920.41552734375 4.535510063171387 8.0
+778.4570054595097 5912.064453125 4.533833026885986 8.0
+778.4774393412372 5915.13134765625 4.53432559967041 8.0
+778.4978732234304 5909.49169921875 4.532802104949951 8.0
+778.5183071058491 5919.63037109375 4.53334903717041 8.0
+778.5387409885079 5910.73876953125 4.53366756439209 8.0
+778.5591748718653 5915.7841796875 4.532339096069336 8.0
+778.5796087552153 5910.0810546875 4.532841682434082 8.0
+778.6000427392719 5907.01220703125 4.5331196784973145 8.0
+778.6204765235598 5907.72705078125 4.532641410827637 8.0
+778.6613443930619 5904.54931640625 4.532130241394043 8.0
+778.6817781785139 5903.15185546875 4.532121658325195 8.0
+778.7226460503443 5905.85791015625 4.53285551071167 8.0
+778.7430798367277 5910.60302734375 4.533352375030518 8.0
+778.8043814984339 5899.130859375 4.531263828277588 8.0
+778.8248154864414 5893.3466796875 4.530456066131592 8.0
+778.8452492746874 5904.43798828125 4.531062126159668 8.0
+778.8656832634006 5903.828125 4.531879425048828 8.0
+778.8861171523386 5900.794921875 4.531683444976807 8.0
+778.9065509417487 5909.44189453125 4.531793117523193 8.0
+778.9269849316261 5896.6181640625 4.531031608581543 8.0
+778.9474188217282 5895.20458984375 4.531260967254639 8.0
+778.9678527123033 5894.58251953125 4.530542850494385 8.0
+778.9882866031112 5896.65771484375 4.530769348144531 8.0
+779.0087204943775 5894.18994140625 4.5311713218688965 8.0
+779.0291544858846 5898.3291015625 4.530214786529541 8.0
+779.049588277856 5889.67333984375 4.53018045425415 8.0
+779.0700221700536 5891.81689453125 4.529804229736328 8.0
+779.0904561629577 5894.7255859375 4.530845642089844 8.0
+779.1108900558611 5885.75439453125 4.529567241668701 8.0
+779.1313238492221 5894.92919921875 4.529445648193359 8.0
+779.1517578430576 5893.12646484375 4.5298848152160645 8.0
+779.1721917373507 5891.56103515625 4.530328273773193 8.0
+779.1926255318831 5886.97998046875 4.5295891761779785 8.0
+779.2130595266499 5888.986328125 4.529693126678467 8.0
+779.2334934218816 5893.029296875 4.529447078704834 8.0
+779.2539274175724 5897.54150390625 4.530397891998291 8.0
+779.2743612135018 5881.95361328125 4.5278425216674805 8.0
+779.3152290065191 5886.1279296875 4.529082298278809 8.0
+779.3356629036134 5887.4736328125 4.528853893280029 8.0
+779.3560968011734 5879.66357421875 4.52808141708374 8.0
+779.376530698959 5879.26416015625 4.527231216430664 8.0
+779.3969645969846 5882.8271484375 4.528233051300049 8.0
+779.4173985957023 5880.1640625 4.528419494628906 8.0
+779.4378323944256 5879.04248046875 4.529135704040527 8.0
+779.4582662938483 5877.89501953125 4.527956008911133 8.0
+779.4787002934972 5876.2744140625 4.527846813201904 8.0
+779.5195679937387 5883.27978515625 4.5274810791015625 8.0
+779.5400019945519 5876.34326171875 4.527973651885986 8.0
+779.5604357956036 5872.876953125 4.527417182922363 8.0
+779.5808696971217 5869.1708984375 4.525659561157227 8.0
+779.6013036988661 5878.361328125 4.527317047119141 8.0
+779.6217376010827 5882.12548828125 4.527979850769043 8.0
+779.6421715035322 5874.1015625 4.527632236480713 8.0
+779.7034732134343 5864.6181640625 4.526444911956787 8.0
+779.7239071172735 5877.91748046875 4.5274529457092285 8.0
+779.7443410218184 5879.64013671875 4.5271830558776855 8.0
+779.7647750263641 5872.66015625 4.527284622192383 8.0
+779.7852088315994 5867.9296875 4.526784420013428 8.0
+779.8260767427855 5864.93408203125 4.52546501159668 8.0
+779.9282462773699 5860.50341796875 4.523759841918945 8.0
+779.9486801854073 5857.861328125 4.524850845336914 8.0
+779.9691139936695 5861.125 4.525305271148682 8.0
+780.0099818116068 5852.8740234375 4.524725437164307 8.0
+780.0917175516588 5857.748046875 4.525388717651367 8.0
+780.1121514624901 5868.00048828125 4.52642822265625 8.0
+780.1734531973052 5860.32421875 4.524509429931641 8.0
+780.2143210224531 5868.13720703125 4.526133060455322 8.0
+780.2347549356127 5845.12939453125 4.5244221687316895 8.0
+780.2551889489987 5841.46923828125 4.52376651763916 8.0
+780.2756228628568 5856.46728515625 4.525443077087402 8.0
+780.296056676947 5853.29345703125 4.525618076324463 8.0
+780.3164906915044 5850.84326171875 4.52488374710083 8.0
+780.3369246062866 5851.36181640625 4.523226261138916 8.0
+780.357358421541 5854.96826171875 4.52492094039917 8.0
+780.3777924372553 5859.26171875 4.5254974365234375 8.0
+780.3982263532089 5856.9775390625 4.524421691894531 8.0
+780.4186603696289 5860.39013671875 4.525775909423828 8.0
+780.4390941862803 5855.78173828125 4.525944232940674 8.0
+780.4595281033908 5856.55224609375 4.5246052742004395 8.0
+780.4799621207421 5860.3134765625 4.527246475219727 8.0
+780.5003959385504 5845.73828125 4.523369312286377 8.0
+780.5208298568323 5856.263671875 4.524995803833008 8.0
+780.5412638753478 5845.634765625 4.523681640625 8.0
+780.5616976940946 5849.15625 4.523879051208496 8.0
+780.622999452884 5847.97119140625 4.523975372314453 8.0
+780.6638672941044 5847.25732421875 4.524432182312012 8.0
+780.6843012149475 5841.953125 4.523244857788086 8.0
+780.7047352364825 5845.068359375 4.522977828979492 8.0
+780.7251690582561 5850.80078125 4.524349689483643 8.0
+780.7456029804889 5852.33642578125 4.525550842285156 8.0
+780.7660370029625 5849.20263671875 4.5238871574401855 8.0
+780.7864708256675 5845.52294921875 4.524848937988281 8.0
+780.8069048490652 5856.94873046875 4.524925708770752 8.0
+780.8273387724694 5855.70068359375 4.5256500244140625 8.0
+780.8682066206675 5844.1240234375 4.523396015167236 8.0
+780.9090744705027 5842.03759765625 4.523148536682129 8.0
+780.9295083957622 5849.10791015625 4.524561882019043 8.0
+780.9499423214947 5836.82568359375 4.52224063873291 8.0
+780.9703763476937 5846.0791015625 4.524275779724121 8.0
+781.0112441010133 5835.59814453125 4.522721290588379 8.0
+781.0316781281435 5840.22802734375 4.524501323699951 8.0
+781.0521120557314 5836.6904296875 4.523496627807617 8.0
+781.0725458837915 5838.70654296875 4.523623943328857 8.0
+781.0929799118458 5844.10595703125 4.5241618156433105 8.0
+781.1134138406051 5842.5888671875 4.522994518280029 8.0
+781.1338476695964 5832.005859375 4.522953987121582 8.0
+781.1542816988222 5836.22412109375 4.521914958953857 8.0
+781.1747156287383 5842.5986328125 4.523769378662109 8.0
+781.2155834892765 5842.7578125 4.523280620574951 8.0
+781.2768852825393 5838.99462890625 4.523595809936523 8.0
+781.3177531468027 5841.2236328125 4.524369239807129 8.0
+781.33818707928 5835.498046875 4.522721767425537 8.0
+781.358621112231 5843.7099609375 4.524577617645264 8.0
+781.4199229134028 5840.2646484375 4.522636890411377 8.0
+781.4403567477493 5830.74951171875 4.523096561431885 8.0
+781.4812247176014 5837.68408203125 4.5226359367370605 8.0
+781.5016586531128 5844.82958984375 4.524260997772217 8.0
+781.5220924888563 5833.87744140625 4.523898124694824 8.0
+781.5629604617352 5828.5302734375 4.522930145263672 8.0
+781.5833943986363 5831.48974609375 4.522900581359863 8.0
+781.6038283357775 5843.634765625 4.524757385253906 8.0
+781.6242622733844 5837.654296875 4.524012088775635 8.0
+781.685564088526 5842.240234375 4.523963451385498 8.0
+781.7059981275233 5842.392578125 4.524285316467285 8.0
+781.7264319669921 5831.9013671875 4.523029804229736 8.0
+781.7468660066952 5836.3447265625 4.522986888885498 8.0
+781.7672999468559 5840.89404296875 4.525003910064697 8.0
+781.7877337874888 5833.9296875 4.523102760314941 8.0
+781.8081678283561 5843.587890625 4.523749828338623 8.0
+781.8286017694481 5836.44873046875 4.523319721221924 8.0
+781.8490356110124 5838.36474609375 4.523117542266846 8.0
+781.8694696530438 5834.47412109375 4.523760795593262 8.0
+781.8899035953 5838.57177734375 4.523554801940918 8.0
+781.9103375380291 5840.9970703125 4.523979187011719 8.0
+781.9307714809911 5831.43115234375 4.522906303405762 8.0
+781.992073312198 5844.87158203125 4.523806095123291 8.0
+782.0125072565497 5835.5361328125 4.522556304931641 8.0
+782.0329412013743 5832.609375 4.522521495819092 8.0
+782.0533751466646 5846.19189453125 4.52518892288208 8.0
+782.0738090921805 5851.73095703125 4.525228023529053 8.0
+782.114676984158 5843.052734375 4.524002552032471 8.0
+782.1555449777588 5841.63525390625 4.523069381713867 8.0
+782.1759788251438 5840.765625 4.524095058441162 8.0
+782.2781486669483 5841.15673828125 4.524909496307373 8.0
+782.298582716423 5830.28564453125 4.52194356918335 8.0
+782.3190165661363 5838.08935546875 4.523261547088623 8.0
+782.339450516316 5834.91552734375 4.5244035720825195 8.0
+782.3598845669549 5842.03515625 4.524270534515381 8.0
+782.3803184178323 5850.92626953125 4.524786949157715 8.0
+782.4007523689434 5841.17236328125 4.524630546569824 8.0
+782.4211864205135 5836.021484375 4.522907257080078 8.0
+782.4416202725552 5835.126953125 4.523428440093994 8.0
+782.4620542248304 5843.17822265625 4.524526119232178 8.0
+782.4824882775647 5846.630859375 4.52509880065918 8.0
+782.5029221305376 5834.07080078125 4.523177623748779 8.0
+782.5233561839777 5836.78271484375 4.523793697357178 8.0
+782.5437901376426 5840.30126953125 4.524219036102295 8.0
+782.5846580461512 5847.41748046875 4.5246477127075195 8.0
+782.6255258562815 5841.2978515625 4.524838924407959 8.0
+782.645959911817 5846.0322265625 4.524486541748047 8.0
+782.6868278238107 5844.8955078125 4.525073528289795 8.0
+782.7072617805097 5843.7861328125 4.524729251861572 8.0
+782.7276957374343 5851.51318359375 4.525082588195801 8.0
+782.7481296945989 5845.77587890625 4.52484655380249 8.0
+782.7685636522292 5848.5703125 4.524996757507324 8.0
+782.7889976103179 5848.20166015625 4.524817943572998 8.0
+782.8094315686467 5840.07421875 4.524911880493164 8.0
+782.8298655274411 5847.02978515625 4.525372505187988 8.0
+782.8502994864612 5849.78125 4.52480411529541 8.0
+782.8707335459549 5842.2314453125 4.524490833282471 8.0
+782.8911674056799 5837.10888671875 4.52464485168457 8.0
+782.9116014658648 5840.8642578125 4.524393081665039 8.0
+782.9320354262891 5842.47021484375 4.524613380432129 8.0
+782.9524692871782 5850.71630859375 4.525974273681641 8.0
+782.9729033485273 5847.8974609375 4.524750709533691 8.0
+782.9933373101157 5848.501953125 4.526151657104492 8.0
+783.0137711719362 5845.49658203125 4.525341510772705 8.0
+783.0342052342166 5848.44287109375 4.5257415771484375 8.0
+783.0750732599554 5846.9951171875 4.525000095367432 8.0
+783.0955071231656 5848.12451171875 4.525364398956299 8.0
+783.1772429802222 5849.6826171875 4.525821208953857 8.0
+783.1976769453031 5847.1240234375 4.525802135467529 8.0
+783.2181109108424 5857.5087890625 4.526518821716309 8.0
+783.2385448766217 5844.296875 4.525019645690918 8.0
+783.2589788428668 5851.62158203125 4.526532173156738 8.0
+783.2794128093374 5854.54833984375 4.527099609375 8.0
+783.2998468762817 5847.62109375 4.526017665863037 8.0
+783.320280843458 5849.58740234375 4.525997638702393 8.0
+783.340714711092 5848.2880859375 4.5258941650390625 8.0
+783.3611487789676 5849.13720703125 4.5262274742126465 8.0
+783.3815827473009 5852.6533203125 4.526354789733887 8.0
+783.4020166161063 5853.666015625 4.526474952697754 8.0
+783.4428846544179 5847.46240234375 4.525693893432617 8.0
+783.4633187241488 5855.1904296875 4.5269775390625 8.0
+783.4837525941184 5840.447265625 4.524831295013428 8.0
+783.5246206354495 5857.248046875 4.527241230010986 8.0
+783.5450545065833 5857.064453125 4.526845455169678 8.0
+783.5654884781761 5858.466796875 4.527168273925781 8.0
+783.5859225500099 5861.14599609375 4.527113437652588 8.0
+783.6063564220749 5855.97021484375 4.527347564697266 8.0
+783.6267903948319 5846.29345703125 4.525583267211914 8.0
+783.647224467597 5849.41796875 4.525962829589844 8.0
+783.6676583408262 5858.74658203125 4.526979923248291 8.0
+783.6880924145153 5858.11767578125 4.527040958404541 8.0
+783.7289602628371 5854.54443359375 4.526962757110596 8.0
+783.7902622878755 5862.33251953125 4.527916431427002 8.0
+783.8311302396833 5853.375 4.52764368057251 8.0
+783.8515642161728 5853.23779296875 4.527045249938965 8.0
+783.9128661477298 5861.4404296875 4.528006553649902 8.0
+783.9537341037285 5858.81689453125 4.526999473571777 8.0
+783.9741680823136 5858.8212890625 4.527013301849365 8.0
+784.0354701201577 5862.54296875 4.527451992034912 8.0
+784.0559040001317 5861.97216796875 4.527361869812012 8.0
+784.0763380803473 5855.85498046875 4.526840686798096 8.0
+784.117205942166 5858.216796875 4.527382850646973 8.0
+784.1580740053905 5864.9296875 4.5280022621154785 8.0
+784.17850788746 5860.71923828125 4.527370452880859 8.0
+784.1989419697711 5874.91357421875 4.52915096282959 8.0
+784.2193759525398 5860.41845703125 4.52738094329834 8.0
+784.2398100357823 5866.58251953125 4.527949810028076 8.0
+784.260243919256 5869.564453125 4.527642726898193 8.0
+784.2806779031962 5865.26708984375 4.527810096740723 8.0
+784.3011119873627 5863.3037109375 4.527102470397949 8.0
+784.3215458717677 5857.34130859375 4.526544570922852 8.0
+784.341979856632 5870.4013671875 4.528264045715332 8.0
+784.3624139419699 5865.14208984375 4.527979373931885 8.0
+784.3828478275391 5865.28759765625 4.527059078216553 8.0
+784.4032818135747 5862.810546875 4.527615547180176 8.0
+784.4237157998359 5871.5615234375 4.528545379638672 8.0
+784.44414978657 5864.025390625 4.527942180633545 8.0
+784.4645838735305 5867.4560546875 4.527716636657715 8.0
+784.4850177609624 5868.72802734375 4.527911186218262 8.0
+784.5054517486278 5869.37255859375 4.528528690338135 8.0
+784.5463198251164 5874.291015625 4.529260635375977 8.0
+784.5667537139452 5874.94970703125 4.529458522796631 8.0
+784.5871878030011 5867.712890625 4.527893543243408 8.0
+784.6076217925292 5874.57958984375 4.5292253494262695 8.0
+784.6280557822902 5875.0087890625 4.528679847717285 8.0
+784.6484897725095 5877.1240234375 4.529479026794434 8.0
+784.6689237629689 5867.8310546875 4.528162479400635 8.0
+784.6893578538948 5875.58984375 4.52921199798584 8.0
+784.7097917450446 5880.7861328125 4.529684066772461 8.0
+784.7302257366682 5880.2138671875 4.52975606918335 8.0
+784.7506598285254 5877.72607421875 4.529075622558594 8.0
+784.7710937208394 5890.1826171875 4.530725002288818 8.0
+784.7915277133943 5872.0009765625 4.528750896453857 8.0
+784.8119618064156 5882.56982421875 4.529659748077393 8.0
+784.832395699661 5873.91748046875 4.5284576416015625 8.0
+784.8528297933808 5880.72900390625 4.529706001281738 8.0
+784.8732637875655 5866.7265625 4.527246475219727 8.0
+784.9141317766262 5874.64892578125 4.529170989990234 8.0
+784.9345657717422 5875.77734375 4.529222011566162 8.0
+784.954999667083 5884.33447265625 4.529840469360352 8.0
+784.9754337628983 5880.42333984375 4.529225826263428 8.0
+784.9958677589457 5870.71435546875 4.528265476226807 8.0
+785.0163018554522 5878.44580078125 4.529016494750977 8.0
+785.0367357521973 5883.341796875 4.529550552368164 8.0
+785.0571697494088 5876.03759765625 4.529215335845947 8.0
+785.0776037468459 5883.05712890625 4.53030252456665 8.0
+785.0980377447559 5888.64501953125 4.530539035797119 8.0
+785.1184717431315 5879.919921875 4.528942584991455 8.0
+785.1593397405741 5888.45947265625 4.529664516448975 8.0
+785.179773739881 5880.7080078125 4.528849124908447 8.0
+785.2002078394144 5887.623046875 4.529633522033691 8.0
+785.2206417394191 5876.712890625 4.528717517852783 8.0
+785.2410758396582 5887.10546875 4.529488563537598 8.0
+785.2615098403548 5891.44873046875 4.5300116539001465 8.0
+785.2819437412909 5885.6474609375 4.529653072357178 8.0
+785.3023778426868 5880.7236328125 4.529017448425293 8.0
+785.3228118443221 5894.56103515625 4.530500888824463 8.0
+785.3432457464223 5896.48681640625 4.530472755432129 8.0
+785.3636798489897 5891.9541015625 4.530253887176514 8.0
+785.384113851549 5887.1689453125 4.5297651290893555 8.0
+785.4045479548149 5894.62744140625 4.530601501464844 8.0
+785.4249818583048 5885.271484375 4.529686450958252 8.0
+785.4454158620356 5890.69384765625 4.530162334442139 8.0
+785.4658499662328 5900.88916015625 4.5310845375061035 8.0
+785.4862838706613 5900.728515625 4.5313029289245605 8.0
+785.5067178755489 5894.02197265625 4.53003454208374 8.0
+785.5271519806774 5899.96923828125 4.530814170837402 8.0
+785.5475858862628 5902.1884765625 4.531411170959473 8.0
+785.5680198920891 5893.70263671875 4.529787540435791 8.0
+785.5884539983817 5904.765625 4.53139066696167 8.0
+785.6088879049057 5912.52490234375 4.532556533813477 8.0
+785.6293220118896 5910.4560546875 4.532200336456299 8.0
+785.6497560191128 5909.6630859375 4.530660629272461 8.0
+785.6701900267944 5900.17236328125 4.530914306640625 8.0
+785.6906240347162 5906.5419921875 4.531614303588867 8.0
+785.7110580431035 5903.20068359375 4.5306782722473145 8.0
+785.731491951723 5899.99853515625 4.530574321746826 8.0
+785.7519260608024 5899.35693359375 4.530795097351074 8.0
+785.7723600701211 5895.30078125 4.530467510223389 8.0
+785.8336621003982 5908.6005859375 4.531505107879639 8.0
+785.8540961111066 5905.19287109375 4.531933307647705 8.0
+785.8949641337022 5905.58837890625 4.531362533569336 8.0
+785.9153982453427 5905.47265625 4.530680179595947 8.0
+785.9562661700329 5909.30517578125 4.531679630279541 8.0
+785.9767002828376 5901.8876953125 4.531009197235107 8.0
+785.9971341961136 5907.7490234375 4.531424522399902 8.0
+786.017568309624 5904.888671875 4.531436443328857 8.0
+786.0584362375666 5905.42919921875 4.530914783477783 8.0
+786.0788703522412 5910.98291015625 4.53175687789917 8.0
+786.1401723978852 5906.2763671875 4.531190395355225 8.0
+786.1606064139487 5921.4423828125 4.5330305099487305 8.0
+786.2219084637836 5912.7861328125 4.532087326049805 8.0
+786.2423425812522 5924.43701171875 4.532878875732422 8.0
+786.2627764989447 5911.0439453125 4.531619548797607 8.0
+786.3445125729995 5916.646484375 4.532567501068115 8.0
+786.3649465925628 5923.17041015625 4.533204555511475 8.0
+786.3853806121188 5910.25634765625 4.532033443450928 8.0
+786.4058147323813 5914.2158203125 4.53267765045166 8.0
+786.467116794789 5915.78564453125 4.532707214355469 8.0
+786.4875508162149 5913.92578125 4.532305717468262 8.0
+786.5079847380985 5919.6845703125 4.53237771987915 8.0
+786.5284188602236 5919.42333984375 4.533060550689697 8.0
+786.5488528825808 5922.62109375 4.533230781555176 8.0
+786.5692868056358 5921.564453125 4.533007621765137 8.0
+786.589720928685 5934.3740234375 4.534206390380859 8.0
+786.6101549522064 5931.21728515625 4.533908367156982 8.0
+786.6305890761869 5920.9892578125 4.533182621002197 8.0
+786.651023000406 5923.84375 4.533255100250244 8.0
+786.6714570250915 5917.16552734375 4.532878398895264 8.0
+786.6918911500034 5928.7568359375 4.5339436531066895 8.0
+786.7123250751538 5924.97509765625 4.533556938171387 8.0
+786.7327591007706 5922.3095703125 4.533002853393555 8.0
+786.7531932268466 5929.49755859375 4.533858776092529 8.0
+786.7736271531612 5936.29931640625 4.534937858581543 8.0
+786.8144953067167 5935.8017578125 4.534088134765625 8.0
+786.8553633616757 5928.6826171875 4.5335774421691895 8.0
+786.8757973898464 5924.76904296875 4.533483982086182 8.0
+786.8962314180244 5923.1484375 4.533530235290527 8.0
+786.9166654469009 5928.68994140625 4.534284591674805 8.0
+786.9370994760029 5931.2802734375 4.533870220184326 8.0
+786.957533505345 5934.8388671875 4.535281658172607 8.0
+786.9779675351529 5929.56787109375 4.533807754516602 8.0
+787.0392696264316 5924.87939453125 4.534276485443115 8.0
+787.0597036573963 5926.95166015625 4.533583641052246 8.0
+787.0801377888347 5927.8994140625 4.534307479858398 8.0
+787.1005717207372 5937.0966796875 4.534847259521484 8.0
+787.121005752866 5930.3388671875 4.533670902252197 8.0
+787.1414398852357 5929.2431640625 4.533340930938721 8.0
+787.1618738180696 5935.9873046875 4.533669471740723 8.0
+787.1823079513633 5935.58935546875 4.534455299377441 8.0
+787.2027419848964 5931.7431640625 4.533590316772461 8.0
+787.2640440875839 5933.8974609375 4.533506393432617 8.0
+787.2844780222804 5930.26123046875 4.533378601074219 8.0
+787.3253461930653 5936.05859375 4.533609390258789 8.0
+787.3457801291588 5933.48095703125 4.533213138580322 8.0
+787.3866483020392 5948.1484375 4.534701347351074 8.0
+787.4070824388255 5938.890625 4.532832145690918 8.0
+787.4683845517575 5933.677734375 4.533050537109375 8.0
+787.4888184899464 5945.353515625 4.533645153045654 8.0
+787.5092525286018 5939.9033203125 4.5334272384643555 8.0
+787.5296866677163 5933.4052734375 4.532626628875732 8.0
+787.5501207070702 5933.47216796875 4.533390522003174 8.0
+787.5705547466569 5938.86376953125 4.533497333526611 8.0
+787.5909887867019 5946.26171875 4.5340352058410645 8.0
+787.631856867738 5945.529296875 4.53462028503418 8.0
+787.6522909087143 5942.4013671875 4.53330135345459 8.0
+787.6727248501629 5947.7841796875 4.5345964431762695 8.0
+787.6931589918458 5941.7548828125 4.53306770324707 8.0
+787.7135930339864 5939.90576171875 4.5334014892578125 8.0
+787.7544611192134 5947.93505859375 4.533785343170166 8.0
+787.795329305598 5938.6962890625 4.532750606536865 8.0
+787.8157632493749 5943.4013671875 4.532253265380859 8.0
+787.8361972936109 5942.31103515625 4.532991886138916 8.0
+787.8566314380878 5940.39697265625 4.533155918121338 8.0
+787.877065382796 5946.74072265625 4.532514572143555 8.0
+787.8974994279633 5941.30419921875 4.532153129577637 8.0
+787.9179335733716 5941.92041015625 4.532012939453125 8.0
+787.9383675192439 5936.66650390625 4.531875133514404 8.0
+787.9588016653433 5949.57958984375 4.533494472503662 8.0
+787.979235711915 5940.12841796875 4.531476974487305 8.0
+787.9996696587186 5944.92822265625 4.532474517822266 8.0
+788.0201038057494 5944.20849609375 4.532797813415527 8.0
+788.0609719012209 5948.6953125 4.531910419464111 8.0
+788.0814059494151 5936.16650390625 4.5317840576171875 8.0
+788.1018399978493 5958.427734375 4.5344343185424805 8.0
+788.1222740467492 5953.486328125 4.532610893249512 8.0
+788.1427080961075 5942.23583984375 4.53162956237793 8.0
+788.1631421457059 5946.8037109375 4.532431602478027 8.0
+788.1835762955307 5947.1279296875 4.532140254974365 8.0
+788.2040102458268 5944.6474609375 4.5330729484558105 8.0
+788.2244442963565 5949.59423828125 4.531771183013916 8.0
+788.2448783471191 5942.4775390625 4.532698154449463 8.0
+788.26531239834 5948.0947265625 4.531942367553711 8.0
+788.2857464500339 5947.5712890625 4.532420635223389 8.0
+788.3061806019541 5941.68212890625 4.531861782073975 8.0
+788.3470487067389 5941.2783203125 4.531719207763672 8.0
+788.3674827598297 5955.60888671875 4.533157825469971 8.0
+788.3879167131454 5946.955078125 4.531797885894775 8.0
+788.4083508667027 5954.6708984375 4.532203197479248 8.0
+788.4287849207176 5949.15673828125 4.531437873840332 8.0
+788.4492188749718 5953.486328125 4.532527923583984 8.0
+788.4696530295769 5957.77587890625 4.532445907592773 8.0
+788.4900870845304 5955.40478515625 4.533242225646973 8.0
+788.5105210398251 5945.7119140625 4.530975818634033 8.0
+788.5309551954779 5947.3134765625 4.531131267547607 8.0
+788.5513892514718 5945.576171875 4.531360149383545 8.0
+788.5922573645221 5953.63427734375 4.5319905281066895 8.0
+788.6126914215711 5944.27001953125 4.531684398651123 8.0
+788.6331255788464 5950.474609375 4.532432556152344 8.0
+788.6535595365931 5955.505859375 4.532192707061768 8.0
+788.6739935945661 5951.37158203125 4.531826972961426 8.0
+788.6944277528964 5950.1396484375 4.531773090362549 8.0
+788.7148617116909 5951.283203125 4.533298969268799 8.0
+788.7352958707124 5947.12158203125 4.531539440155029 8.0
+788.7557299300897 5950.5478515625 4.531723499298096 8.0
+788.7761639898163 5948.921875 4.531942844390869 8.0
+788.7965980497684 5958.330078125 4.532145977020264 8.0
+788.8170321101934 5953.85693359375 4.532036304473877 8.0
+788.8374661709677 5959.33056640625 4.533027648925781 8.0
+788.8579002319675 5958.07666015625 4.5330424308776855 8.0
+788.8783342933239 5953.66162109375 4.531393527984619 8.0
+788.8987683551459 5948.41796875 4.53175163269043 8.0
+788.9192024171934 5957.244140625 4.531641960144043 8.0
+788.9396364795975 5953.3466796875 4.531689167022705 8.0
+788.9600706423516 5953.75830078125 4.531130313873291 8.0
+788.9805046054462 5951.60693359375 4.531724452972412 8.0
+789.0009386687816 5957.62255859375 4.5324249267578125 8.0
+789.0213728325762 5949.61572265625 4.5315728187561035 8.0
+789.0418067967257 5952.859375 4.532190799713135 8.0
+789.0622408611089 5963.87353515625 4.533846378326416 8.0
+789.1031089910321 5958.7470703125 4.531805038452148 8.0
+789.1235431564637 5962.95458984375 4.532870292663574 8.0
+789.1439772222366 5958.3251953125 4.531320095062256 8.0
+789.1644111882488 5959.837890625 4.532700538635254 8.0
+789.1848453547282 5958.107421875 4.532466888427734 8.0
+789.205279421556 5968.64453125 4.533573150634766 8.0
+789.2257134886095 5963.46435546875 4.533266067504883 8.0
+789.2461475561358 5958.97802734375 4.533565044403076 8.0
+789.2665816238878 5961.8994140625 4.533047199249268 8.0
+789.3074497604539 5963.79541015625 4.533392429351807 8.0
+789.3278838292608 5958.1630859375 4.532379150390625 8.0
+789.3483179984105 5958.5205078125 4.533412456512451 8.0
+789.3891860376461 5951.919921875 4.531731605529785 8.0
+789.4096202078508 5957.98828125 4.532930374145508 8.0
+789.4300542782876 5962.4736328125 4.533501148223877 8.0
+789.4504882491892 5954.611328125 4.532738208770752 8.0
+789.470922420318 5956.27294921875 4.531983375549316 8.0
+789.4913563918017 5961.82373046875 4.533140659332275 8.0
+789.5117904635117 5955.671875 4.531589984893799 8.0
+789.5322246356955 5958.2373046875 4.532899379730225 8.0
+789.5526586082269 5954.29296875 4.533236503601074 8.0
+789.6343950014852 5957.27099609375 4.532805442810059 8.0
+789.6548290756473 5964.822265625 4.533020496368408 8.0
+789.7161313001052 5957.36083984375 4.53291130065918 8.0
+789.7569994514488 5971.12158203125 4.5365729331970215 8.0
+789.7978677041974 5966.34130859375 4.535371780395508 8.0
+789.818301681029 5955.00732421875 4.532647609710693 8.0
+789.8591699356402 5963.00048828125 4.53420352935791 8.0
+789.8796039135195 5961.51806640625 4.535223960876465 8.0
+789.9409062490377 5958.64892578125 4.534111976623535 8.0
+789.9613403282056 5960.392578125 4.535404682159424 8.0
+789.9817744077227 5963.21728515625 4.533703327178955 8.0
+790.0022084874654 5955.73046875 4.532660484313965 8.0
+790.022642567681 5955.15625 4.5329909324646 8.0
+790.0430766481295 5954.349609375 4.533112525939941 8.0
+790.0635107290364 5962.3671875 4.536245346069336 8.0
+790.0839449101841 5965.21435546875 4.533270835876465 8.0
+790.1043788916795 5954.32861328125 4.53250789642334 8.0
+790.1656811382563 5965.07763671875 4.534536361694336 8.0
+790.1861153210266 5956.421875 4.5333380699157715 8.0
+790.2065493042683 5967.99609375 4.536141872406006 8.0
+790.2269833877435 5955.9345703125 4.532113552093506 8.0
+790.2474175715615 5964.07177734375 4.536084175109863 8.0
+790.2678515557345 5965.99462890625 4.536288261413574 8.0
+790.2882856402575 5968.3330078125 4.535460948944092 8.0
+790.3087198250068 5957.728515625 4.532460689544678 8.0
+790.3291538102276 5973.2890625 4.536169052124023 8.0
+790.370022081479 5960.5673828125 4.535473346710205 8.0
+790.390456067631 5962.748046875 4.535190105438232 8.0
+790.4313243409779 5960.28515625 4.535540580749512 8.0
+790.4517584281784 5957.81982421875 4.5346999168396 8.0
+790.4721925156045 5968.8583984375 4.536413669586182 8.0
+790.4926266033872 5960.4521484375 4.535278797149658 8.0
+790.5130607916362 5958.7333984375 4.534224510192871 8.0
+790.5334947801166 5957.1728515625 4.533915996551514 8.0
+790.5539288688233 5956.98583984375 4.5347394943237305 8.0
+790.5743630580037 5954.5771484375 4.535111427307129 8.0
+790.5947971475252 5963.71435546875 4.533705711364746 8.0
+790.6152311372862 5955.5087890625 4.534706115722656 8.0
+790.6356653273979 5955.89697265625 4.534235954284668 8.0
+790.6560994178508 5963.25732421875 4.534167289733887 8.0
+790.6765334086595 5962.1220703125 4.535533905029297 8.0
+790.6969675998189 5961.68115234375 4.5355939865112305 8.0
+790.7174016913195 5957.25244140625 4.535574913024902 8.0
+790.737835883061 5950.46728515625 4.533353805541992 8.0
+790.7582698752667 5961.5830078125 4.535399913787842 8.0
+790.7787038677052 5966.640625 4.536134719848633 8.0
+790.7991380604872 5956.154296875 4.533128261566162 8.0
+790.8195721535085 5955.34326171875 4.534689903259277 8.0
+790.8400061469874 5962.63330078125 4.536156177520752 8.0
+790.860440340708 5959.56494140625 4.534893035888672 8.0
+790.8808744348935 5958.6416015625 4.535638332366943 8.0
+790.9013086293053 5958.7734375 4.535789489746094 8.0
+790.962610914532 5957.62109375 4.535024166107178 8.0
+791.0034790063946 5960.6416015625 4.5345940589904785 8.0
+791.0239132027855 5961.81201171875 4.5345458984375 8.0
+791.0443471995313 5954.587890625 4.534562587738037 8.0
+791.0647812966272 5954.359375 4.5346360206604 8.0
+791.0852154940658 5945.84765625 4.533395767211914 8.0
+791.1056495917437 5951.80615234375 4.534147262573242 8.0
+791.1260836898873 5955.69189453125 4.534463405609131 8.0
+791.1465177882565 5946.021484375 4.534124851226807 8.0
+791.1669518869821 5942.30908203125 4.534045696258545 8.0
+791.187385986057 5958.60888671875 4.534358501434326 8.0
+791.2078200853575 5950.83154296875 4.533102989196777 8.0
+791.2282541851309 5950.31005859375 4.534028053283691 8.0
+791.2486883851379 5954.98583984375 4.533547878265381 8.0
+791.2691223854854 5954.98876953125 4.533631324768066 8.0
+791.3099906872376 5962.40869140625 4.535445690155029 8.0
+791.3304246885236 5958.38427734375 4.534483432769775 8.0
+791.3508588902769 5954.75390625 4.534316539764404 8.0
+791.3917269945887 5953.267578125 4.533698558807373 8.0
+791.4121611972732 5946.9755859375 4.533270359039307 8.0
+791.4325952002982 5947.92431640625 4.5340118408203125 8.0
+791.4530293035641 5947.19970703125 4.532523155212402 8.0
+791.47346350718 5939.53173828125 4.534368991851807 8.0
+791.5143317155671 5944.57080078125 4.532322883605957 8.0
+791.5347658201135 5956.7265625 4.535167217254639 8.0
+791.5960681359575 5949.29296875 4.533993721008301 8.0
+791.6165022418936 5954.47314453125 4.5350518226623535 8.0
+791.6369363481863 5943.27001953125 4.5339860916137695 8.0
+791.6573704548282 5937.5390625 4.53314208984375 8.0
+791.6778046618128 5946.16259765625 4.532689094543457 8.0
+791.6982386690361 5941.90185546875 4.533147811889648 8.0
+791.7186727766093 5938.24658203125 4.532907009124756 8.0
+791.8004093101481 5937.7490234375 4.532215595245361 8.0
+791.8208434194676 5939.564453125 4.532392978668213 8.0
+791.9025798595321 5940.87939453125 4.532468318939209 8.0
+791.9434480815398 5932.12353515625 4.532244682312012 8.0
+791.9638821930712 5936.3349609375 4.532094955444336 8.0
+791.9843163049445 5934.82275390625 4.532269477844238 8.0
+792.0251845295206 5936.08349609375 4.531913757324219 8.0
+792.0456186423253 5938.01513671875 4.532787322998047 8.0
+792.0864868688805 5927.0390625 4.530269145965576 8.0
+792.1069209827328 5926.64453125 4.530464172363281 8.0
+792.1273551968261 5933.701171875 4.531761169433594 8.0
+792.1477892112671 5932.705078125 4.530689239501953 8.0
+792.1682233260508 5928.88232421875 4.531348705291748 8.0
+792.1886575410754 5938.16845703125 4.531911373138428 8.0
+792.2090915565641 5921.7314453125 4.530905246734619 8.0
+792.2295256722791 5929.71044921875 4.531688690185547 8.0
+792.2499598883514 5925.74609375 4.5320210456848145 8.0
+792.2703939046551 5925.095703125 4.529947757720947 8.0
+792.2908281214186 5937.251953125 4.532715320587158 8.0
+792.3112622384215 5915.81591796875 4.529138088226318 8.0
+792.3316963557736 5919.68359375 4.530311107635498 8.0
+792.3521304734677 5916.7802734375 4.529500484466553 8.0
+792.3725645915183 5923.2060546875 4.530295372009277 8.0
+792.3929987097945 5931.7333984375 4.531667709350586 8.0
+792.4134328285436 5924.65185546875 4.530821323394775 8.0
+792.4338669475255 5914.0283203125 4.529691219329834 8.0
+792.4543011668502 5916.15966796875 4.529255390167236 8.0
+792.4747352864142 5915.54150390625 4.5301079750061035 8.0
+792.4951693064431 5912.515625 4.528247833251953 8.0
+792.5156035266991 5923.60009765625 4.530498504638672 8.0
+792.5360376473109 5915.97607421875 4.5293989181518555 8.0
+792.5564716682711 5919.56640625 4.5295796394348145 8.0
+792.5769058894584 5915.5107421875 4.5295281410217285 8.0
+792.5973400111179 5914.15771484375 4.529099464416504 8.0
+792.6177740330095 5919.3203125 4.529658794403076 8.0
+792.679076500659 5910.3505859375 4.52967643737793 8.0
+792.6995106238246 5905.82568359375 4.528361797332764 8.0
+792.719944647346 5921.5849609375 4.530019283294678 8.0
+792.7403788712181 5903.03173828125 4.527565956115723 8.0
+792.7812470198842 5901.08203125 4.52792501449585 8.0
+792.8016812446876 5908.72998046875 4.527528762817383 8.0
+792.8221153698323 5913.51513671875 4.529063701629639 8.0
+792.8425495953343 5913.728515625 4.52888298034668 8.0
+792.9038519735768 5906.9462890625 4.527922630310059 8.0
+792.9242860003578 5905.96240234375 4.528194427490234 8.0
+792.9447201274816 5902.73193359375 4.527914524078369 8.0
+792.9651543548462 5895.35546875 4.52576208114624 8.0
+792.9855884825593 5902.9677734375 4.526968955993652 8.0
+793.0060225106135 5902.619140625 4.527434825897217 8.0
+793.0264567390259 5897.68115234375 4.525761127471924 8.0
+793.0468908676703 5899.16015625 4.526798248291016 8.0
+793.0673249966567 5895.09814453125 4.527349472045898 8.0
+793.0877591259996 5897.9873046875 4.526834487915039 8.0
+793.1081932556917 5892.904296875 4.526681423187256 8.0
+793.1286274856102 5896.1083984375 4.527012825012207 8.0
+793.1490615160001 5901.2275390625 4.52706241607666 8.0
+793.1694956466235 5896.7734375 4.526722431182861 8.0
+793.1899298774733 5893.6220703125 4.526909351348877 8.0
+793.2103639087945 5886.123046875 4.525817394256592 8.0
+793.2307981403428 5889.296875 4.526391506195068 8.0
+793.2512322722469 5894.10546875 4.525888919830322 8.0
+793.2716663044994 5885.296875 4.525789737701416 8.0
+793.2921005371027 5883.18994140625 4.525831699371338 8.0
+793.31253456993 5892.6611328125 4.527180194854736 8.0
+793.3329687031146 5892.0439453125 4.52629280090332 8.0
+793.3534029366419 5896.09130859375 4.527284145355225 8.0
+793.3738369704079 5879.33056640625 4.524935722351074 8.0
+793.3942711046402 5888.26953125 4.5259928703308105 8.0
+793.4147053391061 5896.19775390625 4.526728630065918 8.0
+793.4351393739125 5890.48388671875 4.525815010070801 8.0
+793.455573609077 5887.11279296875 4.525925159454346 8.0
+793.4760077444662 5889.11376953125 4.52588415145874 8.0
+793.5168760163069 5884.86669921875 4.52646541595459 8.0
+793.5373101527512 5881.67626953125 4.525314807891846 8.0
+793.557744289421 5881.517578125 4.525361061096191 8.0
+793.5781784264473 5879.93310546875 4.525379657745361 8.0
+793.5986125638155 5883.5556640625 4.525861740112305 8.0
+793.6190467015404 5887.4150390625 4.525245666503906 8.0
+793.6394809394988 5887.1787109375 4.526165008544922 8.0
+793.6599149778049 5885.06640625 4.525924205780029 8.0
+793.6803492164545 5889.1142578125 4.525693893432617 8.0
+793.7007833554599 5875.685546875 4.523865699768066 8.0
+793.72121739469 5879.8486328125 4.525816917419434 8.0
+793.7416516342782 5892.65771484375 4.5257182121276855 8.0
+793.7620857742149 5877.04296875 4.524733066558838 8.0
+793.7825198145001 5884.751953125 4.526108264923096 8.0
+793.8029540550124 5879.3466796875 4.524890422821045 8.0
+793.8233881958804 5875.2724609375 4.525306701660156 8.0
+793.8438224370911 5879.86767578125 4.525027275085449 8.0
+793.8642564786569 5885.88916015625 4.525528430938721 8.0
+793.8846906204562 5880.3388671875 4.524833679199219 8.0
+793.9051247625976 5873.16455078125 4.524464130401611 8.0
+793.9459929478253 5864.15576171875 4.523034572601318 8.0
+793.9664271910151 5870.349609375 4.523844242095947 8.0
+793.9868613344443 5872.435546875 4.52335786819458 8.0
+794.0072954782227 5865.982421875 4.522955894470215 8.0
+794.0277296222266 5872.40283203125 4.523967266082764 8.0
+794.0481637665871 5862.63671875 4.523184299468994 8.0
+794.0685980112976 5871.49169921875 4.523033142089844 8.0
+794.0890320563485 5866.41015625 4.52399206161499 8.0
+794.1299004473985 5865.54443359375 4.523160934448242 8.0
+794.1707686396039 5866.43896484375 4.523121356964111 8.0
+794.1912028862862 5857.84814453125 4.522671699523926 8.0
+794.2116370332078 5857.337890625 4.522324562072754 8.0
+794.2320711803623 5863.802734375 4.522498607635498 8.0
+794.2525053279824 5859.037109375 4.521728038787842 8.0
+794.272939475828 5861.50537109375 4.5225372314453125 8.0
+794.293373724031 5869.1806640625 4.523599624633789 8.0
+794.3138077725744 5861.92822265625 4.522811412811279 8.0
+794.3342419213586 5876.8583984375 4.523678302764893 8.0
+794.3751102200913 5882.32568359375 4.524596214294434 8.0
+794.3955444698004 5871.39794921875 4.523963928222656 8.0
+794.4159786199816 5882.28759765625 4.524258136749268 8.0
+794.4364126703877 5866.69189453125 4.523632526397705 8.0
+794.4772810721479 5858.15673828125 4.522712707519531 8.0
+794.4977151234925 5856.75927734375 4.521290302276611 8.0
+794.5385835272245 5860.2890625 4.522316932678223 8.0
+794.5590175794932 5858.3701171875 4.521592617034912 8.0
+794.57945183212 5854.2431640625 4.521013259887695 8.0
+794.5998858850944 5856.349609375 4.521698951721191 8.0
+794.6203201384124 5860.38623046875 4.522031307220459 8.0
+794.6407542919696 5858.748046875 4.522366046905518 8.0
+794.6611883458754 5855.37158203125 4.521595001220703 8.0
+794.6816226001247 5861.07763671875 4.522136211395264 8.0
+794.7020567546133 5855.345703125 4.521781921386719 8.0
+794.7224909094512 5854.82080078125 4.5219526290893555 8.0
+794.742925064631 5852.42138671875 4.520810604095459 8.0
+794.7633592201673 5856.0947265625 4.521992206573486 8.0
+794.7837933759365 5843.79541015625 4.520555019378662 8.0
+794.8042275320477 5849.34375 4.520829200744629 8.0
+794.8246616885153 5853.451171875 4.521204471588135 8.0
+794.8450959452166 5848.958984375 4.519047737121582 8.0
+794.8655301022591 5860.0234375 4.5217742919921875 8.0
+794.8859641596573 5852.31640625 4.5176215171813965 8.0
+794.9063984172899 5856.2646484375 4.521951198577881 8.0
+794.9268325753801 5850.4052734375 4.517340183258057 8.0
+794.9472666337097 5850.791015625 4.51957893371582 8.0
+794.9677008922736 5856.9853515625 4.519435882568359 8.0
+794.9881350512951 5854.2646484375 4.519864082336426 8.0
+795.0290033700512 5846.50634765625 4.517706394195557 8.0
+795.0494375300041 5853.3740234375 4.5193867683410645 8.0
+795.0698717901978 5852.98779296875 4.518322467803955 8.0
+795.0903058507392 5851.53759765625 4.518104076385498 8.0
+795.110740011507 5848.6787109375 4.517728805541992 8.0
+795.1311742727485 5851.79736328125 4.517742156982422 8.0
+795.1516083342212 5850.13671875 4.5181050300598145 8.0
+795.1924767580931 5848.67431640625 4.517440319061279 8.0
+795.2129108204972 5845.07763671875 4.51725435256958 8.0
+795.2333450831284 5856.31689453125 4.51837682723999 8.0
+795.253779146231 5855.421875 4.518424034118652 8.0
+795.294647573246 5855.2822265625 4.517902374267578 8.0
+795.3150816371635 5845.3388671875 4.51624059677124 8.0
+795.3559500660413 5843.6484375 4.516133785247803 8.0
+795.3763842310073 5847.58984375 4.517730236053467 8.0
+795.3968183961988 5836.021484375 4.516228675842285 8.0
+795.4172525617469 5851.06689453125 4.517727851867676 8.0
+795.4376867276442 5846.79248046875 4.5170464515686035 8.0
+795.4581208937743 5838.29248046875 4.516138076782227 8.0
+795.4785550602464 5859.431640625 4.518218517303467 8.0
+795.4989892270751 5843.857421875 4.517461776733398 8.0
+795.51942349413 5839.736328125 4.517196178436279 8.0
+795.53985756154 5839.0419921875 4.516402244567871 8.0
+795.5602917292999 5846.029296875 4.517110347747803 8.0
+795.5807259972862 5846.83203125 4.517047882080078 8.0
+795.6011600657439 5847.7998046875 4.5171098709106445 8.0
+795.6215943343195 5843.86474609375 4.51666784286499 8.0
+795.6420285033528 5838.6572265625 4.516460418701172 8.0
+795.6624625726254 5842.98095703125 4.517060279846191 8.0
+795.6828968422487 5841.00927734375 4.516653537750244 8.0
+795.7033310120969 5843.1494140625 4.51668119430542 8.0
+795.7237650824172 5835.12744140625 4.5161452293396 8.0
+795.7850676948874 5855.86767578125 4.5177764892578125 8.0
+795.8259360381999 5844.60791015625 4.516404628753662 8.0
+795.8463702102672 5836.52734375 4.516343116760254 8.0
+795.8668043826838 5842.95947265625 4.516946792602539 8.0
+795.907672728441 5837.23046875 4.515549659729004 8.0
+795.9281069017889 5832.6845703125 4.515405178070068 8.0
+795.9689752494087 5831.56103515625 4.514847755432129 8.0
+795.9894094236879 5842.15380859375 4.516607284545898 8.0
+796.0098436983099 5840.62255859375 4.515653610229492 8.0
+796.0302777731704 5847.63037109375 4.517238140106201 8.0
+796.0711462239342 5844.376953125 4.516971588134766 8.0
+796.0915803997268 5841.87744140625 4.516682147979736 8.0
+796.1120144758679 5839.13134765625 4.515781402587891 8.0
+796.1324487523525 5840.4326171875 4.516200065612793 8.0
+796.1528829290764 5841.88330078125 4.515997409820557 8.0
+796.1733172061504 5833.81396484375 4.515374660491943 8.0
+796.21418546122 5832.703125 4.515073299407959 8.0
+796.234619739218 5842.5146484375 4.515648365020752 8.0
+796.2550538174546 5829.34619140625 4.514814853668213 8.0
+796.2754879961576 5833.39208984375 4.5150346755981445 8.0
+796.2959222750942 5842.17919921875 4.515716075897217 8.0
+796.3163563542548 5835.60400390625 4.515285015106201 8.0
+796.3367905337727 5839.5634765625 4.5160417556762695 8.0
+796.3572248136334 5842.11767578125 4.516299247741699 8.0
+796.377658893849 5835.53759765625 4.5156025886535645 8.0
+796.4185273550975 5839.53369140625 4.515846252441406 8.0
+796.4389614361207 5848.60986328125 4.516979694366455 8.0
+796.4593957176185 5845.95751953125 4.516012191772461 8.0
+796.479829899341 5839.9658203125 4.515968322753906 8.0
+796.5002639813029 5841.48828125 4.515450954437256 8.0
+796.5615666291633 5831.2939453125 4.5152812004089355 8.0
+796.5820008125229 5843.66796875 4.516265869140625 8.0
+796.6024349959916 5841.36572265625 4.51577091217041 8.0
+796.6228691799333 5846.77294921875 4.516394138336182 8.0
+796.6433033641079 5838.998046875 4.515849590301514 8.0
+796.6637375485079 5841.853515625 4.515522480010986 8.0
+796.7046059184868 5839.716796875 4.515609264373779 8.0
+796.7250401038182 5845.4091796875 4.516397953033447 8.0
+796.7454743896233 5849.3955078125 4.516590118408203 8.0
+796.7659084755433 5851.611328125 4.51640510559082 8.0
+796.7863427619232 5847.48095703125 4.516472339630127 8.0
+796.8067769485424 5839.001953125 4.515310764312744 8.0
+796.8272110355101 5849.5185546875 4.516724109649658 8.0
+796.8476453227049 5838.11279296875 4.514915466308594 8.0
+796.8680795102555 5843.37255859375 4.515684604644775 8.0
+796.8885135981545 5848.4873046875 4.51615047454834 8.0
+796.9089478863971 5840.90673828125 4.515685081481934 8.0
+796.929382074879 5843.509765625 4.5157623291015625 8.0
+796.9498163635872 5840.72705078125 4.515507698059082 8.0
+796.9702504527668 5847.8154296875 4.515973091125488 8.0
+796.99068464218 5843.333984375 4.5159525871276855 8.0
+797.0111189318268 5848.9033203125 4.516487121582031 8.0
+797.031553021814 5846.6943359375 4.516439437866211 8.0
+797.0519872121586 5848.8154296875 4.516658306121826 8.0
+797.0724214027359 5841.48486328125 4.5158538818359375 8.0
+797.0928555937717 5841.47265625 4.515538692474365 8.0
+797.1132897849311 5850.40869140625 4.516672134399414 8.0
+797.1337239765562 5845.51318359375 4.515753746032715 8.0
+797.1541581684069 5843.72265625 4.515915870666504 8.0
+797.1745924604984 5852.24072265625 4.516945838928223 8.0
+797.1950265529376 5849.591796875 4.516574859619141 8.0
+797.2154607457196 5847.35498046875 4.516287803649902 8.0
+797.2358950388589 5848.73876953125 4.516414642333984 8.0
+797.2563292322302 5838.38525390625 4.515125274658203 8.0
+797.2767633259427 5848.97021484375 4.516498565673828 8.0
+797.2971976198969 5852.39111328125 4.516760349273682 8.0
+797.3176318141923 5840.70751953125 4.51584529876709 8.0
+797.3380660088442 5839.11572265625 4.515424728393555 8.0
+797.3585002037289 5845.4228515625 4.515805721282959 8.0
+797.3789343989629 5840.64794921875 4.515091896057129 8.0
+797.3993686944232 5844.453125 4.51589298248291 8.0
+797.4198027902385 5850.06787109375 4.516303539276123 8.0
+797.4402369863965 5849.63427734375 4.516035079956055 8.0
+797.4606712827954 5848.37890625 4.51578950881958 8.0
+797.5015395766386 5849.18701171875 4.5159454345703125 8.0
+797.5219738739615 5847.09619140625 4.515224933624268 8.0
+797.5424079716395 5859.91064453125 4.51711368560791 8.0
+797.5628422695445 5848.328125 4.515842914581299 8.0
+797.5832764678053 5843.833984375 4.515042304992676 8.0
+797.6037105664145 5847.56298828125 4.515344619750977 8.0
+797.6241448652509 5857.859375 4.516572952270508 8.0
+797.644579064443 5851.09326171875 4.515674114227295 8.0
+797.6650131638671 5854.12744140625 4.515707492828369 8.0
+797.7058816637582 5853.60498046875 4.515697002410889 8.0
+797.7263158641144 5860.34130859375 4.516136169433594 8.0
+797.7467500648127 5848.9091796875 4.51485013961792 8.0
+797.7671842658674 5856.0869140625 4.515771389007568 8.0
+797.787618467155 5855.923828125 4.514861583709717 8.0
+797.8080526687845 5855.5849609375 4.516158580780029 8.0
+797.8284868706542 5856.8544921875 4.515737056732178 8.0
+797.848921072873 5857.8212890625 4.51627254486084 8.0
+797.8693552753175 5860.5986328125 4.515814304351807 8.0
+797.8897894781185 5854.43798828125 4.515182971954346 8.0
+797.9102237812695 5859.060546875 4.516191482543945 8.0
+797.9306578846445 5857.94921875 4.5161309242248535 8.0
+797.9510921883775 5859.89111328125 4.515869617462158 8.0
+797.971526392459 5859.5810546875 4.51578426361084 8.0
+798.0123948014298 5859.77783203125 4.515838623046875 8.0
+798.0328290063262 5855.4248046875 4.515705108642578 8.0
+798.0532631115639 5853.3740234375 4.514920234680176 8.0
+798.0736974171596 5860.86376953125 4.515862464904785 8.0
+798.0941316229873 5862.06201171875 4.515559673309326 8.0
+798.1145659290414 5860.0791015625 4.516059398651123 8.0
+798.1350000355669 5856.0322265625 4.515070915222168 8.0
+798.155434242326 5854.81591796875 4.515286922454834 8.0
+798.1758685493114 5853.5498046875 4.514796257019043 8.0
+798.1963026566518 5866.99267578125 4.516486167907715 8.0
+798.2167368643422 5863.59228515625 4.516322135925293 8.0
+798.237171172259 5871.875 4.516813278198242 8.0
+798.2576052805307 5856.4306640625 4.515263557434082 8.0
+798.278039489036 5860.92236328125 4.5151753425598145 8.0
+798.2984737978841 5860.84814453125 4.515832424163818 8.0
+798.3189079070871 5853.55322265625 4.515131950378418 8.0
+798.3393422165245 5853.60546875 4.5146613121032715 8.0
+798.3597763263024 5869.15869140625 4.516311168670654 8.0
+798.3802106363219 5856.7783203125 4.515548229217529 8.0
+798.4006448466826 5866.97509765625 4.516247272491455 8.0
+798.4210790573998 5862.2568359375 4.515490531921387 8.0
+798.441513168349 5861.96630859375 4.514766693115234 8.0
+798.4619474796491 5862.953125 4.515775680541992 8.0
+798.4823816911739 5863.35009765625 4.515430450439453 8.0
+798.5028159030553 5861.29150390625 4.515446662902832 8.0
+798.5232501151622 5861.173828125 4.515518665313721 8.0
+798.5436843276257 5864.71337890625 4.515444278717041 8.0
+798.5641186404391 5861.3046875 4.515137672424316 8.0
+798.5845527534839 5868.0693359375 4.5153703689575195 8.0
+798.6254212804997 5873.634765625 4.515881061553955 8.0
+798.6458553944685 5863.5234375 4.514812469482422 8.0
+798.6662896087946 5871.41943359375 4.516027450561523 8.0
+798.6867239233543 5874.4599609375 4.5157952308654785 8.0
+798.7071580381453 5864.65380859375 4.514908790588379 8.0
+798.74802656877 5885.6953125 4.517536163330078 8.0
+798.7684606846015 5870.43115234375 4.5146260261535645 8.0
+798.7888950006745 5873.00244140625 4.51527738571167 8.0
+798.8093292169797 5870.9033203125 4.515244483947754 8.0
+798.8501976506304 5866.2236328125 4.5142741203308105 8.0
+798.8706318678669 5862.94384765625 4.514674663543701 8.0
+798.8910661854461 5879.576171875 4.515492916107178 8.0
+798.9115003032639 5868.974609375 4.514221668243408 8.0
+798.9319345214317 5873.201171875 4.514918327331543 8.0
+798.9523688398258 5870.49755859375 4.515361309051514 8.0
+798.993237177674 5861.9716796875 4.513057708740234 8.0
+799.0136713969987 5881.89306640625 4.516106605529785 8.0
+799.0545398365939 5874.7177734375 4.515344619750977 8.0
+799.0749740568499 5877.4287109375 4.515315532684326 8.0
+799.1158425981921 5882.38427734375 4.51583194732666 8.0
+799.1362768193794 5879.125 4.515476703643799 8.0
+799.1567109408061 5876.59521484375 4.5150370597839355 8.0
+799.1771452624671 5877.7294921875 4.514989376068115 8.0
+799.1975794844693 5877.193359375 4.5146565437316895 8.0
+799.2180136068273 5879.19140625 4.515588283538818 8.0
+799.2384479294196 5881.07861328125 4.515610694885254 8.0
+799.2588821523532 5877.61279296875 4.514225006103516 8.0
+799.279316475644 5877.73779296875 4.5160112380981445 8.0
+799.2997505991661 5886.3203125 4.516315460205078 8.0
+799.3201848229146 5882.95556640625 4.5149455070495605 8.0
+799.3406191470203 5885.20361328125 4.51557731628418 8.0
+799.3814874961536 5887.40087890625 4.515310287475586 8.0
+799.4019218210742 5883.1123046875 4.515203952789307 8.0
+799.422355946459 5879.72314453125 4.5140380859375 8.0
+799.4427901720701 5881.71044921875 4.513967514038086 8.0
+799.463224497922 5892.0107421875 4.514987945556641 8.0
+799.4836586241145 5887.49365234375 4.51549768447876 8.0
+799.5040929505485 5884.17529296875 4.514566898345947 8.0
+799.524527177331 5884.83349609375 4.515275955200195 8.0
+799.5449614043391 5885.341796875 4.514036178588867 8.0
+799.5653956318201 5889.84033203125 4.51588773727417 8.0
+799.5858298594176 5890.28955078125 4.51482629776001 8.0
+799.606264087357 5886.29541015625 4.51505708694458 8.0
+799.6266983156529 5890.59228515625 4.515331268310547 8.0
+799.6471325441817 5886.77880859375 4.514451026916504 8.0
+799.6675667730524 5887.01025390625 4.514340400695801 8.0
+799.6880010021632 5894.48046875 4.515270709991455 8.0
+799.7084352316233 5889.15380859375 4.514556884765625 8.0
+799.7288694613089 5890.46044921875 4.514717102050781 8.0
+799.7493036913511 5887.248046875 4.514222621917725 8.0
+799.7697379216261 5888.306640625 4.513648986816406 8.0
+799.7901722522438 5894.052734375 4.514516353607178 8.0
+799.8514749458554 5884.43212890625 4.514193058013916 8.0
+799.8719090776431 5896.7626953125 4.514434337615967 8.0
+799.9127776421446 5893.06982421875 4.512894630432129 8.0
+799.9332117748636 5892.0595703125 4.514753341674805 8.0
+799.9536461078169 5891.11572265625 4.513457298278809 8.0
+799.974080340995 5893.49609375 4.514256477355957 8.0
+799.9945144746453 5893.1298828125 4.513619422912598 8.0
+800.0149488084135 5898.525390625 4.514898300170898 8.0
+800.0353830426393 5896.16259765625 4.514451026916504 8.0
+800.0558173769896 5894.7734375 4.514277935028076 8.0
+800.076251511804 5897.8134765625 4.514580726623535 8.0
+800.0966857468447 5894.45458984375 4.514522552490234 8.0
+800.1171200821263 5903.646484375 4.515717029571533 8.0
+800.1375542177557 5901.42236328125 4.514827251434326 8.0
+800.1579884536113 5898.3525390625 4.514486312866211 8.0
+800.1784227898243 5898.23583984375 4.5145344734191895 8.0
+800.1988570263784 5895.2451171875 4.513444423675537 8.0
+800.2192911631719 5893.4345703125 4.513748645782471 8.0
+800.2397255001997 5892.1005859375 4.512844562530518 8.0
+800.260159737576 5909.4755859375 4.514325141906738 8.0
+800.3010282132527 5902.83984375 4.514027118682861 8.0
+800.3214623514432 5902.38720703125 4.513606548309326 8.0
+800.3418966899771 5906.26318359375 4.514317035675049 8.0
+800.3623309288669 5895.38623046875 4.512811660766602 8.0
+800.3827650679887 5897.05615234375 4.512994766235352 8.0
+800.4031994073375 5904.09619140625 4.514671802520752 8.0
+800.4236336470422 5908.53173828125 4.5147271156311035 8.0
+800.4440679870895 5917.14111328125 4.515202522277832 8.0
+800.4645021273755 5906.302734375 4.514177322387695 8.0
+800.4849363680114 5896.4443359375 4.513986587524414 8.0
+800.5053707088737 5901.87109375 4.513570785522461 8.0
+800.5258048499745 5910.6513671875 4.514655590057373 8.0
+800.5462390914254 5903.41845703125 4.51314115524292 8.0
+800.566673433219 5907.9140625 4.513727188110352 8.0
+800.5871075752511 5908.16748046875 4.514323711395264 8.0
+800.6075418176333 5906.92041015625 4.514201641082764 8.0
+800.6279761602418 5898.9052734375 4.513571262359619 8.0
+800.6484103032053 5897.1044921875 4.512558460235596 8.0
+800.6688446464032 5910.8408203125 4.514358043670654 8.0
+800.6892788898258 5906.13720703125 4.513652324676514 8.0
+800.7097130337206 5911.78125 4.514460563659668 8.0
+800.7301473777334 5916.01708984375 4.515120983123779 8.0
+800.7505816220873 5911.48779296875 4.5153350830078125 8.0
+800.7710158667978 5914.65283203125 4.514797687530518 8.0
+800.8118843570264 5917.94580078125 4.515388488769531 8.0
+800.8323187025526 5915.87548828125 4.515324115753174 8.0
+800.85275284831 5912.78857421875 4.514908790588379 8.0
+800.8731870944102 5917.8369140625 4.515147686004639 8.0
+800.893621340867 5904.076171875 4.513199806213379 8.0
+800.9140555875565 5912.06494140625 4.514374732971191 8.0
+800.934489834588 5913.83203125 4.5145583152771 8.0
+800.9549241818604 5915.28857421875 4.5136919021606445 8.0
+800.9753583293641 5919.38330078125 4.513847351074219 8.0
+800.9957925772105 5911.171875 4.513971328735352 8.0
+801.0162269254142 5924.27783203125 4.514452934265137 8.0
+801.0570954225113 5917.6015625 4.514280319213867 8.0
+801.0775296715292 5909.505859375 4.513333797454834 8.0
+801.118398170489 5917.771484375 4.514599323272705 8.0
+801.1388324203217 5925.7060546875 4.516041278839111 8.0
+801.1797009209113 5921.59619140625 4.515211582183838 8.0
+801.2001351716754 5906.3671875 4.512062072753906 8.0
+801.2205695227894 5917.27685546875 4.51453971862793 8.0
+801.2410036740112 5923.04052734375 4.516125679016113 8.0
+801.2614379257066 5924.06787109375 4.514822959899902 8.0
+801.2818722775119 5922.01806640625 4.5149760246276855 8.0
+801.3023064297886 5914.05126953125 4.513942241668701 8.0
+801.3227406821825 5924.74560546875 4.51474666595459 8.0
+801.3431750350428 5922.87255859375 4.513576507568359 8.0
+801.3636091880107 5919.466796875 4.514492034912109 8.0
+801.384043441336 5936.4169921875 4.5147013664245605 8.0
+801.4044777950039 5924.185546875 4.51440954208374 8.0
+801.4249120489112 5925.1796875 4.514174938201904 8.0
+801.4453463031678 5923.166015625 4.51520299911499 8.0
+801.4657805576571 5919.40869140625 4.514082431793213 8.0
+801.486214812372 5930.52001953125 4.514999866485596 8.0
+801.5066490674435 5923.78466796875 4.513011455535889 8.0
+801.5270833228569 5924.4033203125 4.513880729675293 8.0
+801.5679518343968 5923.5625 4.5137619972229 8.0
+801.5883860906324 5929.6123046875 4.515387058258057 8.0
+801.6088204470943 5927.09765625 4.51407527923584 8.0
+801.6496888609545 5931.1953125 4.514507293701172 8.0
+801.670123218355 5935.208984375 4.5152387619018555 8.0
+801.7518601506235 5927.3681640625 4.514464855194092 8.0
+801.772294409413 5930.65185546875 4.515010356903076 8.0
+801.833597287543 5940.47216796875 4.515346527099609 8.0
+801.8949000682333 5946.79052734375 4.515263080596924 8.0
+801.915334329009 5939.193359375 4.5159525871276855 8.0
+801.9357684900169 5936.64892578125 4.515455722808838 8.0
+801.9562028514847 5940.9267578125 4.5151753425598145 8.0
+801.9766371130754 5942.7373046875 4.515054225921631 8.0
+801.9970714750161 5931.45556640625 4.5154242515563965 8.0
+802.0175056372973 5943.08935546875 4.515300750732422 8.0
+802.0379398997029 5940.55615234375 4.514162063598633 8.0
+802.058374262575 5946.16796875 4.515467643737793 8.0
+802.0788085256718 5936.79638671875 4.513945579528809 8.0
+802.099242689008 5934.67138671875 4.514798641204834 8.0
+802.1196770525712 5941.923828125 4.514822959899902 8.0
+802.1401112164895 5944.36083984375 4.515153408050537 8.0
+802.1605454807577 5946.89208984375 4.515824317932129 8.0
+802.1809798452596 5941.60546875 4.5143303871154785 8.0
+802.2014141099862 5941.48291015625 4.514283180236816 8.0
+802.2627168060426 5943.0546875 4.515605926513672 8.0
+802.2831511720578 5945.576171875 4.514975070953369 8.0
+802.3035854381887 5946.435546875 4.51496696472168 8.0
+802.3240196046609 5945.5927734375 4.515145778656006 8.0
+802.344453971491 5942.21923828125 4.5146164894104 8.0
+808.5360293126505 5878.150390625 4.18988561630249 9.0
+808.5564636612035 5878.22607421875 4.190356254577637 9.0
+808.5768980100984 5869.6220703125 4.1905598640441895 9.0
+808.597332359117 5867.1455078125 4.191582202911377 9.0
+808.6177668084856 5870.71337890625 4.192350387573242 9.0
+808.638201158079 5875.72509765625 4.194557189941406 9.0
+808.6586354079118 5878.35791015625 4.193853378295898 9.0
+808.6790698579789 5859.74951171875 4.190784931182861 9.0
+808.6995042083872 5872.16357421875 4.194784164428711 9.0
+808.7199384589185 5873.0234375 4.193302631378174 9.0
+808.7403729098005 5862.78466796875 4.194070339202881 9.0
+808.7608072609073 5873.46142578125 4.194459915161133 9.0
+808.7812415122535 5871.90576171875 4.195645809173584 9.0
+808.8016759638267 5868.14013671875 4.194239616394043 9.0
+808.8221103157557 5866.48388671875 4.193990230560303 9.0
+808.8425447678019 5868.03759765625 4.195401191711426 9.0
+808.8629790201958 5859.24853515625 4.194483757019043 9.0
+808.883413372816 5873.12744140625 4.195385456085205 9.0
+808.9038477256763 5862.0302734375 4.1959967613220215 9.0
+808.9242820788786 5862.40380859375 4.196444511413574 9.0
+808.9447164322046 5864.1806640625 4.196732997894287 9.0
+808.9855851397879 5874.603515625 4.196315765380859 9.0
+809.0060195939222 5861.7138671875 4.19594669342041 9.0
+809.0264538482952 5857.23681640625 4.195746898651123 9.0
+809.0468882028945 5859.755859375 4.197417736053467 9.0
+809.067322657851 5866.30810546875 4.197045803070068 9.0
+809.0877569129225 5848.568359375 4.194228172302246 9.0
+809.108191268344 5854.693359375 4.196370601654053 9.0
+809.1490599798781 5862.2734375 4.19736385345459 9.0
+809.1694943359907 5854.892578125 4.198400497436523 9.0
+809.1899287924607 5854.4306640625 4.196774005889893 9.0
+809.2103631490463 5854.66259765625 4.197619915008545 9.0
+809.2307975059739 5857.7685546875 4.196883678436279 9.0
+809.2512318631416 5853.17138671875 4.197812557220459 9.0
+809.2716662205421 5850.19970703125 4.197066307067871 9.0
+809.2921005781682 5851.9794921875 4.197948932647705 9.0
+809.3125349360344 5843.04150390625 4.1971116065979 9.0
+809.3329692942498 5851.58251953125 4.198109149932861 9.0
+809.3534037526915 5842.10107421875 4.197724342346191 9.0
+809.3738380112554 5841.8486328125 4.197178363800049 9.0
+809.3942724701701 5848.10107421875 4.197871208190918 9.0
+809.4147068293096 5853.21435546875 4.197324275970459 9.0
+809.4351410888048 5853.50390625 4.197314739227295 9.0
+809.455575548418 5852.21875 4.197445392608643 9.0
+809.4760099083724 5851.01171875 4.198370933532715 9.0
+809.4964441684497 5844.06591796875 4.196786880493164 9.0
+809.5168786288777 5846.556640625 4.197869300842285 9.0
+809.5373129895306 5849.857421875 4.198431491851807 9.0
+809.5577472504228 5837.17724609375 4.196990489959717 9.0
+809.5781817115494 5853.70947265625 4.199442386627197 9.0
+809.6190504346087 5835.640625 4.197254180908203 9.0
+809.6394847965494 5850.3115234375 4.199155330657959 9.0
+809.6599190587149 5836.177734375 4.197238922119141 9.0
+809.680353521122 5831.83154296875 4.196950435638428 9.0
+809.7007878837612 5838.048828125 4.1977033615112305 9.0
+809.721222246626 5834.84765625 4.198521614074707 9.0
+809.7416566097309 5827.37353515625 4.19692850112915 9.0
+809.762090973185 5840.3466796875 4.198158264160156 9.0
+809.802959700668 5841.533203125 4.200068473815918 9.0
+809.8233940648206 5834.35205078125 4.197094917297363 9.0
+809.8438285291995 5838.32763671875 4.19927978515625 9.0
+809.8642628938178 5837.56591796875 4.197707176208496 9.0
+809.8846971586681 5835.8544921875 4.1987104415893555 9.0
+809.905131623862 5831.97265625 4.1978960037231445 9.0
+809.9255659891787 5838.92138671875 4.199213981628418 9.0
+809.946000254844 5838.4228515625 4.198364734649658 9.0
+809.9664347207363 5843.30078125 4.19933557510376 9.0
+809.986869086868 5833.34228515625 4.1979217529296875 9.0
+810.0073035532259 5842.49267578125 4.1982808113098145 9.0
+810.0481721866527 5837.5556640625 4.198246955871582 9.0
+810.0890409211206 5828.32373046875 4.198487758636475 9.0
+810.1094752886493 5833.40185546875 4.19897985458374 9.0
+810.1299097565206 5830.8779296875 4.198792457580566 9.0
+810.1503440246306 5818.9833984375 4.198174476623535 9.0
+810.1707783929742 5831.09423828125 4.1982622146606445 9.0
+810.191212861544 5835.30419921875 4.1999335289001465 9.0
+810.2116471303525 5820.85498046875 4.198736667633057 9.0
+810.2320815993953 5821.52587890625 4.19779634475708 9.0
+810.2525158687786 5829.130859375 4.198576927185059 9.0
+810.2729502382863 5832.4677734375 4.199749946594238 9.0
+810.293384708144 5825.73876953125 4.197961330413818 9.0
+810.313818978233 5830.81005859375 4.1981940269470215 9.0
+810.334253348432 5827.7890625 4.198668479919434 9.0
+810.3546878189882 5825.16015625 4.1987199783325195 9.0
+810.3751221897692 5833.7568359375 4.198904037475586 9.0
+810.4159909321606 5826.23046875 4.198894023895264 9.0
+810.4568596754762 5827.47900390625 4.19856071472168 9.0
+810.4772940474286 5823.69189453125 4.198659420013428 9.0
+810.497728419723 5823.23095703125 4.198270320892334 9.0
+810.5181628922583 5828.06640625 4.199008464813232 9.0
+810.5385971649084 5817.61572265625 4.19783353805542 9.0
+810.5590315379013 5817.67529296875 4.198619842529297 9.0
+810.5794660112515 5828.9892578125 4.198329925537109 9.0
+810.5999002847166 5832.2998046875 4.19900369644165 9.0
+810.7429410058248 5825.71875 4.197593688964844 9.0
+810.7633753812697 5833.6328125 4.198881149291992 9.0
+810.7838098569482 5825.35791015625 4.198031425476074 9.0
+810.8042441328507 5817.681640625 4.197581768035889 9.0
+810.8246785089941 5818.8603515625 4.198102951049805 9.0
+810.8451129854802 5812.158203125 4.196974754333496 9.0
+810.8655472620885 5822.1650390625 4.198695182800293 9.0
+810.8859816390468 5822.58740234375 4.198876857757568 9.0
+810.9064160161215 5819.1630859375 4.198773384094238 9.0
+810.9268503935382 5826.63818359375 4.199243068695068 9.0
+810.9472847710786 5825.7578125 4.199477195739746 9.0
+810.9677191489682 5823.380859375 4.199160099029541 9.0
+810.9881535270833 5822.359375 4.199288368225098 9.0
+811.0085880054394 5822.1298828125 4.199112415313721 9.0
+811.0290222840267 5815.7509765625 4.198599338531494 9.0
+811.0494566628404 5825.82958984375 4.199188709259033 9.0
+811.0698911418949 5822.75048828125 4.199628829956055 9.0
+811.0903255211742 5827.65771484375 4.199985027313232 9.0
+811.1107598006929 5822.65380859375 4.199122428894043 9.0
+811.1311942805623 5817.0693359375 4.199195861816406 9.0
+811.1516286605474 5814.146484375 4.198453903198242 9.0
+811.1720629408737 5822.36376953125 4.198901176452637 9.0
+811.1924974213252 5817.85693359375 4.198594093322754 9.0
+811.212931802118 5823.0283203125 4.199352264404297 9.0
+811.2333662831516 5825.1494140625 4.199185371398926 9.0
+811.2538005643 5831.84228515625 4.199982166290283 9.0
+811.2742349457912 5828.087890625 4.19952917098999 9.0
+811.2946694275233 5818.00537109375 4.19984245300293 9.0
+811.3151037094867 5820.6474609375 4.200194835662842 9.0
+811.3355380916764 5818.85791015625 4.199718952178955 9.0
+811.355972574107 5821.001953125 4.1995978355407715 9.0
+811.3764068568853 5821.50048828125 4.198849678039551 9.0
+811.3968413397743 5815.4443359375 4.199495792388916 9.0
+811.4172757229026 5817.37646484375 4.199427604675293 9.0
+811.4377100062629 5818.83447265625 4.20016622543335 9.0
+811.4581444899668 5813.0107421875 4.199388027191162 9.0
+811.4785788737936 5815.94580078125 4.200191020965576 9.0
+811.4990131579689 5813.59423828125 4.200098991394043 9.0
+811.5194476423712 5824.4580078125 4.200949668884277 9.0
+811.5398819268958 5815.7802734375 4.19989538192749 9.0
+811.5603163117703 5819.6708984375 4.200394630432129 9.0
+811.5807507968711 5818.10302734375 4.200116157531738 9.0
+811.6011851820949 5815.8857421875 4.2003254890441895 9.0
+811.621619567668 5820.76318359375 4.20067834854126 9.0
+811.6420539534665 5809.92919921875 4.1991963386535645 9.0
+811.6624883395052 5818.56640625 4.200273513793945 9.0
+811.6829227257767 5819.2041015625 4.200456142425537 9.0
+811.7033571122738 5811.38671875 4.199562072753906 9.0
+811.723791499011 5822.2294921875 4.200833797454834 9.0
+811.7442259859818 5813.08203125 4.200016021728516 9.0
+811.764660273293 5814.13330078125 4.200326442718506 9.0
+811.7850947607294 5819.724609375 4.200336933135986 9.0
+811.8055291483906 5814.9013671875 4.200385570526123 9.0
+811.8259634364076 5816.15380859375 4.200456142425537 9.0
+811.8463979245425 5824.77587890625 4.201164245605469 9.0
+811.8668323129095 5821.87451171875 4.199360370635986 9.0
+811.8872666016177 5816.91748046875 4.199928283691406 9.0
+811.9077010904512 5814.85888671875 4.1996588706970215 9.0
+811.9281354796258 5819.84619140625 4.200521469116211 9.0
+811.9485697689233 5826.646484375 4.201380729675293 9.0
+811.9690042585717 5814.65283203125 4.199944972991943 9.0
+811.989438648452 5821.142578125 4.19999885559082 9.0
+812.0098731384423 5818.74462890625 4.198000907897949 9.0
+812.0303074287876 5815.34228515625 4.199219703674316 9.0
+812.0507418193592 5827.96240234375 4.201582431793213 9.0
+812.071176210171 5823.19873046875 4.2010602951049805 9.0
+812.0916106010991 5816.8017578125 4.200497627258301 9.0
+812.1120449923765 5812.009765625 4.198970794677734 9.0
+812.1324794838802 5811.2578125 4.200240612030029 9.0
+812.1529137756224 5813.9150390625 4.20073127746582 9.0
+812.1733482675918 5807.6337890625 4.197317123413086 9.0
+812.1937825597997 5806.9150390625 4.1973724365234375 9.0
+812.2142169522413 5821.52490234375 4.201080322265625 9.0
+812.2346514449091 5816.90771484375 4.1993608474731445 9.0
+812.2550858378163 5818.38037109375 4.200782775878906 9.0
+812.2755201309556 5815.31982421875 4.20055627822876 9.0
+812.2959546243219 5819.4091796875 4.200923442840576 9.0
+812.3163890179276 5820.130859375 4.201082706451416 9.0
+812.3368233117653 5818.27978515625 4.201015949249268 9.0
+812.3572578058302 5815.60400390625 4.198176383972168 9.0
+812.3776922002507 5820.08544921875 4.201402187347412 9.0
+812.3981266947885 5812.85693359375 4.197789669036865 9.0
+812.4185609895503 5819.294921875 4.198655128479004 9.0
+812.438995384553 5812.5595703125 4.199634075164795 9.0
+812.4594298797892 5828.92333984375 4.200368881225586 9.0
+812.479864175366 5820.51806640625 4.1982622146606445 9.0
+812.5002985710671 5820.0556640625 4.197998523712158 9.0
+812.5207330670019 5822.111328125 4.198214054107666 9.0
+812.541167363277 5831.357421875 4.200393199920654 9.0
+812.5616018596775 5820.95703125 4.198943614959717 9.0
+812.58203625631 5815.79345703125 4.198225021362305 9.0
+812.6024705531672 5824.677734375 4.199971675872803 9.0
+812.6229050503825 5819.73583984375 4.198983669281006 9.0
+812.6433394477135 5824.78564453125 4.202299118041992 9.0
+812.6637737452693 5817.0126953125 4.198163986206055 9.0
+812.6842082431831 5817.24755859375 4.198448181152344 9.0
+812.7046426412126 5816.94921875 4.19858980178833 9.0
+812.7250770394676 5817.58447265625 4.198647499084473 9.0
+812.7659458368071 5818.21484375 4.201889991760254 9.0
+812.786380235877 5816.9111328125 4.198425769805908 9.0
+812.8068146350706 5824.4638671875 4.1992034912109375 9.0
+812.8272490344971 5831.48291015625 4.1997199058532715 9.0
+812.8476834342655 5827.8857421875 4.199383735656738 9.0
+812.8681178341576 5835.3212890625 4.200311183929443 9.0
+812.8885522342825 5834.21630859375 4.200061798095703 9.0
+812.9089867347502 5815.66943359375 4.198270797729492 9.0
+812.92942103534 5825.423828125 4.199374198913574 9.0
+812.9498555361643 5823.24462890625 4.199335098266602 9.0
+812.9702899373297 5826.75634765625 4.199634552001953 9.0
+812.990724238618 5825.12255859375 4.199493408203125 9.0
+813.0111587401334 5821.05078125 4.19918966293335 9.0
+813.0315931420046 5825.92431640625 4.199748516082764 9.0
+813.0520274439914 5826.95166015625 4.199743747711182 9.0
+813.0724619462126 5821.19091796875 4.198685646057129 9.0
+813.0928963486585 5823.017578125 4.199431896209717 9.0
+813.1337651543727 5822.345703125 4.1993584632873535 9.0
+813.1541995575244 5824.00634765625 4.1993794441223145 9.0
+813.1746340609097 5819.953125 4.199560642242432 9.0
+813.1950683646428 5817.74169921875 4.19941520690918 9.0
+813.2155027684857 5823.07861328125 4.199575901031494 9.0
+813.2359372725696 5826.501953125 4.199978828430176 9.0
+813.2563715768774 5830.7119140625 4.20039176940918 9.0
+813.2768059814262 5824.1337890625 4.199573516845703 9.0
+813.2972404862085 5826.8955078125 4.200139045715332 9.0
+813.3176747912221 5832.583984375 4.200470924377441 9.0
+813.3381092964628 5830.98681640625 4.200314044952393 9.0
+813.3585437019428 5825.74609375 4.19982385635376 9.0
+813.3789781076484 5830.072265625 4.200404644012451 9.0
+813.3994125135941 5827.7880859375 4.199977874755859 9.0
+813.4198468197719 5827.6787109375 4.199622631072998 9.0
+813.4402812261833 5836.5634765625 4.2007951736450195 9.0
+813.460715732821 5825.5966796875 4.199716567993164 9.0
+813.481150139698 5823.61376953125 4.199845790863037 9.0
+813.5015844467998 5827.912109375 4.2001566886901855 9.0
+813.5220189541433 5826.40380859375 4.200259208679199 9.0
+813.5424533616024 5829.623046875 4.200323581695557 9.0
+813.5628878694042 5829.39892578125 4.200295925140381 9.0
+813.5833221774446 5830.62841796875 4.2006144523620605 9.0
+813.6446254028415 5835.0869140625 4.201022148132324 9.0
+813.6650598116976 5827.0771484375 4.199758052825928 9.0
+813.6854943208964 5830.69482421875 4.199864387512207 9.0
+813.7263631398891 5838.53515625 4.200839519500732 9.0
+813.7467975496693 5829.9091796875 4.19975471496582 9.0
+813.7672318596888 5835.39892578125 4.200448989868164 9.0
+813.787666370059 5837.0751953125 4.2008442878723145 9.0
+813.8081007805376 5827.90869140625 4.200203895568848 9.0
+813.8285350912556 5832.40625 4.200713634490967 9.0
+813.848969602208 5840.46240234375 4.201344013214111 9.0
+813.8694040133851 5843.05224609375 4.201569557189941 9.0
+813.8898383248015 5838.4501953125 4.201792240142822 9.0
+813.9102728364524 5838.2138671875 4.200562477111816 9.0
+813.930707248328 5834.849609375 4.200335502624512 9.0
+813.9511417604444 5841.0185546875 4.200848579406738 9.0
+813.971576072785 5836.0048828125 4.200920581817627 9.0
+813.9920104853663 5837.94677734375 4.201022148132324 9.0
+814.0124448981805 5830.90869140625 4.200031280517578 9.0
+814.0328793111112 5838.1025390625 4.200866222381592 9.0
+814.0533137243838 5832.072265625 4.200118541717529 9.0
+814.0737481378965 5843.42138671875 4.2011799812316895 9.0
+814.0941825515183 5833.94873046875 4.199915885925293 9.0
+814.1146170654974 5844.3583984375 4.201442241668701 9.0
+814.1350514795922 5843.798828125 4.201050758361816 9.0
+814.1554857940355 5848.46875 4.201410293579102 9.0
+814.1759203085894 5843.96630859375 4.200674057006836 9.0
+814.1963547233827 5845.78564453125 4.201435089111328 9.0
+814.2167890384007 5840.330078125 4.200554370880127 9.0
+814.2372235536604 5848.63671875 4.201583385467529 9.0
+814.278092284876 5846.02880859375 4.2013373374938965 9.0
+814.298526800827 5856.71240234375 4.202188968658447 9.0
+814.3189612170172 5845.5078125 4.201261520385742 9.0
+814.3393957334338 5857.61474609375 4.202611923217773 9.0
+814.3598300500889 5851.67041015625 4.201925277709961 9.0
+814.3802644668613 5858.19775390625 4.202241897583008 9.0
+814.4006989839763 5854.60400390625 4.2023725509643555 9.0
+814.4211333012136 5846.9619140625 4.201244831085205 9.0
+814.4415677188008 5853.50146484375 4.202240467071533 9.0
+814.4620022364979 5853.13427734375 4.2021565437316895 9.0
+814.4824365544337 5851.4970703125 4.202087879180908 9.0
+814.5028710727202 5848.6103515625 4.202383518218994 9.0
+814.54373990975 5849.08837890625 4.20236349105835 9.0
+814.5641743286178 5852.39306640625 4.2020745277404785 9.0
+814.5846087477112 5849.85546875 4.2025322914123535 9.0
+814.6050431670446 5857.67529296875 4.202836036682129 9.0
+814.6254775864945 5854.62890625 4.202310085296631 9.0
+814.6459120062864 5857.314453125 4.203351974487305 9.0
+814.6663464263183 5852.66357421875 4.202118396759033 9.0
+814.6867808464667 5856.51220703125 4.203237533569336 9.0
+814.7072152668406 5853.95947265625 4.203044891357422 9.0
+814.7276496875711 5855.43212890625 4.202729225158691 9.0
+814.748084108418 5857.30029296875 4.203377723693848 9.0
+814.7685185294904 5864.126953125 4.203779697418213 9.0
+814.7889530508037 5860.001953125 4.203256130218506 9.0
+814.8093873723483 5857.2822265625 4.2031450271606445 9.0
+814.8298217941192 5852.64892578125 4.204319953918457 9.0
+814.850256316131 5859.46142578125 4.203564167022705 9.0
+814.8706906382577 5856.0732421875 4.2030134201049805 9.0
+814.8911250607271 5862.39697265625 4.203034400939941 9.0
+814.9115595834373 5863.28369140625 4.203348636627197 9.0
+814.9319939062625 5863.634765625 4.203555107116699 9.0
+814.9524284293148 5866.09228515625 4.204103946685791 9.0
+814.9728628527228 5872.8193359375 4.204150676727295 9.0
+814.9932971762464 5873.08740234375 4.204427242279053 9.0
+815.0137316999972 5870.734375 4.203890800476074 9.0
+815.0341661239872 5865.8779296875 4.2033562660217285 9.0
+815.054600448093 5866.2421875 4.204596519470215 9.0
+815.0750349725422 5868.21337890625 4.204083442687988 9.0
+815.0954693972308 5863.25390625 4.20376443862915 9.0
+815.1159039220292 5873.9306640625 4.205119609832764 9.0
+815.1363382471827 5871.1298828125 4.204729080200195 9.0
+815.1567726724534 5876.9306640625 4.2052507400512695 9.0
+815.1772071979503 5874.45361328125 4.204858303070068 9.0
+815.1976415236859 5873.8603515625 4.204677104949951 9.0
+815.218075949655 5875.9755859375 4.205360412597656 9.0
+815.2385104758505 5876.9619140625 4.205183029174805 9.0
+815.2589449022853 5874.57763671875 4.204409599304199 9.0
+815.2793792289522 5884.52490234375 4.205473899841309 9.0
+815.2998137557297 5879.95703125 4.205056190490723 9.0
+815.3202480828622 5880.322265625 4.205484867095947 9.0
+815.3406826101127 5875.025390625 4.205275535583496 9.0
+815.361117037588 5879.55859375 4.205350875854492 9.0
+815.4019858932515 5877.75537109375 4.205967426300049 9.0
+815.4224203214253 5874.5078125 4.205482482910156 9.0
+815.4428546498384 5878.08056640625 4.205999851226807 9.0
+815.4632891783695 5882.09619140625 4.206176280975342 9.0
+815.4837236072417 5886.82861328125 4.2067060470581055 9.0
+815.5041581362384 5883.4609375 4.20612096786499 9.0
+815.5245924655828 5883.79736328125 4.206597805023193 9.0
+815.5450268950372 5872.525390625 4.205172538757324 9.0
+815.5654614247323 5887.88623046875 4.206625461578369 9.0
+815.5858957546588 5880.02099609375 4.205914497375488 9.0
+815.6267647150889 5882.55322265625 4.205968856811523 9.0
+815.6471990457139 5879.283203125 4.205711364746094 9.0
+815.6676334764488 5889.3994140625 4.20679235458374 9.0
+815.6880680074246 5891.2939453125 4.206648349761963 9.0
+815.7085023386317 5885.08447265625 4.206075668334961 9.0
+815.7289368700658 5887.77685546875 4.206284046173096 9.0
+815.7493713017393 5887.33203125 4.20601749420166 9.0
+815.7698057336456 5886.2421875 4.2059245109558105 9.0
+815.7902401657775 5892.0810546875 4.206568241119385 9.0
+815.8106745980331 5899.60400390625 4.20710563659668 9.0
+815.8311090305215 5894.76318359375 4.206570625305176 9.0
+815.8515434633518 5890.56689453125 4.2062554359436035 9.0
+815.8719778963059 5893.7939453125 4.206428050994873 9.0
+815.8924124294863 5891.3193359375 4.206411361694336 9.0
+815.9128468627896 5893.50390625 4.2061285972595215 9.0
+815.9332811964414 5901.16162109375 4.206978797912598 9.0
+815.9537157303275 5892.23095703125 4.206206798553467 9.0
+815.9741500643213 5894.14892578125 4.205552101135254 9.0
+815.9945844985559 5901.00146484375 4.2066144943237305 9.0
+816.0150190330169 5899.4013671875 4.206456184387207 9.0
+816.0354533677164 5907.61181640625 4.2078776359558105 9.0
+816.0558878026495 5896.70703125 4.206575393676758 9.0
+816.0763223378162 5899.0400390625 4.206892967224121 9.0
+816.0967566730906 5894.24267578125 4.206621170043945 9.0
+816.1171912086065 5895.240234375 4.206533908843994 9.0
+816.1376256444637 5896.30224609375 4.207045555114746 9.0
+816.1580599804438 5889.94384765625 4.206424236297607 9.0
+816.1989289529884 5900.716796875 4.206971645355225 9.0
+816.2193632896597 5906.92822265625 4.207413196563721 9.0
+816.2397978264562 5907.97412109375 4.207063674926758 9.0
+816.2602322635939 5901.8486328125 4.206574440002441 9.0
+816.2806668008561 5907.18310546875 4.207056522369385 9.0
+816.3011011383496 5908.30322265625 4.207701683044434 9.0
+816.3215355759603 5905.630859375 4.207174777984619 9.0
+816.3419701139137 5904.46875 4.207486152648926 9.0
+816.3624044521057 5899.4296875 4.207048416137695 9.0
+816.4032734289503 5908.19287109375 4.207753658294678 9.0
+816.4237078677252 5894.4296875 4.2067742347717285 9.0
+816.4441422067248 5902.48291015625 4.206850528717041 9.0
+816.485011185323 5910.45361328125 4.207457065582275 9.0
+816.5054456249054 5909.99462890625 4.207398891448975 9.0
+816.5258800648444 5900.39990234375 4.2064900398254395 9.0
+816.5463145048998 5915.57861328125 4.208020210266113 9.0
+816.5667489450643 5906.64599609375 4.207082748413086 9.0
+816.5871833855854 5903.5302734375 4.20702600479126 9.0
+816.6689212496422 5910.361328125 4.207838535308838 9.0
+816.6893555912029 5910.541015625 4.207571029663086 9.0
+816.7097900328881 5914.927734375 4.208273410797119 9.0
+816.7302245749161 5907.115234375 4.207395553588867 9.0
+816.7506589170662 5901.212890625 4.207190990447998 9.0
+816.7710933594499 5904.1875 4.207101821899414 9.0
+816.7915279020672 5914.33154296875 4.208243370056152 9.0
+816.8119622449085 5914.2177734375 4.208423137664795 9.0
+816.8528312311828 5903.5224609375 4.207839012145996 9.0
+816.8732655746135 5910.91162109375 4.207704067230225 9.0
+816.8937001182785 5912.92529296875 4.2088446617126465 9.0
+816.9345689062975 5923.25830078125 4.2095627784729 9.0
+816.9550034505446 5928.95849609375 4.2095465660095215 9.0
+816.9754378950165 5914.7685546875 4.207569599151611 9.0
+816.9958723397285 5922.80859375 4.20917272567749 9.0
+817.0163067846734 5919.62841796875 4.2089104652404785 9.0
+817.036741229851 5923.3564453125 4.209002494812012 9.0
+817.057175775255 5919.72216796875 4.2078752517700195 9.0
+817.0980445665336 5927.328125 4.208731174468994 9.0
+817.118479112527 5921.8828125 4.2082600593566895 9.0
+817.1389135587524 5914.51025390625 4.207682132720947 9.0
+817.1593479050935 5917.2275390625 4.208093643188477 9.0
+817.1797824516616 5916.62451171875 4.207765579223633 9.0
+817.2002168985855 5915.7685546875 4.207518100738525 9.0
+817.2206512456178 5924.8544921875 4.207677364349365 9.0
+817.2410857927753 5922.43603515625 4.20803165435791 9.0
+817.2615201402805 5925.98828125 4.208034515380859 9.0
+817.2819546878964 5923.08935546875 4.208065032958984 9.0
+817.3228234838389 5932.3212890625 4.208664417266846 9.0
+817.3432580321532 5917.2744140625 4.207465171813965 9.0
+817.3636924805905 5920.28662109375 4.207472801208496 9.0
+817.3841268293763 5926.107421875 4.208227634429932 9.0
+817.4045613782728 5914.69091796875 4.207481384277344 9.0
+817.4249958274086 5917.0732421875 4.207466125488281 9.0
+817.465864726255 5917.17333984375 4.207549095153809 9.0
+817.4862991759728 5915.48779296875 4.207376003265381 9.0
+817.5067337259243 5916.33447265625 4.206603050231934 9.0
+817.5271680760998 5917.7861328125 4.2075676918029785 9.0
+817.5476025265161 5915.3173828125 4.207355976104736 9.0
+817.5680370770497 5920.10546875 4.2078471183776855 9.0
+817.5884714278072 5931.11328125 4.20827579498291 9.0
+817.6089058788057 5933.05615234375 4.208528995513916 9.0
+817.6293404300377 5924.18310546875 4.208150863647461 9.0
+817.670209333075 5923.28466796875 4.2072062492370605 9.0
+817.6906437848884 5928.9765625 4.208118915557861 9.0
+817.7110782369273 5921.70361328125 4.2069220542907715 9.0
+817.7315126892063 5924.00390625 4.207780838012695 9.0
+817.7519471416017 5927.91015625 4.207980155944824 9.0
+817.7723815942227 5923.2216796875 4.207756042480469 9.0
+817.7928160470838 5925.07177734375 4.206902027130127 9.0
+817.8132505001777 5927.97998046875 4.2077860832214355 9.0
+817.8336850534979 5930.6396484375 4.208307266235352 9.0
+817.8541195069411 5916.80322265625 4.206875801086426 9.0
+817.8745538606163 5926.5205078125 4.208249092102051 9.0
+817.8949884145186 5918.69384765625 4.206892967224121 9.0
+817.9154227686595 5919.25537109375 4.207226753234863 9.0
+817.9358572229175 5928.42333984375 4.207979679107666 9.0
+817.9562917774019 5916.7158203125 4.206435680389404 9.0
+817.9767261321249 5929.18212890625 4.207569122314453 9.0
+818.0175951421479 5921.7333984375 4.206938743591309 9.0
+818.038029497453 5925.365234375 4.20706033706665 9.0
+818.0584640529851 5921.21533203125 4.206481456756592 9.0
+818.0788985087565 5920.2841796875 4.206076622009277 9.0
+818.0993328647601 5932.61962890625 4.207773208618164 9.0
+818.1197674208815 5913.30419921875 4.205938816070557 9.0
+818.1402018772278 5919.90966796875 4.2071380615234375 9.0
+818.1606363338142 5918.21923828125 4.207176685333252 9.0
+818.1810707905097 5910.40869140625 4.206702709197998 9.0
+818.2015052475617 5912.05712890625 4.2067484855651855 9.0
+818.2219397047302 5904.63427734375 4.205896377563477 9.0
+818.242374162015 5916.06005859375 4.206615447998047 9.0
+818.2628086196419 5915.72900390625 4.206807613372803 9.0
+818.2832431773932 5909.4560546875 4.205554485321045 9.0
+818.3036776353692 5914.5068359375 4.206084251403809 9.0
+818.3241119935847 5920.765625 4.206493377685547 9.0
+818.3445465519762 5917.5224609375 4.206550121307373 9.0
+818.3649810105926 5925.171875 4.206643581390381 9.0
+818.3854153693901 5915.10400390625 4.2066240310668945 9.0
+818.405849928422 5911.59375 4.206538200378418 9.0
+818.4262843876204 5911.904296875 4.206657409667969 9.0
+818.4467188470007 5919.724609375 4.2072858810424805 9.0
+818.4671533066139 5915.5732421875 4.206785678863525 9.0
+818.4875877664526 5911.3544921875 4.206075668334961 9.0
+818.5080222264733 5912.17724609375 4.206562042236328 9.0
+818.5284566867267 5920.96484375 4.2068772315979 9.0
+818.5693256077502 5920.59228515625 4.20643424987793 9.0
+818.5897600685857 5911.7099609375 4.205639362335205 9.0
+818.6101944295951 5911.38330078125 4.205773830413818 9.0
+818.6306289908316 5910.31591796875 4.205489635467529 9.0
+818.6510634523074 5906.4033203125 4.204902172088623 9.0
+818.6714980139514 5909.1806640625 4.205631732940674 9.0
+818.6919323757757 5907.62744140625 4.205628395080566 9.0
+818.7123668378335 5911.671875 4.205661296844482 9.0
+818.7328014000595 5902.05810546875 4.204983234405518 9.0
+818.7736702251641 5905.7041015625 4.20512056350708 9.0
+818.7941047879722 5898.3837890625 4.204742431640625 9.0
+818.8145392510196 5904.7890625 4.205502986907959 9.0
+818.8349737142998 5899.70166015625 4.204714298248291 9.0
+818.8554081777474 5903.38623046875 4.204362869262695 9.0
+818.875842641377 5905.8115234375 4.205091953277588 9.0
+818.8962771052393 5903.25341796875 4.204522609710693 9.0
+818.9167115693272 5913.3134765625 4.205860137939453 9.0
+818.9371460335387 5910.7822265625 4.205732345581055 9.0
+818.9575804979831 5901.79150390625 4.203985214233398 9.0
+818.9780149626531 5903.2705078125 4.204803466796875 9.0
+818.998449427505 5901.17529296875 4.204357624053955 9.0
+819.0188839925831 5911.1171875 4.204751491546631 9.0
+819.0393183578417 5898.431640625 4.203908920288086 9.0
+819.0597529232764 5891.5859375 4.203675746917725 9.0
+819.0801872889424 5894.79052734375 4.203366279602051 9.0
+819.1006217547765 5907.06787109375 4.2045464515686035 9.0
+819.1414906870923 5898.35009765625 4.204409122467041 9.0
+819.1619251535158 5892.13525390625 4.203098773956299 9.0
+819.1823597201728 5892.53076171875 4.203550815582275 9.0
+819.202794087003 5895.08837890625 4.203525543212891 9.0
+819.2232286540602 5887.7392578125 4.202676296234131 9.0
+819.2845320564084 5905.52490234375 4.204451560974121 9.0
+819.304966524287 5901.39404296875 4.203793048858643 9.0
+819.3254008922813 5895.55908203125 4.203653812408447 9.0
+819.3458354605609 5896.486328125 4.203641414642334 9.0
+819.3662699289634 5896.88330078125 4.203493118286133 9.0
+819.3867043975915 5888.56005859375 4.202682018280029 9.0
+819.4071388664597 5892.2802734375 4.203306198120117 9.0
+819.4275733355025 5892.6318359375 4.203027248382568 9.0
+819.4480079047134 5891.22265625 4.202897071838379 9.0
+819.4684423741055 5894.97021484375 4.203092098236084 9.0
+819.4888767437296 5885.21533203125 4.203132629394531 9.0
+819.5093113135808 5892.05078125 4.203567028045654 9.0
+819.5297457836132 5882.47265625 4.202737331390381 9.0
+819.5501801538194 5889.8427734375 4.203306198120117 9.0
+819.5706147242527 5882.27197265625 4.20251989364624 9.0
+819.6114837656496 5889.009765625 4.202951431274414 9.0
+819.6319181366125 5888.6318359375 4.20220947265625 9.0
+819.6523526078672 5895.01708984375 4.20310115814209 9.0
+819.6727871792391 5891.0595703125 4.202917575836182 9.0
+819.693221550835 5877.9814453125 4.201935768127441 9.0
+819.7136560226136 5884.62060546875 4.20188045501709 9.0
+819.734090494625 5887.77294921875 4.203013896942139 9.0
+819.7749594391644 5886.255859375 4.20240592956543 9.0
+819.7953939116996 5890.43212890625 4.203112602233887 9.0
+819.8158283844605 5879.9228515625 4.2014384269714355 9.0
+819.8362629574622 5884.3662109375 4.201594829559326 9.0
+819.856697330637 5888.05029296875 4.201785564422607 9.0
+819.8771318039799 5880.1982421875 4.201166152954102 9.0
+819.8975663775054 5890.013671875 4.20202112197876 9.0
+819.9180007512623 5884.17578125 4.2016072273254395 9.0
+819.9384352251873 5880.58447265625 4.20173978805542 9.0
+820.0201732228888 5879.75439453125 4.201100826263428 9.0
+820.0406076978106 5874.6142578125 4.200484752655029 9.0
+820.0610421728998 5864.595703125 4.199792861938477 9.0
+820.081476648229 5879.61767578125 4.200883388519287 9.0
+820.1019111237256 5863.744140625 4.199663162231445 9.0
+820.1223455994041 5882.513671875 4.201373100280762 9.0
+820.1427800753154 5867.22314453125 4.199718952178955 9.0
+820.1632145513431 5870.74755859375 4.20002555847168 9.0
+820.1836491276554 5876.119140625 4.200801372528076 9.0
+820.2245180807513 5887.8984375 4.201362609863281 9.0
+820.2449525575939 5870.94775390625 4.19944953918457 9.0
+820.2653869346686 5872.7626953125 4.200085163116455 9.0
+820.2858215119122 5876.1220703125 4.199772834777832 9.0
+820.3062559893369 5877.10888671875 4.200448036193848 9.0
+820.3266903669355 5870.37353515625 4.199692726135254 9.0
+820.3471249447612 5864.80517578125 4.199090480804443 9.0
+820.367559422768 5867.10595703125 4.199462413787842 9.0
+820.3879938009486 5867.7587890625 4.199357032775879 9.0
+820.4084283793563 5867.70166015625 4.1988420486450195 9.0
+820.4288627579444 5873.02734375 4.1995625495910645 9.0
+820.4492973367087 5875.02978515625 4.199707984924316 9.0
+820.4697318156977 5866.7060546875 4.198995590209961 9.0
+820.4901661948679 5866.85791015625 4.199062347412109 9.0
+820.5106007742143 5866.92529296875 4.1989898681640625 9.0
+820.5310352537854 5863.1240234375 4.19869327545166 9.0
+820.5514697335384 5862.609375 4.198511600494385 9.0
+820.5719042134078 5852.67041015625 4.1976704597473145 9.0
+820.592338693561 5857.47412109375 4.197900295257568 9.0
+820.6127732738969 5859.83984375 4.198210716247559 9.0
+820.6332076544059 5855.48828125 4.198070526123047 9.0
+820.6536421350829 5851.94580078125 4.197505950927734 9.0
+820.6740767159426 5856.66455078125 4.197391033172607 9.0
+820.6945111970344 5857.4541015625 4.198160648345947 9.0
+820.7149455782928 5855.0703125 4.196734428405762 9.0
+820.7353801597346 5861.85205078125 4.197961807250977 9.0
+820.7558146414085 5860.23876953125 4.197803974151611 9.0
+820.776249023249 5863.400390625 4.198071002960205 9.0
+820.7966836052728 5851.2421875 4.19681978225708 9.0
+820.8171180874706 5860.1904296875 4.197125434875488 9.0
+820.8375526698946 5862.7373046875 4.196891784667969 9.0
+820.8579870524991 5851.1318359375 4.196467876434326 9.0
+820.898856118285 5849.1123046875 4.195799827575684 9.0
+820.9192905014133 5858.51416015625 4.197340965270996 9.0
+820.9601595683635 5854.22412109375 4.196533203125 9.0
+820.9805939520738 5850.19140625 4.196463108062744 9.0
+821.0010285360186 5843.990234375 4.19558572769165 9.0
+821.0214629201291 5850.921875 4.196986675262451 9.0
+821.0418974044223 5841.8291015625 4.1955366134643555 9.0
+821.0623319888837 5849.7333984375 4.195465087890625 9.0
+821.0827663735836 5846.2841796875 4.195619106292725 9.0
+821.1032008584589 5856.86767578125 4.196795463562012 9.0
+821.1236354435096 5852.53369140625 4.196603298187256 9.0
+821.1440698287843 5846.0380859375 4.195870876312256 9.0
+821.1645043141834 5847.6435546875 4.195459365844727 9.0
+821.1849388998089 5847.62451171875 4.195163726806641 9.0
+821.2053732856148 5840.94482421875 4.194954872131348 9.0
+821.246242357869 5844.50048828125 4.195384502410889 9.0
+821.2666768441923 5848.72802734375 4.1959123611450195 9.0
+821.2871113307556 5857.501953125 4.197223663330078 9.0
+821.3075458175445 5846.47705078125 4.195528507232666 9.0
+821.327980304457 5841.578125 4.195021629333496 9.0
+821.3484148916032 5848.12060546875 4.195767402648926 9.0
+821.3688492789224 5844.08203125 4.195042133331299 9.0
+821.3892838664106 5843.61669921875 4.194821357727051 9.0
+821.4097183540798 5844.55126953125 4.195107936859131 9.0
+821.4301527419739 5840.423828125 4.19436502456665 9.0
+821.4505873299931 5843.974609375 4.1942138671875 9.0
+821.4914562067279 5845.99853515625 4.195231914520264 9.0
+821.511890795322 5845.75048828125 4.19495153427124 9.0
+821.5323252841554 5837.13818359375 4.194308280944824 9.0
+821.5527596730972 5841.43701171875 4.194460391998291 9.0
+821.5731942622806 5847.17724609375 4.194727420806885 9.0
+821.5936287516961 5835.37255859375 4.19365119934082 9.0
+821.6140633412215 5834.03759765625 4.193138599395752 9.0
+821.6344977309273 5829.87548828125 4.193868160247803 9.0
+821.6549322208666 5824.4560546875 4.193727016448975 9.0
+821.6958012012619 5827.6044921875 4.193556308746338 9.0
+821.7162356917252 5839.265625 4.19413423538208 9.0
+821.736670182414 5841.236328125 4.194697856903076 9.0
+821.7571046732846 5849.22705078125 4.194758415222168 9.0
+821.7775392642725 5833.77099609375 4.193356513977051 9.0
+821.7979736554844 5834.96240234375 4.19324254989624 9.0
+821.8184081468789 5838.55712890625 4.193163871765137 9.0
+821.8388427385071 5831.14990234375 4.193454742431641 9.0
+821.8592772302436 5829.90673828125 4.192664623260498 9.0
+821.8797116222195 5826.3955078125 4.192737102508545 9.0
+821.9001462143642 5831.00439453125 4.192502975463867 9.0
+821.9205807066901 5825.53662109375 4.192794322967529 9.0
+821.9410150991898 5836.8056640625 4.193408966064453 9.0
+821.9818841847664 5829.6982421875 4.193274021148682 9.0
+822.0023186777908 5831.38671875 4.192997932434082 9.0
+822.0227531710407 5825.3173828125 4.192387580871582 9.0
+822.0431876644725 5833.80078125 4.193861484527588 9.0
+822.0636222580797 5819.62353515625 4.192410469055176 9.0
+822.0840566519182 5831.34814453125 4.193184852600098 9.0
+822.1044911458666 5836.05322265625 4.193484306335449 9.0
+822.1453601343528 5829.3203125 4.192069053649902 9.0
+822.1657946288906 5827.61767578125 4.191871166229248 9.0
+822.1862292236037 5824.7958984375 4.191997528076172 9.0
+822.20666361849 5829.71875 4.191873550415039 9.0
+822.2270982135451 5827.77294921875 4.191925525665283 9.0
+822.2475327088396 5827.8154296875 4.192060470581055 9.0
+822.2679671042424 5828.9365234375 4.192143440246582 9.0
+822.2884016998869 5835.2490234375 4.1927618980407715 9.0
+822.3088361957052 5832.18798828125 4.191243648529053 9.0
+822.3292705916392 5816.98876953125 4.190657615661621 9.0
+822.3497051878003 5820.5595703125 4.190568923950195 9.0
+822.3701395841999 5820.99462890625 4.190825462341309 9.0
+822.3905741807102 5814.5751953125 4.190657138824463 9.0
+822.4110086774017 5818.2939453125 4.1911234855651855 9.0
+822.431443174326 5812.5576171875 4.190647602081299 9.0
+822.4518776713594 5816.220703125 4.190670013427734 9.0
+822.4723121686329 5818.90966796875 4.190853595733643 9.0
+822.4927466660811 5816.87939453125 4.190745830535889 9.0
+822.5131811636384 5821.47509765625 4.191072940826416 9.0
+822.533615661494 5822.3291015625 4.1905903816223145 9.0
+822.5949191559266 5822.49951171875 4.190432548522949 9.0
+822.6357882531447 5814.78125 4.190749645233154 9.0
+822.6562226520473 5817.31787109375 4.190701007843018 9.0
+822.676657251126 5821.98046875 4.190941333770752 9.0
+822.6970917503131 5819.54638671875 4.190368175506592 9.0
+822.7175261497396 5818.00830078125 4.1908464431762695 9.0
+822.7379607493422 5822.84765625 4.191665172576904 9.0
+822.7583952491113 5823.79638671875 4.19141149520874 9.0
+822.7788298490632 5817.2412109375 4.190598964691162 9.0
+822.7992642491881 5811.32666015625 4.1901774406433105 9.0
+822.8196987495394 5815.0771484375 4.1907830238342285 9.0
+822.8401333500151 5809.87255859375 4.190173625946045 9.0
+822.8605677507221 5821.0693359375 4.191228866577148 9.0
+822.881002251539 5812.4384765625 4.189806938171387 9.0
+822.901436752596 5806.65185546875 4.190676689147949 9.0
+822.9218712537695 5813.07763671875 4.191105365753174 9.0
+822.9423057551685 5810.3994140625 4.18977165222168 9.0
+822.9627402567494 5815.2998046875 4.190005302429199 9.0
+822.9831747584467 5810.1123046875 4.189824104309082 9.0
+823.0036093604285 5812.64453125 4.1901750564575195 9.0
+823.0240437624743 5808.908203125 4.189360618591309 9.0
+823.0649128672012 5817.55615234375 4.190042495727539 9.0
+823.085347369888 5808.7001953125 4.190163612365723 9.0
+823.1057817726905 5811.0859375 4.190671920776367 9.0
+823.1262163756619 5805.7734375 4.190030097961426 9.0
+823.1466508788144 5808.88720703125 4.1902875900268555 9.0
+823.1670853821997 5807.818359375 4.190341472625732 9.0
+823.1875198856942 5807.259765625 4.18961238861084 9.0
+823.2079543893706 5809.83837890625 4.190429210662842 9.0
+823.2283889932733 5810.25732421875 4.190651893615723 9.0
+823.2488233972981 5794.986328125 4.188786506652832 9.0
+823.2692579015566 5809.162109375 4.190176010131836 9.0
+823.2896925059249 5803.6845703125 4.189865589141846 9.0
+823.3305614152559 5803.43408203125 4.189742565155029 9.0
+823.3714304253372 5807.98095703125 4.189205646514893 9.0
+823.3918650306441 5806.76318359375 4.188992977142334 9.0
+823.4122995360594 5808.3408203125 4.189517974853516 9.0
+823.4327339417141 5802.8916015625 4.189053535461426 9.0
+823.4736030534841 5815.6123046875 4.189554691314697 9.0
+823.4940374596626 5805.9013671875 4.188643455505371 9.0
+823.5144720660173 5813.984375 4.18971061706543 9.0
+823.5349065725386 5811.26806640625 4.188663959503174 9.0
+823.5553410792418 5811.43408203125 4.189019203186035 9.0
+823.5757755860614 5814.45166015625 4.189975738525391 9.0
+823.5962100931065 5815.90966796875 4.190080642700195 9.0
+823.6166446003335 5816.849609375 4.189845561981201 9.0
+823.6370791077352 5800.25146484375 4.1886186599731445 9.0
+823.657513615246 5806.92333984375 4.189001083374023 9.0
+823.6779481229969 5804.21044921875 4.18876314163208 9.0
+823.6983826309224 5807.95458984375 4.190237522125244 9.0
+823.7188171390153 5804.5146484375 4.190262317657471 9.0
+823.7392517472908 5801.1171875 4.188877582550049 9.0
+823.7801207642988 5797.8603515625 4.188804626464844 9.0
+823.8209896820699 5805.2470703125 4.189028739929199 9.0
+823.8414242911531 5809.0361328125 4.18772029876709 9.0
+823.8618588004756 5803.1923828125 4.188161373138428 9.0
+823.882293209972 5800.71533203125 4.187731742858887 9.0
+823.902727819579 5803.56005859375 4.188612937927246 9.0
+823.9435969394399 5803.68994140625 4.188591480255127 9.0
+823.9640313495765 5798.228515625 4.188473224639893 9.0
+823.9844658599468 5792.298828125 4.187788963317871 9.0
+824.0049004704342 5800.208984375 4.188824653625488 9.0
+824.0253348811457 5796.69091796875 4.188148498535156 9.0
+824.0457693919816 5800.94921875 4.189293384552002 9.0
+824.0662040029856 5801.15625 4.188913345336914 9.0
+824.0866384142282 5799.63330078125 4.188701152801514 9.0
+824.107072925588 5801.861328125 4.188840866088867 9.0
+824.1275075371232 5813.97998046875 4.189520359039307 9.0
+824.1479419488242 5803.5830078125 4.188630104064941 9.0
+824.1683765607086 5805.91357421875 4.188082695007324 9.0
+824.1888109727661 5801.35400390625 4.189033508300781 9.0
+824.2092455849925 5800.19873046875 4.18823766708374 9.0
+824.2296800974 5796.138671875 4.1876301765441895 9.0
+824.2501145099814 5796.77197265625 4.187524795532227 9.0
+824.2705490227308 5802.56982421875 4.187962532043457 9.0
+824.290983635663 5803.81005859375 4.188786506652832 9.0
+824.3114181487617 5798.3720703125 4.188554286956787 9.0
+824.3318526619842 5802.5634765625 4.18898344039917 9.0
+824.3522871754394 5808.556640625 4.1892595291137695 9.0
+824.3727216890038 5797.85009765625 4.188558578491211 9.0
+824.3931562028083 5794.318359375 4.188005447387695 9.0
+824.4135907167292 5804.83447265625 4.189512252807617 9.0
+824.4544598451466 5813.00146484375 4.189889907836914 9.0
+824.4748942595907 5804.81298828125 4.189090728759766 9.0
+824.4953287742028 5805.47607421875 4.188742637634277 9.0
+824.5157633889976 5800.578125 4.188182353973389 9.0
+824.5975013498537 5795.6396484375 4.187432289123535 9.0
+824.6179359654561 5784.34228515625 4.1867852210998535 9.0
+824.6588048972553 5787.12353515625 4.1871418952941895 9.0
+824.6792395133816 5788.43603515625 4.187955856323242 9.0
+824.699674029689 5793.0546875 4.187045574188232 9.0
+824.7201086461719 5803.6513671875 4.188272476196289 9.0
+824.7405430628205 5797.52880859375 4.187605857849121 9.0
+824.7609775796518 5793.66064453125 4.18686056137085 9.0
+824.7814121966512 5802.85888671875 4.187601089477539 9.0
+824.8018466137728 5809.74609375 4.188663959503174 9.0
+824.822281131128 5809.2353515625 4.189213752746582 9.0
+824.8427156485996 5800.3955078125 4.187992572784424 9.0
+824.8631501662385 5794.77392578125 4.187600612640381 9.0
+824.8835846840593 5789.97607421875 4.187307834625244 9.0
+824.9040192020548 5789.349609375 4.1873674392700195 9.0
+824.9244537202176 5792.8125 4.187231540679932 9.0
+824.944888338563 5796.458984375 4.188028812408447 9.0
+824.9653228570241 5804.44384765625 4.188328742980957 9.0
+824.9857572757101 5799.44970703125 4.188246726989746 9.0
+825.0061918945212 5799.392578125 4.188106060028076 9.0
+825.0266264134989 5792.87646484375 4.187137603759766 9.0
+825.0470608327159 5803.3662109375 4.1870245933532715 9.0
+825.0674954520509 5792.90771484375 4.186924934387207 9.0
+825.0879299715016 5790.87451171875 4.186911106109619 9.0
+825.1083645911785 5797.1845703125 4.187137603759766 9.0
+825.1287990109777 5799.71435546875 4.18697452545166 9.0
+825.1492335310031 5795.8232421875 4.1869964599609375 9.0
+825.169668151153 5793.07080078125 4.187051296234131 9.0
+825.190102571476 5796.8544921875 4.1871137619018555 9.0
+825.2105370919744 5799.00390625 4.187219142913818 9.0
+825.2514061334878 5796.92724609375 4.187583923339844 9.0
+825.2718406544445 5794.2626953125 4.186880111694336 9.0
+825.292275275584 5791.01171875 4.186348915100098 9.0
+825.3127096968965 5797.3125 4.187426567077637 9.0
+825.3331443183779 5797.56640625 4.187270641326904 9.0
+825.3740133618776 5799.294921875 4.187785625457764 9.0
+825.3944478838239 5789.19677734375 4.1867547035217285 9.0
+825.4148824060103 5791.97998046875 4.186825752258301 9.0
+825.4353169283131 5794.27587890625 4.1867852210998535 9.0
+825.4557514507833 5799.16015625 4.187472343444824 9.0
+825.4761859733771 5794.455078125 4.18705940246582 9.0
+825.5170550191397 5795.2783203125 4.185929298400879 9.0
+825.5374895423156 5790.64013671875 4.186097145080566 9.0
+825.598793112651 5798.306640625 4.187886714935303 9.0
+825.6396621603926 5793.9794921875 4.1872076988220215 9.0
+825.6600966844999 5786.23779296875 4.186254024505615 9.0
+825.6805313087825 5790.54833984375 4.187047004699707 9.0
+825.700965733231 5797.7255859375 4.187446117401123 9.0
+825.7214003578047 5800.0712890625 4.1879472732543945 9.0
+825.7418348826104 5798.8935546875 4.187515735626221 9.0
+825.7622693075245 5795.61474609375 4.1872477531433105 9.0
+825.7827039326221 5788.73193359375 4.18610954284668 9.0
+825.8235728832733 5790.89013671875 4.187219142913818 9.0
+825.8440075088365 5795.7890625 4.186973571777344 9.0
+825.8644420345736 5795.83447265625 4.186452865600586 9.0
+825.8848764604772 5801.427734375 4.187790393829346 9.0
+825.9053110865643 5799.65380859375 4.187028408050537 9.0
+825.9257456127671 5801.6669921875 4.186971187591553 9.0
+825.9461802391379 5793.19873046875 4.186557769775391 9.0
+825.9666146656891 5803.26611328125 4.187612533569336 9.0
+825.9870491924157 5787.9013671875 4.186559677124023 9.0
+826.0074838192522 5798.955078125 4.187868118286133 9.0
+826.0279182463273 5797.17529296875 4.18699312210083 9.0
+826.0483527734614 5796.7294921875 4.189024448394775 9.0
+826.0687874008217 5800.5693359375 4.187554836273193 9.0
+826.0892218283625 5809.33154296875 4.188414573669434 9.0
+826.1096564560139 5802.568359375 4.1874189376831055 9.0
+826.1300909838465 5801.1171875 4.187446117401123 9.0
+826.1505254118529 5800.12646484375 4.18719482421875 9.0
+826.1709600400354 5790.39208984375 4.18626594543457 9.0
+826.1913945683264 5802.9755859375 4.188045978546143 9.0
+826.2118289967984 5798.34033203125 4.187586307525635 9.0
+826.2322636254394 5794.25927734375 4.187195777893066 9.0
+826.2526981542032 5794.6064453125 4.187263488769531 9.0
+826.2731325831992 5802.05224609375 4.187920093536377 9.0
+826.2935672123131 5804.01123046875 4.188116550445557 9.0
+826.3140017415935 5794.1943359375 4.186524868011475 9.0
+826.3344363709984 5806.81884765625 4.1878180503845215 9.0
+826.3548708006274 5808.04052734375 4.188163757324219 9.0
+826.3753053303808 5805.54833984375 4.1877241134643555 9.0
+826.3957399603096 5806.94482421875 4.18739652633667 9.0
+826.4161743903533 5806.26513671875 4.1879754066467285 9.0
+826.436608920565 5805.767578125 4.1879706382751465 9.0
+826.4570435509595 5807.6337890625 4.1875224113464355 9.0
+826.4774779815198 5803.5634765625 4.18731689453125 9.0
+826.4979126122635 5809.826171875 4.188113689422607 9.0
+826.5183471431228 5801.18359375 4.187272071838379 9.0
+826.5387815740978 5811.3720703125 4.1882500648498535 9.0
+826.5592162052999 5808.66796875 4.187880516052246 9.0
+826.5796507366249 5816.38525390625 4.188624858856201 9.0
+826.6000852681173 5806.66796875 4.187066078186035 9.0
+826.6205197997915 5803.4013671875 4.186903476715088 9.0
+826.6409543315822 5804.86083984375 4.187460422515869 9.0
+826.6613888635402 5801.45751953125 4.187326908111572 9.0
+826.6818233956801 5807.26171875 4.187889575958252 9.0
+826.7022579279947 5796.83203125 4.186172962188721 9.0
+826.7226925604191 5811.50732421875 4.186465263366699 9.0
+826.7431269930239 5810.77880859375 4.1876540184021 9.0
+826.7635615258041 5812.8974609375 4.187349319458008 9.0
+826.7839961586942 5802.66552734375 4.186678886413574 9.0
+826.8044305917647 5800.27490234375 4.186167240142822 9.0
+826.8248651250105 5806.546875 4.1875104904174805 9.0
+826.8452997583663 5810.705078125 4.1878252029418945 9.0
+826.8657341919607 5815.30712890625 4.1876444816589355 9.0
+826.886168725614 5808.92822265625 4.187467098236084 9.0
+826.9066033594936 5810.17626953125 4.186865329742432 9.0
+826.9270377934954 5812.81494140625 4.18746280670166 9.0
+826.9474724276733 5809.00732421875 4.18695068359375 9.0
+826.9679069619597 5799.44970703125 4.186604976654053 9.0
+826.9883413964853 5815.69140625 4.188326835632324 9.0
+827.0087760310707 5810.5302734375 4.1879563331604 9.0
+827.0292105658809 5813.11962890625 4.188506603240967 9.0
+827.049645000814 5811.8974609375 4.187675952911377 9.0
+827.070079635916 5812.494140625 4.188493251800537 9.0
+827.0905141711992 5820.212890625 4.1889519691467285 9.0
+827.1109488065995 5820.2607421875 4.188454627990723 9.0
+827.1313832421729 5820.4619140625 4.187784671783447 9.0
+827.1518177779144 5819.5283203125 4.188096046447754 9.0
+827.1722524137804 5832.64453125 4.189742088317871 9.0
+827.192686849754 5821.3232421875 4.188065052032471 9.0
+827.2131213859684 5816.57958984375 4.187535285949707 9.0
+827.2335560223 5838.4326171875 4.190635681152344 9.0
+827.2744249954194 5833.19580078125 4.190040111541748 9.0
+827.2948596322749 5832.029296875 4.190031051635742 9.0
+827.3152941691806 5821.6806640625 4.188854694366455 9.0
+827.3357287063263 5827.62353515625 4.189413547515869 9.0
+827.3561632435885 5822.080078125 4.1886420249938965 9.0
+827.3765977810181 5819.44189453125 4.188953876495361 9.0
+827.3970323185713 5823.36572265625 4.188763618469238 9.0
+827.4174668562991 5823.087890625 4.188390254974365 9.0
+827.4379012941354 5818.60009765625 4.188203811645508 9.0
+827.4583359322132 5824.4365234375 4.1889495849609375 9.0
+827.4787704704067 5819.92236328125 4.188733100891113 9.0
+827.4992051087102 5828.85205078125 4.189196586608887 9.0
+827.519639547194 5826.6484375 4.189361095428467 9.0
+827.5400740858531 5839.265625 4.190064430236816 9.0
+827.5605087246222 5839.68603515625 4.19234037399292 9.0
+827.5809431635716 5838.265625 4.189638137817383 9.0
+827.6013777026965 5826.3896484375 4.188530445098877 9.0
+827.6218123419312 5826.16796875 4.189148426055908 9.0
+827.6422467813463 5834.8583984375 4.189281940460205 9.0
+827.6626813208786 5824.71923828125 4.188631534576416 9.0
+827.683115960579 5840.9140625 4.1902289390563965 9.0
+827.7035504004598 5837.21533203125 4.1904730796813965 9.0
+827.7239850404585 5830.8447265625 4.1896443367004395 9.0
+827.7648541209128 5830.99951171875 4.189931869506836 9.0
+827.7852886613764 5831.19970703125 4.189908027648926 9.0
+827.826157742762 5830.1748046875 4.190082550048828 9.0
+827.8670268247879 5832.96484375 4.190523147583008 9.0
+827.8874613660082 5843.158203125 4.191195487976074 9.0
+827.9487650905357 5840.78857421875 4.1912102699279785 9.0
+827.9691996323963 5838.64501953125 4.190685749053955 9.0
+827.9896340743653 5842.27880859375 4.191089630126953 9.0
+828.0100687164595 5838.74658203125 4.190768718719482 9.0
+828.0305031587268 5849.58203125 4.191496849060059 9.0
+828.0509377011622 5852.82373046875 4.192039966583252 9.0
+828.071372343722 5845.8564453125 4.191163063049316 9.0
+828.091806786455 5849.31396484375 4.191497325897217 9.0
+828.1122414292986 5855.26123046875 4.191752910614014 9.0
+828.1326759723233 5844.68701171875 4.190703868865967 9.0
+828.153110415522 5851.951171875 4.191694259643555 9.0
+828.1735450588312 5846.98095703125 4.191884994506836 9.0
+828.1939796022634 5841.1533203125 4.1913323402404785 9.0
+828.2144140459277 5845.45458984375 4.191676616668701 9.0
+828.2348486896444 5853.3076171875 4.192817687988281 9.0
+828.2552832336005 5843.794921875 4.191559314727783 9.0
+828.275717677614 5848.697265625 4.1917266845703125 9.0
+828.2961523218546 5847.4365234375 4.191178798675537 9.0
+828.3370215106916 5859.53662109375 4.192936420440674 9.0
+828.3574559553454 5848.5107421875 4.191554069519043 9.0
+828.3778905001745 5849.1103515625 4.191825866699219 9.0
+828.3983251451136 5850.01171875 4.192152976989746 9.0
+828.4187595902331 5844.2763671875 4.191717147827148 9.0
+828.4391941354697 5851.5966796875 4.192228317260742 9.0
+828.4596287808163 5853.29443359375 4.1924333572387695 9.0
+828.480063326344 5858.73681640625 4.19301700592041 9.0
+828.5004978720463 5858.927734375 4.192718982696533 9.0
+828.5209324179159 5856.7890625 4.192708969116211 9.0
+828.5822360562961 5849.80224609375 4.192663192749023 9.0
+828.6026706026969 5853.8935546875 4.193154335021973 9.0
+828.6231052492731 5852.90673828125 4.192818641662598 9.0
+828.6639742428233 5855.939453125 4.192886829376221 9.0
+828.6844087898644 5856.3466796875 4.192801475524902 9.0
+828.7048433370146 5858.2880859375 4.193164825439453 9.0
+828.7252779842893 5857.6943359375 4.19188928604126 9.0
+828.745712431737 5858.97509765625 4.19267463684082 9.0
+828.7661469792947 5862.46337890625 4.193217754364014 9.0
+828.7865816270933 5863.5 4.193398952484131 9.0
+828.8070160749485 5869.48046875 4.194037437438965 9.0
+828.8274506229718 5860.3037109375 4.192549228668213 9.0
+828.8478852711778 5861.341796875 4.192766189575195 9.0
+828.8683197194405 5868.91796875 4.193367958068848 9.0
+828.8887542679295 5875.89208984375 4.194111347198486 9.0
+828.9091889165429 5874.09033203125 4.193750858306885 9.0
+828.9296233652713 5868.83203125 4.193230628967285 9.0
+828.9500580141685 5875.71240234375 4.193430423736572 9.0
+828.9704925631886 5877.85400390625 4.1942644119262695 9.0
+828.9909271123834 5869.71044921875 4.193544864654541 9.0
+829.0113616617455 5880.166015625 4.19471549987793 9.0
+829.0317962111731 5886.52001953125 4.195332050323486 9.0
+829.0522307608335 5879.955078125 4.194403648376465 9.0
+829.072665310603 5880.19873046875 4.194665431976318 9.0
+829.0930998604963 5873.50390625 4.193869590759277 9.0
+829.1135345104994 5879.25048828125 4.1949849128723145 9.0
+829.133969060742 5877.265625 4.194250106811523 9.0
+829.1544035110419 5885.80859375 4.19473934173584 9.0
+829.174838161518 5883.59228515625 4.19486665725708 9.0
+829.1952727121607 5889.7197265625 4.195164203643799 9.0
+829.2157071629263 5882.97265625 4.194515705108643 9.0
+829.2565763649181 5882.96728515625 4.194411277770996 9.0
+829.2770108160912 5885.11474609375 4.194908142089844 9.0
+829.2974454674404 5883.93798828125 4.194625377655029 9.0
+829.317880018898 5881.2021484375 4.194173336029053 9.0
+829.3383145705375 5885.419921875 4.195018291473389 9.0
+829.3587491222861 5887.9072265625 4.195732116699219 9.0
+829.3791835741868 5884.9423828125 4.1955180168151855 9.0
+829.3996182262636 5885.61865234375 4.195456027984619 9.0
+829.4200527784269 5890.54931640625 4.195275783538818 9.0
+829.4404872307568 5888.3466796875 4.195436477661133 9.0
+829.4609218832411 5887.74267578125 4.1951494216918945 9.0
+829.4813564358628 5886.1748046875 4.194665431976318 9.0
+829.501791088609 5893.54052734375 4.195821762084961 9.0
+829.5426600945575 5887.30712890625 4.195629119873047 9.0
+829.5630947477403 5883.052734375 4.195618629455566 9.0
+829.6039637545036 5890.92138671875 4.196756362915039 9.0
+829.6243984081229 5886.30322265625 4.195721626281738 9.0
+829.644832961887 5890.25927734375 4.1955718994140625 9.0
+829.6652674157594 5895.81787109375 4.1964497566223145 9.0
+829.6857020697862 5883.6748046875 4.194994926452637 9.0
+829.7061366239577 5894.77392578125 4.195890426635742 9.0
+829.7470057327009 5881.03955078125 4.194504737854004 9.0
+829.7674402872799 5888.4443359375 4.195655822753906 9.0
+829.787874942027 5903.15185546875 4.197310924530029 9.0
+829.8083093968962 5903.79736328125 4.197083950042725 9.0
+829.8287439519117 5902.7041015625 4.1969757080078125 9.0
+829.8491786070372 5904.431640625 4.197134017944336 9.0
+829.8696130623139 5905.37841796875 4.1972222328186035 9.0
+829.8900477177667 5901.20947265625 4.196283340454102 9.0
+829.9104821732981 5899.30126953125 4.196114540100098 9.0
+829.9309167290121 5905.84814453125 4.197345733642578 9.0
+829.9513513848651 5901.025390625 4.197109222412109 9.0
+829.9717858408403 5904.673828125 4.197269916534424 9.0
+829.9922203969618 5904.22509765625 4.196741104125977 9.0
+830.0126550532295 5905.3125 4.19696044921875 9.0
+830.0330895096049 5906.54150390625 4.196630001068115 9.0
+830.0535240661338 5906.3251953125 4.196998596191406 9.0
+830.0739587228309 5908.546875 4.197494029998779 9.0
+830.094393179621 5905.83642578125 4.19768762588501 9.0
+830.1148278365872 5900.05029296875 4.196570873260498 9.0
+830.1352623936691 5909.1259765625 4.1976189613342285 9.0
+830.1556968508885 5897.126953125 4.196625709533691 9.0
+830.1761315082622 5904.88525390625 4.197351455688477 9.0
+830.1965660657443 5902.95361328125 4.197115421295166 9.0
+830.2170006233791 5906.203125 4.197124004364014 9.0
+830.2374351811595 5908.09033203125 4.197482109069824 9.0
+830.2578697390854 5898.447265625 4.196432113647461 9.0
+830.2783042971205 5897.05419921875 4.196389198303223 9.0
+830.2987388553083 5902.0283203125 4.196781635284424 9.0
+830.3191734136344 5902.44970703125 4.19685173034668 9.0
+830.3396080721141 5906.5224609375 4.197193145751953 9.0
+830.3600426306803 5903.650390625 4.197319507598877 9.0
+830.3804770894203 5899.66943359375 4.197093963623047 9.0
+830.400911748271 5906.17919921875 4.197160243988037 9.0
+830.4213463073029 5908.53662109375 4.197067737579346 9.0
+830.4417807664431 5911.26611328125 4.197062015533447 9.0
+830.4622154257086 5909.90478515625 4.196883201599121 9.0
+830.4826499851479 5916.1982421875 4.197783946990967 9.0
+830.5030846446971 5914.23779296875 4.1973137855529785 9.0
+830.5235191043685 5908.4609375 4.196908473968506 9.0
+830.5439536641861 5903.79931640625 4.196365833282471 9.0
+830.564388224142 5905.71826171875 4.196830749511719 9.0
+830.6052573444467 5919.0615234375 4.197972774505615 9.0
+830.6256919048101 5911.39697265625 4.197610378265381 9.0
+830.6461264652971 5907.75048828125 4.197171688079834 9.0
+830.666560925958 5910.04638671875 4.197420120239258 9.0
+830.6869955867005 5906.38623046875 4.196962356567383 9.0
+830.707430147595 5910.10205078125 4.197361469268799 9.0
+830.7278648086358 5901.31298828125 4.19642972946167 9.0
+830.7482992698133 5911.9609375 4.197309970855713 9.0
+830.7687338311152 5909.6494140625 4.1968584060668945 9.0
+830.7891684925635 5909.01025390625 4.196988582611084 9.0
+830.8096029541193 5910.06591796875 4.196461200714111 9.0
+830.8300375158287 5917.09423828125 4.197589874267578 9.0
+830.8504721776844 5910.25830078125 4.1966047286987305 9.0
+830.8709067396485 5916.02685546875 4.1970720291137695 9.0
+830.8913413017654 5919.3798828125 4.1976423263549805 9.0
+830.9117758639986 5914.20166015625 4.19736909866333 9.0
+830.9322104263701 5908.57275390625 4.196703910827637 9.0
+830.9526449888654 5915.33349609375 4.197418689727783 9.0
+830.9730795515061 5918.3251953125 4.197075366973877 9.0
+830.9935141142851 5911.9775390625 4.196689605712891 9.0
+831.0139487771885 5911.9384765625 4.1972479820251465 9.0
+831.0343832402359 5912.17138671875 4.19696569442749 9.0
+831.0548178033932 5905.9501953125 4.196442604064941 9.0
+831.0752524667041 5911.90625 4.197479248046875 9.0
+831.0956869301299 5916.7646484375 4.197938919067383 9.0
+831.1161215936954 5920.8427734375 4.197838306427002 9.0
+831.136556157413 5912.08837890625 4.196742534637451 9.0
+831.1569906212462 5910.07763671875 4.196030139923096 9.0
+831.1774252852192 5922.599609375 4.197133541107178 9.0
+831.2182943135267 5914.9326171875 4.196344375610352 9.0
+831.2387289779072 5920.41162109375 4.1973042488098145 9.0
+831.2591634423807 5912.8544921875 4.1968674659729 9.0
+831.2795980070005 5912.46826171875 4.196455001831055 9.0
+831.3000326717593 5919.85498046875 4.19773530960083 9.0
+831.3409018016682 5912.07763671875 4.1963982582092285 9.0
+831.3817709320938 5915.8310546875 4.19698429107666 9.0
+831.4022054974921 5921.630859375 4.196993827819824 9.0
+831.4226400630141 5912.4599609375 4.196199417114258 9.0
+831.4430746287107 5919.1767578125 4.196617126464844 9.0
+831.4635091944947 5912.0830078125 4.196170806884766 9.0
+831.4839437604169 5917.74072265625 4.1966352462768555 9.0
+831.5043784264926 5921.208984375 4.197078704833984 9.0
+831.5452474589838 5919.4873046875 4.197266101837158 9.0
+831.5656821254379 5911.4619140625 4.19648551940918 9.0
+831.5861166920295 5922.01806640625 4.197619438171387 9.0
+831.6269858255764 5904.47705078125 4.1955180168151855 9.0
+831.6474203925463 5914.978515625 4.196488857269287 9.0
+831.6678548596101 5910.43359375 4.196154594421387 9.0
+831.68828952685 5912.0400390625 4.196209907531738 9.0
+831.7087240941983 5905.29296875 4.195791244506836 9.0
+831.7291587617001 5911.396484375 4.195849895477295 9.0
+831.7700277970143 5906.32373046875 4.1955461502075195 9.0
+831.7904624648945 5911.70556640625 4.196536064147949 9.0
+831.8108969328896 5909.6416015625 4.196403980255127 9.0
+831.8313315010237 5912.13623046875 4.1963348388671875 9.0
+831.8517660692814 5907.41455078125 4.195923805236816 9.0
+831.8722006376556 5911.2578125 4.195843696594238 9.0
+831.8926353061688 5913.30908203125 4.195548057556152 9.0
+831.9130697748042 5917.052734375 4.1960530281066895 9.0
+831.9335043435567 5915.2509765625 4.195545673370361 9.0
+831.9539390124482 5920.95263671875 4.196497440338135 9.0
+831.974373481462 5924.3525390625 4.1966352462768555 9.0
+831.9948080506219 5917.01953125 4.195485591888428 9.0
+832.0152427198918 5909.57275390625 4.194706916809082 9.0
+832.0356772893138 5923.6123046875 4.196625232696533 9.0
+832.0765464284705 5919.35595703125 4.195895671844482 9.0
+832.0969809982416 5907.53173828125 4.1952972412109375 9.0
+832.1174155681583 5908.62158203125 4.1949567794799805 9.0
+832.1378501381841 5912.6826171875 4.1953325271606445 9.0
+832.1582847083337 5914.2275390625 4.1954240798950195 9.0
+832.1991538490329 5912.32275390625 4.195658206939697 9.0
+832.2604575610458 5918.90283203125 4.1958231925964355 9.0
+832.2808922319527 5908.90771484375 4.194988250732422 9.0
+832.3013268029972 5906.27294921875 4.194666862487793 9.0
+832.3217612741355 5914.6083984375 4.195352554321289 9.0
+832.3421959454499 5911.42529296875 4.195252418518066 9.0
+832.3626305168436 5902.3779296875 4.194215297698975 9.0
+832.3830649883894 5913.7451171875 4.195680141448975 9.0
+832.4034996600531 5907.22900390625 4.194614410400391 9.0
+832.4239342318542 5900.369140625 4.19407320022583 9.0
+832.4443687037783 5913.228515625 4.195834159851074 9.0
+832.4648033757912 5909.5048828125 4.194936275482178 9.0
+832.4852379479707 5898.0107421875 4.193845748901367 9.0
+832.505672520274 5909.1357421875 4.194984436035156 9.0
+832.5261070926645 5910.451171875 4.195005416870117 9.0
+832.5465415651997 5904.2099609375 4.194470405578613 9.0
+832.5874108106436 5907.6796875 4.194568157196045 9.0
+832.6078453835507 5901.8447265625 4.194255352020264 9.0
+832.6282799565815 5905.6728515625 4.194120407104492 9.0
+832.6487145297579 5910.654296875 4.194944858551025 9.0
+832.6691491030142 5903.28369140625 4.194493293762207 9.0
+832.6895837764241 5896.76611328125 4.19404935836792 9.0
+832.7100182499489 5908.33349609375 4.195234775543213 9.0
+832.7304529235844 5903.53564453125 4.19500207901001 9.0
+832.7508874973719 5902.56640625 4.194326400756836 9.0
+832.7713219712459 5902.5986328125 4.1944475173950195 9.0
+832.7917566452888 5909.68896484375 4.194766521453857 9.0
+832.8121912193965 5907.32958984375 4.194605350494385 9.0
+832.832625693678 5917.94677734375 4.195736408233643 9.0
+832.853060368041 5905.47412109375 4.194235801696777 9.0
+832.8734949425561 5892.4189453125 4.193009853363037 9.0
+832.8939296171884 5906.595703125 4.195024490356445 9.0
+832.9143640919283 5901.7763671875 4.194285869598389 9.0
+832.9347986668217 5910.32958984375 4.195165634155273 9.0
+832.955233341796 5902.99462890625 4.194099426269531 9.0
+832.9756678168924 5906.20703125 4.194022178649902 9.0
+832.9961023921351 5897.04296875 4.193026065826416 9.0
+833.0165370674949 5905.896484375 4.194001197814941 9.0
+833.0369715429915 5903.40625 4.193637371063232 9.0
+833.0574061185835 5899.712890625 4.1935811042785645 9.0
+833.0778407942853 5894.916015625 4.193436622619629 9.0
+833.0982752701384 5895.42431640625 4.193012237548828 9.0
+833.1187099461094 5890.80615234375 4.193027973175049 9.0
+833.1391444221954 5893.50341796875 4.193014621734619 9.0
+833.1595789983912 5900.93505859375 4.1936869621276855 9.0
+833.1800136747115 5893.56689453125 4.192543983459473 9.0
+833.2004481511467 5890.59033203125 4.1930084228515625 9.0
+833.2208827276918 5889.287109375 4.192441940307617 9.0
+833.2413174044195 5899.052734375 4.193578243255615 9.0
+833.2617519812047 5897.9873046875 4.193053722381592 9.0
+833.2821865581282 5899.62841796875 4.193495273590088 9.0
+833.3026211351753 5899.18310546875 4.193780422210693 9.0
+833.3230557123316 5888.98681640625 4.192572116851807 9.0
+833.3434902896115 5889.3388671875 4.19288444519043 9.0
+833.3639248670079 5900.3505859375 4.1937737464904785 9.0
+833.3843594445498 5894.5517578125 4.192790508270264 9.0
+833.4047941221725 5890.7236328125 4.192817687988281 9.0
+833.4252285999464 5892.921875 4.193460941314697 9.0
+833.4456631778303 5885.40576171875 4.192004203796387 9.0
+833.4660978558095 5883.9111328125 4.191778659820557 9.0
+833.4865323339327 5883.19921875 4.192071914672852 9.0
+833.5069670121666 5886.9365234375 4.192203998565674 9.0
+833.5274015905234 5884.12109375 4.191575050354004 9.0
+833.5478360689958 5892.220703125 4.192641735076904 9.0
+833.5682707475789 5885.021484375 4.191364765167236 9.0
+833.588705326285 5887.18359375 4.192010879516602 9.0
+833.6091398051067 5887.79833984375 4.192045211791992 9.0
+833.6500090631234 5890.58984375 4.1918559074401855 9.0
+833.6704436422951 5884.89697265625 4.1918110847473145 9.0
+833.690878221576 5881.208984375 4.191310882568359 9.0
+833.7113128009805 5882.2353515625 4.1917314529418945 9.0
+833.7317474805313 5882.896484375 4.191606521606445 9.0
+833.7521819601607 5882.318359375 4.19196081161499 9.0
+833.7930511198138 5882.4658203125 4.1918816566467285 9.0
+833.8339202799252 5888.7646484375 4.191477298736572 9.0
+833.8543548601447 5883.2509765625 4.190489292144775 9.0
+833.8747894405024 5887.6689453125 4.191340923309326 9.0
+833.8952241209554 5887.23486328125 4.191056251525879 9.0
+833.9156587015532 5886.861328125 4.190762519836426 9.0
+833.9360931822303 5882.74560546875 4.1906023025512695 9.0
+833.9565278630616 5882.87109375 4.190770149230957 9.0
+833.9769624439796 5888.15380859375 4.191408157348633 9.0
+833.9973969250059 5886.375 4.190867900848389 9.0
+834.0178316061865 5877.6611328125 4.189945697784424 9.0
+834.0382661874537 5876.4111328125 4.190314769744873 9.0
+834.0587006688293 5889.8779296875 4.191626071929932 9.0
+834.0791353503591 5873.5947265625 4.189455509185791 9.0
+834.0995699319756 5870.6728515625 4.1898274421691895 9.0
+834.1200046137019 5887.17919921875 4.1919331550598145 9.0
+834.1404390955504 5869.3271484375 4.18976354598999 9.0
+834.1608736775161 5878.3408203125 4.190806865692139 9.0
+834.1813083595916 5867.900390625 4.189764976501465 9.0
+834.2017428417894 5876.48046875 4.189659595489502 9.0
+834.2221774241043 5874.54248046875 4.189759254455566 9.0
+834.2426121065291 5873.11962890625 4.189611434936523 9.0
+834.2834812717047 5872.18017578125 4.189292907714844 9.0
+834.3039158544561 5868.740234375 4.189306259155273 9.0
+834.3243503373524 5861.7060546875 4.188708782196045 9.0
+834.3447850203374 5865.2314453125 4.189042568206787 9.0
+834.3652196034309 5866.18017578125 4.189303874969482 9.0
+834.3856541866771 5859.15869140625 4.188945293426514 9.0
+834.4060887699743 5858.541015625 4.188562393188477 9.0
+834.4265233534243 5850.228515625 4.1879963874816895 9.0
+834.4469578369899 5862.68408203125 4.188414573669434 9.0
+834.4673925206735 5872.13623046875 4.188808441162109 9.0
+834.4878271044363 5870.00146484375 4.188058853149414 9.0
+834.5286962723476 5869.60546875 4.188602924346924 9.0
+834.5695655407035 5861.81787109375 4.188154697418213 9.0
+834.5900000250549 5867.6064453125 4.188182353973389 9.0
+834.6104346095017 5872.29443359375 4.189545154571533 9.0
+834.6308692940875 5859.55615234375 4.188027381896973 9.0
+834.6513037787663 5857.853515625 4.18715763092041 9.0
+834.6717384635558 5864.30859375 4.18898868560791 9.0
+834.692173048461 5870.99267578125 4.18853235244751 9.0
+834.7126075334745 5865.51318359375 4.188663959503174 9.0
+834.7330422186133 5854.34619140625 4.1877312660217285 9.0
+834.7534768038531 5865.1513671875 4.188392162322998 9.0
+834.7739112892014 5854.71533203125 4.187099456787109 9.0
+834.7943459746602 5855.85009765625 4.188076972961426 9.0
+834.8147805602348 5847.8017578125 4.186681747436523 9.0
+834.8352150459177 5849.9404296875 4.187036991119385 9.0
+834.8556497317113 5855.052734375 4.1878862380981445 9.0
+834.8760843176206 5854.52978515625 4.188086032867432 9.0
+834.8965190036397 5849.5986328125 4.1869378089904785 9.0
+834.9169534897665 5865.22900390625 4.188442707061768 9.0
+834.9373880759958 5859.59033203125 4.188436508178711 9.0
+834.9578227623497 5848.80126953125 4.18669319152832 9.0
+834.9782572487966 5859.931640625 4.187604904174805 9.0
+834.9986918353752 5852.99755859375 4.187025547027588 9.0
+835.0191264220339 5859.02490234375 4.188430309295654 9.0
+835.0395611088315 5848.58984375 4.187186241149902 9.0
+835.0599955957296 5852.8037109375 4.187050819396973 9.0
+835.0804302827382 5854.69140625 4.187337875366211 9.0
+835.1212994570815 5855.6728515625 4.1871562004089355 9.0
+835.1417340444023 5852.78662109375 4.187027931213379 9.0
+835.1621685318387 5858.955078125 4.187585830688477 9.0
+835.1826032193931 5857.59423828125 4.1880784034729 9.0
+835.2030378070558 5843.8974609375 4.185595989227295 9.0
+835.2234722948124 5849.7626953125 4.1866655349731445 9.0
+835.2643415706698 5845.24365234375 4.186469078063965 9.0
+835.2847762587771 5847.46728515625 4.18637228012085 9.0
+835.3052107469703 5852.5859375 4.186990261077881 9.0
+835.3256453352878 5848.00390625 4.18574857711792 9.0
+835.3460800237008 5856.40576171875 4.1870341300964355 9.0
+835.3665145122213 5848.7880859375 4.186800003051758 9.0
+835.3869491008518 5851.5830078125 4.186762809753418 9.0
+835.4073837895994 5848.880859375 4.186203479766846 9.0
+835.4278182784474 5847.455078125 4.186346530914307 9.0
+835.4482528673907 5844.6376953125 4.185813903808594 9.0
+835.4686875564585 5844.9130859375 4.186217308044434 9.0
+835.4891220456193 5847.22119140625 4.186040878295898 9.0
+835.5095567349053 5847.9765625 4.186593532562256 9.0
+835.5299913242925 5846.6640625 4.186422824859619 9.0
+835.5504259137742 5850.2587890625 4.186649322509766 9.0
+835.5708605033797 5852.75048828125 4.187023162841797 9.0
+835.5912950930724 5850.73046875 4.186997890472412 9.0
+835.6117296828743 5848.82861328125 4.186978340148926 9.0
+835.6321642727999 5836.48193359375 4.185609340667725 9.0
+835.6525988628127 5835.25146484375 4.185487747192383 9.0
+835.6730334529493 5839.2509765625 4.185999870300293 9.0
+835.6934680431805 5837.7724609375 4.185922622680664 9.0
+835.713902633528 5843.228515625 4.186749458312988 9.0
+835.7343372239557 5842.77783203125 4.186530590057373 9.0
+835.754771814507 5826.072265625 4.184432506561279 9.0
+835.7752064051601 5834.35009765625 4.1854329109191895 9.0
+835.7956410959232 5835.79931640625 4.185357570648193 9.0
+835.8160755867939 5841.947265625 4.185795307159424 9.0
+835.8365101777526 5841.9267578125 4.1852498054504395 9.0
+835.8569448688213 5842.63623046875 4.184858798980713 9.0
+835.8773793600121 5845.5791015625 4.1861653327941895 9.0
+835.8978140513063 5843.2607421875 4.184775352478027 9.0
+835.9182486426798 5837.95361328125 4.184696197509766 9.0
+835.9386831341908 5844.017578125 4.185551643371582 9.0
+835.9591178257906 5837.7744140625 4.183867454528809 9.0
+835.9795524174842 5835.43017578125 4.183945655822754 9.0
+835.9999869092862 5834.9931640625 4.185171604156494 9.0
+836.0204216012062 5831.916015625 4.183799743652344 9.0
+836.04085619322 5839.58935546875 4.185336589813232 9.0
+836.0612908853436 5832.94287109375 4.1844305992126465 9.0
+836.0817253775531 5834.36669921875 4.184208393096924 9.0
+836.1021599698724 5829.27734375 4.183602333068848 9.0
+836.1225946623163 5835.20703125 4.18342399597168 9.0
+836.1634637474708 5839.2607421875 4.184690952301025 9.0
+836.1838984402202 5836.54541015625 4.183394432067871 9.0
+836.2043329330554 5830.6484375 4.182412624359131 9.0
+836.2247675260005 5831.142578125 4.183015823364258 9.0
+836.245202219041 5830.74560546875 4.182544708251953 9.0
+836.265636812197 5830.138671875 4.182338714599609 9.0
+836.2860714054477 5840.38427734375 4.183454990386963 9.0
+836.306505998793 5835.2822265625 4.183132648468018 9.0
+836.3269405922474 5835.81787109375 4.184589385986328 9.0
+836.347375185811 5840.2685546875 4.184351444244385 9.0
+836.3678097794618 5833.84619140625 4.184323310852051 9.0
+836.3882442732429 5828.77685546875 4.183192253112793 9.0
+836.4086789671055 5830.77783203125 4.182700157165527 9.0
+836.429113561062 5829.8935546875 4.183292865753174 9.0
+836.4495480551341 5832.92236328125 4.183574676513672 9.0
+836.4699827492877 5826.6875 4.182335376739502 9.0
+836.4904173435643 5838.5791015625 4.184084415435791 9.0
+836.5108520379363 5832.4013671875 4.1837477684021 9.0
+836.5312865324013 5830.6328125 4.183228969573975 9.0
+836.5517211269689 5830.9453125 4.183771133422852 9.0
+836.5721558216464 5826.0986328125 4.1825995445251465 9.0
+836.592590316417 5825.07666015625 4.182810306549072 9.0
+836.6130249113048 5824.2412109375 4.18239164352417 9.0
+836.6334596062734 5833.6416015625 4.18345308303833 9.0
+836.653894101335 5831.18212890625 4.183330535888672 9.0
+836.6743287965292 5838.0029296875 4.183635711669922 9.0
+836.6947633918026 5827.22265625 4.182196140289307 9.0
+836.7151978871698 5837.48046875 4.183021545410156 9.0
+836.735632582655 5827.6162109375 4.182572364807129 9.0
+836.7560671782339 5834.51611328125 4.1826324462890625 9.0
+836.7765017739075 5833.69970703125 4.183267593383789 9.0
+836.7969363696684 5829.60009765625 4.182868003845215 9.0
+836.8173709655384 5825.35107421875 4.1822404861450195 9.0
+836.8378055615176 5815.6796875 4.182004451751709 9.0
+836.8582401575841 5825.6005859375 4.182887077331543 9.0
+836.8786747537597 5821.986328125 4.182502269744873 9.0
+836.8991094500307 5829.63330078125 4.182568073272705 9.0
+836.919543946402 5827.45556640625 4.181981563568115 9.0
+836.9399785428541 5823.49072265625 4.181761264801025 9.0
+836.9604132394306 5824.33203125 4.181995868682861 9.0
+836.980847736093 5834.03076171875 4.182971954345703 9.0
+837.0012823328507 5829.2734375 4.1821160316467285 9.0
+837.0217170297183 5820.1884765625 4.1807708740234375 9.0
+837.0421515266717 5825.08984375 4.181450366973877 9.0
+837.0625862237357 5820.19140625 4.181207656860352 9.0
+837.0830208208863 5816.8798828125 4.18127965927124 9.0
+837.1034553181307 5824.357421875 4.182104587554932 9.0
+837.1238900154858 5821.42431640625 4.181850433349609 9.0
+837.1443246129347 5810.1455078125 4.1808576583862305 9.0
+837.1647591104775 5812.16357421875 4.180818557739258 9.0
+837.1851938081163 5815.5107421875 4.181629180908203 9.0
+837.22606290369 5821.072265625 4.181407928466797 9.0
+837.2464976016199 5814.31591796875 4.180747985839844 9.0
+837.2669321996509 5823.251953125 4.180809497833252 9.0
+837.2873668977772 5827.0498046875 4.181576728820801 9.0
+837.3078013959966 5826.3388671875 4.182158470153809 9.0
+837.3282359943187 5817.2392578125 4.179596424102783 9.0
+837.3486706927433 5823.7978515625 4.180721759796143 9.0
+837.3691051912392 5814.97802734375 4.180522441864014 9.0
+837.389539789845 5824.59814453125 4.181302070617676 9.0
+837.4099744885534 5824.61669921875 4.181559085845947 9.0
+837.4304090873557 5824.91455078125 4.181245803833008 9.0
+837.4508435862372 5819.05712890625 4.179899215698242 9.0
+837.5325820827711 5817.0712890625 4.1800856590271 9.0
+837.5530166821482 5822.55517578125 4.180253982543945 9.0
+837.5734512816125 5810.23583984375 4.180220127105713 9.0
+837.5938858811714 5810.7001953125 4.180416584014893 9.0
+837.6143204808322 5816.638671875 4.180552959442139 9.0
+837.6347550805804 5806.0986328125 4.179582118988037 9.0
+837.6756243803684 5808.626953125 4.1806321144104 9.0
+837.6960588803995 5802.3974609375 4.1800007820129395 9.0
+837.7164934805187 5812.85009765625 4.18095588684082 9.0
+837.7369281807478 5809.474609375 4.179564476013184 9.0
+837.7573626810627 5814.4921875 4.18093204498291 9.0
+837.7982319819712 5815.02490234375 4.180044174194336 9.0
+837.8186664825625 5810.17041015625 4.179391384124756 9.0
+837.8391010832493 5811.068359375 4.180493354797363 9.0
+837.8595357840459 5804.7255859375 4.1795501708984375 9.0
+837.8799702849137 5804.59033203125 4.179227828979492 9.0
+837.900404985885 5812.552734375 4.180074214935303 9.0
+837.92083958695 5800.09326171875 4.178696155548096 9.0
+837.9412741881097 5802.55615234375 4.1794281005859375 9.0
+837.9617087893494 5803.6640625 4.179080963134766 9.0
+838.002577992127 5806.5546875 4.178572177886963 9.0
+838.0230125936432 5801.03759765625 4.179327964782715 9.0
+838.0638818969819 5796.943359375 4.177967071533203 9.0
+838.0843163987738 5795.8955078125 4.179192066192627 9.0
+838.1047510006683 5802.33203125 4.178773403167725 9.0
+838.1251857026582 5801.89306640625 4.1792473793029785 9.0
+838.1456203047273 5797.3369140625 4.178762912750244 9.0
+838.1660548068976 5798.9091796875 4.178652763366699 9.0
+838.186489509164 5806.3681640625 4.179085731506348 9.0
+838.2069240115088 5809.41845703125 4.179508686065674 9.0
+838.227358613949 5808.2373046875 4.179614543914795 9.0
+838.2477933164846 5812.373046875 4.179201602935791 9.0
+838.268227819106 5809.61181640625 4.179019451141357 9.0
+838.2886625218307 5801.7119140625 4.178218841552734 9.0
+838.3090971246274 5814.2421875 4.179675579071045 9.0
+838.329531627518 5805.8310546875 4.17855167388916 9.0
+838.349966330512 5817.2607421875 4.179899215698242 9.0
+838.3704009335852 5807.63916015625 4.180168151855469 9.0
+838.390835436745 5809.9443359375 4.180410861968994 9.0
+838.4112701400154 5802.3701171875 4.179773807525635 9.0
+838.4317047433651 5805.2626953125 4.179331302642822 9.0
+838.4725739503192 5796.00634765625 4.178342819213867 9.0
+838.4930085539308 5798.12060546875 4.178595066070557 9.0
+838.5134432576524 5793.3623046875 4.178694248199463 9.0
+838.5338777614452 5800.0615234375 4.1790852546691895 9.0
+838.554312365326 5817.71533203125 4.181093692779541 9.0
+838.595181673365 5813.30419921875 4.180188179016113 9.0
+838.615616177507 5805.52734375 4.179162979125977 9.0
+838.6360508817525 5800.75390625 4.1786417961120605 9.0
+838.6564854860844 5807.40576171875 4.179321765899658 9.0
+838.6973546950103 5795.3544921875 4.177947998046875 9.0
+838.7382240042862 5801.80322265625 4.1793365478515625 9.0
+838.7586585090539 5799.27294921875 4.178775787353516 9.0
+838.779093113917 5801.73583984375 4.179899215698242 9.0
+838.799527818861 5794.59716796875 4.178619384765625 9.0
+838.8199623238906 5801.13134765625 4.178959846496582 9.0
+838.8403969290157 5802.982421875 4.1794514656066895 9.0
+838.8608315342208 5793.46435546875 4.178420066833496 9.0
+838.8812661395204 5800.0390625 4.1783976554870605 9.0
+838.9017008449082 5803.56005859375 4.1790313720703125 9.0
+838.9221353503744 5804.14208984375 4.179046630859375 9.0
+838.942569955936 5806.36962890625 4.179430961608887 9.0
+838.9630046615857 5797.578125 4.179012775421143 9.0
+838.9834391673066 5799.72314453125 4.178592681884766 9.0
+839.0038737731302 5797.64892578125 4.178603649139404 9.0
+839.0243084790418 5806.599609375 4.180231094360352 9.0
+839.0447429850174 5802.03466796875 4.179521083831787 9.0
+839.0651776911036 5796.8896484375 4.179228782653809 9.0
+839.0856122972764 5798.1806640625 4.178956508636475 9.0
+839.1060468035139 5795.54736328125 4.1793951988220215 9.0
+839.1264815098548 5794.84521484375 4.17937707901001 9.0
+839.146916116275 5798.03857421875 4.179140090942383 9.0
+839.1673507227824 5797.71826171875 4.178956508636475 9.0
+839.1877853293772 5809.9755859375 4.179948329925537 9.0
+839.208219936052 5804.1611328125 4.178964614868164 9.0
+839.2286545428142 5797.02001953125 4.177809238433838 9.0
+839.2490891496709 5809.25244140625 4.178773403167725 9.0
+839.2695237566077 5806.84326171875 4.178555965423584 9.0
+839.289958463618 5802.220703125 4.178102016448975 9.0
+839.3103930707293 5804.3583984375 4.178514003753662 9.0
+839.3308275779127 5799.37353515625 4.178432941436768 9.0
+839.3512622851922 5801.03466796875 4.178391456604004 9.0
+839.3716968925437 5802.30810546875 4.178819179534912 9.0
+839.392131399989 5791.32080078125 4.177820205688477 9.0
+839.4125661075159 5801.58056640625 4.178877830505371 9.0
+839.4330007151293 5805.96875 4.179643630981445 9.0
+839.4534354228163 5800.74462890625 4.178093910217285 9.0
+839.4738699305963 5798.36181640625 4.178415298461914 9.0
+839.4943045384643 5797.58544921875 4.178523063659668 9.0
+839.5147391464052 5800.46142578125 4.177748680114746 9.0
+839.5351737544333 5803.3916015625 4.178834915161133 9.0
+839.5556082625408 5805.37158203125 4.178935527801514 9.0
+839.5760429707443 5813.173828125 4.179600715637207 9.0
+839.5964775790198 5805.69287109375 4.178977966308594 9.0
+839.6169120873819 5805.9892578125 4.178576946258545 9.0
+839.6373467958329 5799.22216796875 4.178172588348389 9.0
+839.657781404363 5807.22216796875 4.178894996643066 9.0
+839.678216112974 5806.3818359375 4.178738117218018 9.0
+839.6986506216563 5804.234375 4.178429126739502 9.0
+839.7190852304411 5806.8935546875 4.178621768951416 9.0
+839.7395199393068 5807.5087890625 4.178853988647461 9.0
+839.7599544482437 5797.296875 4.177332401275635 9.0
+839.7803890572613 5795.76025390625 4.1775407791137695 9.0
+839.8008237663744 5807.7900390625 4.179476261138916 9.0
+839.8212583755521 5802.9365234375 4.178499698638916 9.0
+839.8416929848245 5813.40625 4.1791300773620605 9.0
+839.8621275941769 5810.296875 4.1789679527282715 9.0
+839.8825622036093 5821.2763671875 4.180190563201904 9.0
+839.9029968131217 5809.95654296875 4.178987979888916 9.0
+839.9234314227215 5813.1396484375 4.179093837738037 9.0
+839.943866032394 5812.87255859375 4.178786754608154 9.0
+839.9643007421546 5806.54248046875 4.178684711456299 9.0
+839.9847352519864 5808.5595703125 4.1785101890563965 9.0
+840.005169861899 5811.142578125 4.1791205406188965 9.0
+840.0256045719143 5803.08447265625 4.17832612991333 9.0
+840.0460390819935 5815.3056640625 4.179631233215332 9.0
+840.066473792147 5808.57763671875 4.178874492645264 9.0
+840.0869084023943 5802.46533203125 4.178355693817139 9.0
+840.1073429127136 5806.759765625 4.179062843322754 9.0
+840.1277776231072 5809.189453125 4.179813385009766 9.0
+840.1482121335866 5798.6943359375 4.178502559661865 9.0
+840.1890814547951 5801.02587890625 4.177515029907227 9.0
+840.2095159655073 5805.76513671875 4.178689956665039 9.0
+840.2299505763149 5809.73486328125 4.179172039031982 9.0
+840.250385287196 5815.15185546875 4.179394245147705 9.0
+840.2708197981483 5810.306640625 4.178636074066162 9.0
+840.2912545091822 5807.2861328125 4.17836332321167 9.0
+840.3116891203026 5808.9482421875 4.179398059844971 9.0
+840.3321236315023 5806.16259765625 4.178941249847412 9.0
+840.3525583427763 5810.84912109375 4.179013729095459 9.0
+840.413862177069 5811.69775390625 4.17889404296875 9.0
+840.434296788655 5814.7861328125 4.17935848236084 9.0
+840.4547315003365 5808.95703125 4.1788153648376465 9.0
+840.4956006239008 5816.73046875 4.180325031280518 9.0
+840.5160353358006 5813.3642578125 4.179980754852295 9.0
+840.5364699477796 5807.369140625 4.179571628570557 9.0
+840.5569044598305 5811.28857421875 4.179957389831543 9.0
+840.5773391719704 5813.88427734375 4.179307460784912 9.0
+840.5977737841749 5809.765625 4.179718494415283 9.0
+840.618208296466 5812.94677734375 4.179739475250244 9.0
+840.6386430088387 5812.6796875 4.179299354553223 9.0
+840.6590776212688 5819.166015625 4.180121898651123 9.0
+840.6795122337935 5809.75732421875 4.178818702697754 9.0
+840.6999468463982 5816.138671875 4.179612159729004 9.0
+840.7203814590612 5820.21435546875 4.180120468139648 9.0
+840.7408161718195 5821.24560546875 4.180132865905762 9.0
+840.7612506846417 5814.0859375 4.179623603820801 9.0
+840.7816852975448 5812.83154296875 4.179286479949951 9.0
+840.8021199105206 5828.21728515625 4.180996417999268 9.0
+840.8225545235764 5812.3720703125 4.17902946472168 9.0
+840.8429892367058 5816.0966796875 4.179689884185791 9.0
+840.8634237499064 5816.87841796875 4.180347919464111 9.0
+840.883858363195 5817.97998046875 4.180190086364746 9.0
+840.9042930765572 5811.81884765625 4.179636478424072 9.0
+840.9247275899834 5815.09814453125 4.179550647735596 9.0
+840.9655969170781 5823.40966796875 4.180580139160156 9.0
+840.9860315307378 5817.49072265625 4.180268287658691 9.0
+841.0064660444623 5819.345703125 4.180715560913086 9.0
+841.0269007582756 5813.5205078125 4.179312229156494 9.0
+841.0473353721682 5827.05322265625 4.180604457855225 9.0
+841.0677699861262 5821.822265625 4.1802978515625 9.0
+841.0882046001498 5822.6533203125 4.179944038391113 9.0
+841.1086392142606 5817.48974609375 4.179382801055908 9.0
+841.1290738284442 5826.9091796875 4.180778503417969 9.0
+841.1495084426933 5832.99658203125 4.181132793426514 9.0
+841.1699430570297 5821.0244140625 4.180001735687256 9.0
+841.1903777714397 5826.9521484375 4.180581569671631 9.0
+841.2108122859063 5818.2529296875 4.179766654968262 9.0
+841.2312470004617 5828.5283203125 4.180765151977539 9.0
+841.2516816150819 5831.85400390625 4.180356979370117 9.0
+841.2925508445551 5826.34716796875 4.180958271026611 9.0
+841.3129854594008 5830.12890625 4.180658340454102 9.0
+841.3334199743113 5825.02197265625 4.180758476257324 9.0
+841.3538546893178 5828.359375 4.180852890014648 9.0
+841.3742893043673 5827.1064453125 4.181214809417725 9.0
+841.3947238195033 5829.88330078125 4.180129051208496 9.0
+841.4151585347208 5840.96337890625 4.182210922241211 9.0
+841.4355931500031 5824.716796875 4.18057918548584 9.0
+841.4560277653509 5828.255859375 4.18057918548584 9.0
+841.4764623807787 5825.693359375 4.180516242980957 9.0
+841.4968968962785 5831.43701171875 4.181490898132324 9.0
+841.5377662274914 5827.888671875 4.1810150146484375 9.0
+841.5582008432102 5826.0048828125 4.18122673034668 9.0
+841.5786354589873 5832.74609375 4.18064022064209 9.0
+841.5990700748443 5831.17919921875 4.180762767791748 9.0
+841.6195047907822 5831.125 4.181114673614502 9.0
+841.6399393067768 5826.10546875 4.1805901527404785 9.0
+841.6603739228449 5837.423828125 4.181453704833984 9.0
+841.6808086389938 5830.13037109375 4.181142807006836 9.0
+841.7012432552074 5828.69091796875 4.180840492248535 9.0
+841.7216777714857 5837.79296875 4.181270599365234 9.0
+841.7421124878456 5839.90625 4.181176662445068 9.0
+841.7625471042702 5837.37939453125 4.181416034698486 9.0
+841.7829816207595 5836.9765625 4.181506156921387 9.0
+841.8034163373304 5840.54541015625 4.181811332702637 9.0
+841.8238509539733 5842.30078125 4.182280540466309 9.0
+841.8442856706897 5841.63037109375 4.1822638511657715 9.0
+841.8647201874483 5841.39599609375 4.182620525360107 9.0
+841.8851548043021 5839.99072265625 4.181955814361572 9.0
+841.9055895212223 5834.30078125 4.181584358215332 9.0
+841.9260240381991 5847.07763671875 4.182754993438721 9.0
+841.9464586552567 5841.20166015625 4.181498050689697 9.0
+841.9668933723951 5851.14697265625 4.182692050933838 9.0
+841.9873278895684 5844.6376953125 4.182685375213623 9.0
+842.0077626068378 5841.90576171875 4.182476043701172 9.0
+842.0281971241639 5842.607421875 4.182572841644287 9.0
+842.0486317415707 5845.71826171875 4.1823577880859375 9.0
+842.0895009765736 5852.623046875 4.183475494384766 9.0
+842.1099355941842 5859.22607421875 4.183575630187988 9.0
+842.130370311861 5863.69189453125 4.183445453643799 9.0
+842.1508048296091 5857.255859375 4.183123588562012 9.0
+842.1712394474234 5864.13525390625 4.184210300445557 9.0
+842.191674165304 5856.3857421875 4.183525085449219 9.0
+842.2121087832566 5850.1201171875 4.182642459869385 9.0
+842.2325434012746 5851.13818359375 4.183068752288818 9.0
+842.2529780193581 5861.08251953125 4.1842780113220215 9.0
+842.2734126374999 5856.84619140625 4.183192253112793 9.0
+842.2938472557216 5860.82373046875 4.183597087860107 9.0
+842.3142818740089 5854.69140625 4.183262825012207 9.0
+842.3347164923689 5862.5087890625 4.184210777282715 9.0
+842.3551512107952 5861.490234375 4.1842360496521 9.0
+842.3755857292708 5870.41552734375 4.185384273529053 9.0
+842.3960203478346 5853.50048828125 4.183193683624268 9.0
+842.41645506645 5867.72802734375 4.1845221519470215 9.0
+842.436889585144 5861.05615234375 4.1843390464782715 9.0
+842.4573243038903 5855.64453125 4.183166027069092 9.0
+842.4777589227306 5860.37109375 4.1838812828063965 9.0
+842.4981934416137 5860.53466796875 4.184204578399658 9.0
+842.5186281605856 5861.87158203125 4.184200763702393 9.0
+842.5390627795932 5872.69921875 4.18523645401001 9.0
+842.5594972986655 5867.93798828125 4.18499231338501 9.0
+842.5799320178194 5865.98095703125 4.184650421142578 9.0
+842.600366637038 5860.244140625 4.184165000915527 9.0
+842.6208013563446 5859.13232421875 4.184010028839111 9.0
+842.6412358756716 5859.1533203125 4.1842265129089355 9.0
+842.6616704950939 5864.341796875 4.184506416320801 9.0
+842.6821051145744 5872.37646484375 4.18520975112915 9.0
+842.7025397341058 5874.71435546875 4.185298442840576 9.0
+842.7229743537318 5868.3955078125 4.1845855712890625 9.0
+842.7434089734015 5870.17578125 4.1851091384887695 9.0
+842.7638435931367 5879.38525390625 4.186081886291504 9.0
+842.7842782129519 5878.39697265625 4.185927391052246 9.0
+842.8047128328108 5867.611328125 4.185050010681152 9.0
+842.8251474527497 5862.78076171875 4.184698104858398 9.0
+842.8455821727548 5866.9677734375 4.1846699714660645 9.0
+842.8660167928174 5871.3935546875 4.185605049133301 9.0
+842.8864513129301 5874.05126953125 4.1850361824035645 9.0
+842.9068860331245 5866.556640625 4.185069561004639 9.0
+842.9273206533762 5861.97802734375 4.184203624725342 9.0
+842.9477551736927 5867.0234375 4.185207366943359 9.0
+842.9681898940762 5864.78466796875 4.1847734451293945 9.0
+842.9886245145171 5865.7197265625 4.184750556945801 9.0
+843.0090592350389 5863.25537109375 4.184459209442139 9.0
+843.0294937555955 5864.25 4.184682369232178 9.0
+843.0703630969365 5868.30419921875 4.184995174407959 9.0
+843.0907976176968 5869.14794921875 4.185385704040527 9.0
+843.1316669594016 5866.23388671875 4.18505859375 9.0
+843.1521014803511 5863.55419921875 4.185273170471191 9.0
+843.1725361013596 5868.705078125 4.186497211456299 9.0
+843.1929708224197 5875.1376953125 4.185958385467529 9.0
+843.2134053435584 5873.93359375 4.185382843017578 9.0
+843.2338400647714 5871.7041015625 4.185283660888672 9.0
+843.2542746860199 5875.06494140625 4.185704708099365 9.0
+843.2747092073478 5876.82470703125 4.185746669769287 9.0
+843.2951439287135 5877.71875 4.185887813568115 9.0
+843.3155784501578 5878.591796875 4.185900688171387 9.0
+843.3360131716763 5868.671875 4.185522079467773 9.0
+843.3564477932377 5885.5673828125 4.186613082885742 9.0
+843.3768823148639 5887.02734375 4.187276363372803 9.0
+843.3973170365571 5887.3251953125 4.186804294586182 9.0
+843.4177516583004 5882.2216796875 4.1864166259765625 9.0
+843.4381862801092 5875.76025390625 4.185201644897461 9.0
+843.4994901459067 5881.17822265625 4.1852335929870605 9.0
+843.5403593900701 5876.73291015625 4.1846771240234375 9.0
+843.5607940122572 5882.0341796875 4.185840129852295 9.0
+843.5812287344888 5882.22412109375 4.185304164886475 9.0
+843.6016632567771 5880.57421875 4.185125350952148 9.0
+843.6220979791324 5888.35205078125 4.186009407043457 9.0
+843.6425326015524 5898.6796875 4.186985015869141 9.0
+843.6629671240225 5880.41357421875 4.185978889465332 9.0
+843.6834018465597 5882.876953125 4.185861110687256 9.0
+843.7038364691543 5892.20849609375 4.1870503425598145 9.0
+843.7242709917919 5876.5146484375 4.18469762802124 9.0
+843.7447057145109 5885.18505859375 4.1862874031066895 9.0
+843.7651403372802 5891.02197265625 4.187088489532471 9.0
+843.7855750601011 5883.0146484375 4.185819149017334 9.0
+843.806009582986 5887.7041015625 4.18678092956543 9.0
+843.8264442059299 5888.234375 4.186408996582031 9.0
+843.8468789289254 5889.63134765625 4.186529159545898 9.0
+843.8673134519995 5885.62353515625 4.186606407165527 9.0
+843.8877480751034 5881.59228515625 4.185791015625 9.0
+843.9081827983027 5887.16015625 4.187258243560791 9.0
+843.9286173215369 5883.70068359375 4.186019420623779 9.0
+843.94905194483 5882.255859375 4.186186790466309 9.0
+843.969486568174 5882.12060546875 4.186000823974609 9.0
+843.9899211915836 5887.05419921875 4.186420440673828 9.0
+844.0103559150521 5885.78271484375 4.18666934967041 9.0
+844.03079043857 5885.654296875 4.186277389526367 9.0
+844.0512250621541 5891.896484375 4.187403678894043 9.0
+844.0920944094905 5893.0234375 4.188174724578857 9.0
+844.1125289332485 5883.86669921875 4.186624050140381 9.0
+844.1329636570517 5890.48779296875 4.186862468719482 9.0
+844.1533982809196 5894.96923828125 4.187886714935303 9.0
+844.1738328048377 5888.93896484375 4.187004089355469 9.0
+844.1942675288301 5892.85791015625 4.187255382537842 9.0
+844.2147021528435 5893.5771484375 4.187498569488525 9.0
+844.2351368769523 5893.744140625 4.187249660491943 9.0
+844.2555714010887 5892.4580078125 4.187475204467773 9.0
+844.2760060253058 5893.50927734375 4.187195301055908 9.0
+844.2964407495601 5895.09765625 4.187529563903809 9.0
+844.3168752738711 5891.3115234375 4.186577320098877 9.0
+844.3373098982338 5895.74267578125 4.186711311340332 9.0
+844.3577446226773 5899.8271484375 4.187707424163818 9.0
+844.3781791471483 5891.0986328125 4.187138557434082 9.0
+844.3986138716864 5898.1875 4.1878461837768555 9.0
+844.4190484962892 5897.03515625 4.187187194824219 9.0
+844.4394830209203 5890.9296875 4.187510013580322 9.0
+844.459917745633 5895.51318359375 4.186842918395996 9.0
+844.4803523703813 5896.07763671875 4.18726110458374 9.0
+844.5007869952096 5892.06982421875 4.186558723449707 9.0
+844.5212216200744 5888.61962890625 4.18635368347168 9.0
+844.5416562449973 5897.48046875 4.188007831573486 9.0
+844.5620908699784 5888.96435546875 4.18705415725708 9.0
+844.5825254949814 5894.189453125 4.188067436218262 9.0
+844.6029601200789 5882.2958984375 4.186875820159912 9.0
+844.6233947452274 5893.95703125 4.187191963195801 9.0
+844.6438293704123 5899.06494140625 4.187862873077393 9.0
+844.6642639956553 5891.1962890625 4.187027931213379 9.0
+844.6846986209566 5901.74853515625 4.187805652618408 9.0
+844.7051332463088 5900.17236328125 4.187561988830566 9.0
+844.7255678717265 5901.517578125 4.188018321990967 9.0
+844.7460025971668 5904.61865234375 4.188571453094482 9.0
+844.7868718482641 5884.56494140625 4.186697483062744 9.0
+844.8073064738783 5896.76416015625 4.187800884246826 9.0
+844.827740999528 5897.95361328125 4.187714576721191 9.0
+844.8481757252666 5898.1259765625 4.187686443328857 9.0
+844.8686103510263 5895.0712890625 4.187573432922363 9.0
+844.8890448768798 5895.453125 4.187695503234863 9.0
+844.9094796027639 5898.26416015625 4.188168048858643 9.0
+845.6246917406097 5878.533203125 4.18691349029541 9.0
+845.6451263682902 5887.86669921875 4.188706398010254 9.0
+845.6655608960355 5874.4267578125 4.186115264892578 9.0
+845.6859956238113 5879.57373046875 4.186595916748047 9.0
+845.7064302516374 5886.5166015625 4.186936855316162 9.0
+845.7268648795289 5877.0205078125 4.186623573303223 9.0
+845.7472995074204 5874.93017578125 4.186117649078369 9.0
+845.767734135421 5868.29638671875 4.185177326202393 9.0
+845.7881688634297 5868.021484375 4.185649871826172 9.0
+845.8086033914951 5876.5361328125 4.186167240142822 9.0
+845.8290380196122 5869.97607421875 4.185413837432861 9.0
+845.8494727477664 5873.91015625 4.186051368713379 9.0
+845.8699072759773 5864.65625 4.184694290161133 9.0
+845.8903419042108 5867.57373046875 4.185293197631836 9.0
+845.9107766325105 5874.4541015625 4.185439586639404 9.0
+845.931211160867 5874.16650390625 4.185126304626465 9.0
+845.951645789246 5875.08837890625 4.185349464416504 9.0
+845.9720805176912 5878.0703125 4.186164855957031 9.0
+845.992515046164 5865.67578125 4.185255527496338 9.0
+846.0129497747184 5870.1318359375 4.186283588409424 9.0
+846.0333844032793 5871.0283203125 4.185570240020752 9.0
+846.0538189318977 5864.81689453125 4.184942722320557 9.0
+846.0742536605685 5862.06396484375 4.185650825500488 9.0
+846.0946882892749 5858.228515625 4.1850666999816895 9.0
+846.1151228180388 5857.1025390625 4.1849236488342285 9.0
+846.1355575468551 5861.1142578125 4.184877872467041 9.0
+846.155992175678 5862.412109375 4.1851325035095215 9.0
+846.1764269045816 5863.0908203125 4.185199737548828 9.0
+846.1968614335201 5858.66552734375 4.185049533843994 9.0
+846.2172960624885 5867.45654296875 4.185791969299316 9.0
+846.2377307915449 5865.900390625 4.185888767242432 9.0
+846.2581653205925 5861.0703125 4.18506383895874 9.0
+846.2785999497064 5855.14697265625 4.185003757476807 9.0
+846.299034678872 5863.61083984375 4.185976505279541 9.0
+846.3194692080724 5867.90234375 4.186039447784424 9.0
+846.3399038373318 5864.82763671875 4.185922145843506 9.0
+846.3603385666211 5873.82275390625 4.186532497406006 9.0
+846.3807731959605 5861.921875 4.185520648956299 9.0
+846.4012078253363 5865.33984375 4.185626029968262 9.0
+846.4216424547631 5858.30810546875 4.185177326202393 9.0
+846.4420770842262 5863.3369140625 4.185626029968262 9.0
+846.4625117137475 5860.365234375 4.184980869293213 9.0
+846.4829463432688 5879.55078125 4.186911582946777 9.0
+846.5033809728702 5865.97265625 4.185451030731201 9.0
+846.5238156025371 5864.98046875 4.184840679168701 9.0
+846.5442502321966 5873.88720703125 4.185519218444824 9.0
+846.5646848619217 5864.779296875 4.1848344802856445 9.0
+846.6055541214882 5870.61181640625 4.18503475189209 9.0
+846.6259888513523 5859.66455078125 4.1847004890441895 9.0
+846.6464233812512 5866.05908203125 4.185603618621826 9.0
+846.6668580111727 5867.9287109375 4.185728073120117 9.0
+846.6872927411605 5874.3408203125 4.186652660369873 9.0
+846.7077272711758 5868.92578125 4.1855363845825195 9.0
+846.7281619012501 5866.5703125 4.185848236083984 9.0
+846.748596631347 5862.36181640625 4.184954643249512 9.0
+846.7690311614788 5872.5146484375 4.186437606811523 9.0
+846.789465891663 5872.32666015625 4.186223030090332 9.0
+846.8099005219119 5863.63232421875 4.1851630210876465 9.0
+846.8303350521601 5870.36181640625 4.185911655426025 9.0
+846.8507697824898 5867.1435546875 4.186103343963623 9.0
+846.871204412826 5859.12890625 4.184379577636719 9.0
+846.8916390432205 5869.10498046875 4.18501091003418 9.0
+846.9120736736368 5874.48583984375 4.185150623321533 9.0
+846.9325083041185 5871.67578125 4.18529748916626 9.0
+846.9733775651912 5875.72021484375 4.185751438140869 9.0
+846.9938121957894 5862.87353515625 4.184238910675049 9.0
+847.0142469264174 5859.4755859375 4.184567928314209 9.0
+847.0346814570948 5867.541015625 4.184475421905518 9.0
+847.0551160878094 5873.28515625 4.185693740844727 9.0
+847.075550818583 5873.20703125 4.184751510620117 9.0
+847.0959854493485 5865.5419921875 4.184412956237793 9.0
+847.1164199801788 5861.45947265625 4.184116840362549 9.0
+847.1368547110687 5876.62158203125 4.185694694519043 9.0
+847.1572892419499 5864.515625 4.184493541717529 9.0
+847.1777239729272 5861.26318359375 4.184030055999756 9.0
+847.1981586039037 5852.72216796875 4.183490753173828 9.0
+847.2185931349304 5866.05810546875 4.185016632080078 9.0
+847.2390278660241 5863.59912109375 4.1850996017456055 9.0
+847.259462497117 5864.02197265625 4.185318470001221 9.0
+847.2798970282602 5860.25634765625 4.184647083282471 9.0
+847.3003317594412 5865.66455078125 4.184874534606934 9.0
+847.3207663906505 5855.63720703125 4.184057712554932 9.0
+847.3412009219101 5854.56298828125 4.183905601501465 9.0
+847.3616356532075 5864.6630859375 4.184803009033203 9.0
+847.3820702845333 5862.30712890625 4.183997631072998 9.0
+847.4025050159107 5864.1318359375 4.184175968170166 9.0
+847.422939547323 5860.30517578125 4.183432579040527 9.0
+847.4433741787943 5861.08251953125 4.18367338180542 9.0
+847.4638089102591 5865.6689453125 4.183233261108398 9.0
+847.4842434417878 5865.73486328125 4.1834397315979 9.0
+847.5251128049567 5866.27734375 4.183506965637207 9.0
+847.5455473365728 5867.39208984375 4.1838178634643555 9.0
+847.5659820682486 5861.52685546875 4.183583736419678 9.0
+847.5864166999745 5860.22998046875 4.182539939880371 9.0
+847.6272859634919 5861.38720703125 4.183005332946777 9.0
+847.6477205953124 5863.09033203125 4.1826629638671875 9.0
+847.6681552271621 5853.06396484375 4.182271480560303 9.0
+847.6885898590408 5858.53125 4.1827802658081055 9.0
+847.7090244909705 5867.1337890625 4.183261871337891 9.0
+847.7294591229656 5861.41552734375 4.1834259033203125 9.0
+847.7498938549543 5864.1240234375 4.182585716247559 9.0
+847.7703283869778 5860.28955078125 4.182049751281738 9.0
+847.790763119061 5860.353515625 4.181702136993408 9.0
+847.8111976511718 5862.93017578125 4.181778430938721 9.0
+847.8725015476666 5849.66552734375 4.180662631988525 9.0
+847.8929361799237 5850.55712890625 4.179832935333252 9.0
+847.9133709122107 5850.966796875 4.181206703186035 9.0
+847.9542400768623 5851.4990234375 4.181998252868652 9.0
+847.9746748092657 5857.4775390625 4.182651042938232 9.0
+847.9951093416894 5849.32958984375 4.1809773445129395 9.0
+848.0155440741219 5850.94140625 4.18080472946167 9.0
+848.0359787066118 5854.427734375 4.180783748626709 9.0
+848.0564132391228 5857.06640625 4.181793689727783 9.0
+848.0768479717008 5856.27392578125 4.180361747741699 9.0
+848.0972826043071 5859.80859375 4.181879997253418 9.0
+848.1177172369062 5856.1728515625 4.1816864013671875 9.0
+848.1381518695707 5856.4658203125 4.181073188781738 9.0
+848.1585865022644 5855.8427734375 4.180431842803955 9.0
+848.1790212349806 5861.763671875 4.181340217590332 9.0
+848.1994557677317 5847.46435546875 4.1796770095825195 9.0
+848.2198904005127 5852.958984375 4.1799845695495605 9.0
+848.2403251333453 5856.38427734375 4.1808037757873535 9.0
+848.2607597662136 5844.32080078125 4.179722785949707 9.0
+848.2811942990811 5853.884765625 4.181205749511719 9.0
+848.3016290320302 5848.337890625 4.180634498596191 9.0
+848.3220636649858 5847.158203125 4.17922830581665 9.0
+848.3424981979697 5843.2587890625 4.179793834686279 9.0
+848.362932930977 5846.0888671875 4.1799798011779785 9.0
+848.3833675640199 5845.4951171875 4.179810047149658 9.0
+848.403802197121 5849.12158203125 4.180520057678223 9.0
+848.4242368302148 5851.8486328125 4.180659294128418 9.0
+848.4446714633741 5848.849609375 4.180539608001709 9.0
+848.4651060965552 5847.36279296875 4.180016994476318 9.0
+848.4855407297728 5844.49169921875 4.179818630218506 9.0
+848.5059752630186 5844.056640625 4.180077075958252 9.0
+848.526409996266 5844.05517578125 4.179321765899658 9.0
+848.5468446295636 5848.98681640625 4.179462432861328 9.0
+848.6081485296745 5843.4267578125 4.17971658706665 9.0
+848.6285832631256 5842.181640625 4.179574012756348 9.0
+848.6490177965752 5841.9580078125 4.179996013641357 9.0
+848.6694524300474 5853.21533203125 4.179663181304932 9.0
+848.6898871635858 5838.2568359375 4.178569316864014 9.0
+848.7103216971154 5845.57080078125 4.178827285766602 9.0
+848.7307563306822 5845.4375 4.179375171661377 9.0
+848.751191064337 5848.38037109375 4.1795125007629395 9.0
+848.7716256979547 5844.54296875 4.179594039916992 9.0
+848.7920603316379 5840.57470703125 4.17832088470459 9.0
+848.8124949653211 5845.00537109375 4.17909049987793 9.0
+848.8329295990552 5849.44091796875 4.179544925689697 9.0
+848.8533642328257 5844.30517578125 4.17881965637207 9.0
+848.8737988665962 5846.802734375 4.179689884185791 9.0
+848.8942335004176 5840.57568359375 4.177671909332275 9.0
+848.9146682342762 5840.62255859375 4.17851448059082 9.0
+848.9351027681332 5845.0078125 4.1786041259765625 9.0
+848.9555375020427 5848.28125 4.178604602813721 9.0
+848.9759721359878 5843.3515625 4.178713798522949 9.0
+849.016841403929 5847.84912109375 4.178021430969238 9.0
+849.0577105719931 5840.2978515625 4.179048538208008 9.0
+849.0781453060772 5845.72802734375 4.179854869842529 9.0
+849.0985798401671 5835.23388671875 4.178206443786621 9.0
+849.1190144743159 5833.68408203125 4.177684307098389 9.0
+849.1394492084582 5839.68505859375 4.17816162109375 9.0
+849.1598837426354 5839.60791015625 4.178163051605225 9.0
+849.1803184768723 5847.2333984375 4.178661346435547 9.0
+849.2007531111012 5849.61376953125 4.178530216217041 9.0
+849.2211876453657 5847.650390625 4.17727518081665 9.0
+849.2416223796608 5851.24609375 4.17808723449707 9.0
+849.2620570140061 5839.71875 4.17788028717041 9.0
+849.2824915483579 5839.5673828125 4.177768230438232 9.0
+849.3029262827113 5841.38427734375 4.178569316864014 9.0
+849.3233609171148 5839.9716796875 4.178918361663818 9.0
+849.3437956515845 5846.2724609375 4.178726673126221 9.0
+849.3846648205144 5843.27099609375 4.178595542907715 9.0
+849.4050995549842 5841.89892578125 4.177210807800293 9.0
+849.4255340895688 5845.470703125 4.178424835205078 9.0
+849.4459687240887 5845.3671875 4.178046226501465 9.0
+849.4664034586749 5837.400390625 4.177021026611328 9.0
+849.4868380933185 5842.97021484375 4.177286624908447 9.0
+849.5072726279541 5839.5771484375 4.177301406860352 9.0
+849.5277073625984 5834.37841796875 4.177112579345703 9.0
+849.548141997293 5838.13623046875 4.176470756530762 9.0
+849.5685767319956 5840.33837890625 4.177790641784668 9.0
+849.5890112667548 5843.314453125 4.1774516105651855 9.0
+849.6094459015148 5843.1474609375 4.1777024269104 9.0
+849.6298806363266 5838.17724609375 4.177367687225342 9.0
+849.650315171144 5848.86669921875 4.178126811981201 9.0
+849.670749805955 5840.25927734375 4.176688194274902 9.0
+849.6911844408314 5844.85302734375 4.1778154373168945 9.0
+849.7116190757079 5838.8603515625 4.176904201507568 9.0
+849.732053810636 5829.25244140625 4.176014423370361 9.0
+849.7524883455699 5838.91015625 4.17549467086792 9.0
+849.7933577154909 5837.11376953125 4.176730632781982 9.0
+849.8137922505412 5836.08203125 4.176208019256592 9.0
+849.834226885534 5831.140625 4.175792694091797 9.0
+849.8546616206368 5843.56103515625 4.176876544952393 9.0
+849.8750961556871 5842.07861328125 4.176682949066162 9.0
+849.8955307907963 5845.5419921875 4.176687240600586 9.0
+849.9159655259573 5840.39013671875 4.175841808319092 9.0
+849.9364000610658 5833.88232421875 4.1753129959106445 9.0
+849.956834796234 5837.98876953125 4.176918029785156 9.0
+849.9772694314524 5831.10986328125 4.176235198974609 9.0
+849.9977040666781 5824.083984375 4.175205230712891 9.0
+850.0181387019038 5834.44580078125 4.1756391525268555 9.0
+850.0385733371804 5825.84716796875 4.173950672149658 9.0
+850.0590079724643 5834.60986328125 4.175822734832764 9.0
+850.0794426078064 5833.9384765625 4.176242351531982 9.0
+850.099877243083 5835.01953125 4.174853801727295 9.0
+850.1203119784841 5824.2822265625 4.1740899085998535 9.0
+850.1407466138262 5820.18798828125 4.17423677444458 9.0
+850.1611811492185 5827.5625 4.176060199737549 9.0
+850.1816158846777 5820.95849609375 4.175398826599121 9.0
+850.2020505201363 5821.77099609375 4.174530506134033 9.0
+850.2224850555867 5828.6396484375 4.175976276397705 9.0
+850.242919791046 5833.5537109375 4.175834655761719 9.0
+850.2633544265627 5822.09521484375 4.174576282501221 9.0
+850.2837889620714 5838.59423828125 4.175932884216309 9.0
+850.3042236976471 5827.5361328125 4.1739678382873535 9.0
+850.3246582332213 5834.84423828125 4.174367427825928 9.0
+850.3450929687897 5828.12939453125 4.175046920776367 9.0
+850.3859621400552 5837.32861328125 4.173829078674316 9.0
+850.4063968756818 5827.62158203125 4.174529075622559 9.0
+850.4268315113732 5832.8037109375 4.174537658691406 9.0
+850.4472660470637 5841.52880859375 4.175776481628418 9.0
+850.4677007827486 5829.552734375 4.173409938812256 9.0
+850.4881354184981 5823.6875 4.1735992431640625 9.0
+850.5085701542412 5829.1318359375 4.1750664710998535 9.0
+850.5290046900482 5829.92822265625 4.174676418304443 9.0
+850.5494393257977 5830.6484375 4.173974514007568 9.0
+850.5698740616644 5828.37451171875 4.174205780029297 9.0
+850.5903085974642 5818.23388671875 4.173631191253662 9.0
+850.6107432333301 5820.7333984375 4.173736095428467 9.0
+850.6311779691896 5820.49560546875 4.173406600952148 9.0
+850.6516126050556 5822.77197265625 4.173985004425049 9.0
+850.672047140979 5828.51416015625 4.173971176147461 9.0
+850.712916512879 5835.091796875 4.174849033355713 9.0
+850.7333511488032 5835.24560546875 4.1741228103637695 9.0
+850.7537857848365 5827.82275390625 4.173835754394531 9.0
+850.7742204208189 5823.0205078125 4.1736531257629395 9.0
+850.7946551568602 5831.8876953125 4.174229621887207 9.0
+850.8150896928346 5819.96337890625 4.173696517944336 9.0
+850.8559590649747 5828.21142578125 4.174360752105713 9.0
+850.8763936010655 5814.869140625 4.172511577606201 9.0
+850.8968283372233 5825.53564453125 4.174657344818115 9.0
+851.019436154209 5811.22265625 4.173135757446289 9.0
+851.0603053266896 5817.3359375 4.173539161682129 9.0
+851.0807400629637 5817.5302734375 4.173305988311768 9.0
+851.1216093355033 5818.87353515625 4.173364639282227 9.0
+851.1420439718349 5824.73974609375 4.173196792602539 9.0
+851.1624786081666 5817.123046875 4.172843933105469 9.0
+851.1829132444909 5821.203125 4.173202991485596 9.0
+851.2237825172706 5823.60400390625 4.173792362213135 9.0
+851.2442171536532 5813.400390625 4.172789573669434 9.0
+851.264651790043 5808.18212890625 4.1713714599609375 9.0
+851.2850865264918 5809.8134765625 4.171969890594482 9.0
+851.3055210629318 5814.603515625 4.172885894775391 9.0
+851.3259556993798 5824.12548828125 4.173355579376221 9.0
+851.3463904358214 5827.203125 4.174107551574707 9.0
+851.3668250723276 5811.94189453125 4.171867847442627 9.0
+851.3872596088331 5813.62158203125 4.171821594238281 9.0
+851.4076943453401 5816.2392578125 4.172931671142578 9.0
+851.4281289818391 5811.14501953125 4.173372745513916 9.0
+851.4485635184028 5808.37109375 4.171497821807861 9.0
+851.4689982549608 5820.27001953125 4.173006057739258 9.0
+851.4894328915252 5811.64794921875 4.172796249389648 9.0
+851.5098676281486 5812.0595703125 4.172669410705566 9.0
+851.5303021647123 5822.66259765625 4.173219203948975 9.0
+851.5507368013277 5818.67333984375 4.172543525695801 9.0
+851.5711715379512 5816.09521484375 4.17167329788208 9.0
+851.5916060745658 5824.17138671875 4.173300743103027 9.0
+851.6120407112467 5810.71630859375 4.171163558959961 9.0
+851.6324753479275 5822.30712890625 4.17302131652832 9.0
+851.6529099846084 5813.537109375 4.17275333404541 9.0
+851.6733447212828 5812.83642578125 4.171481132507324 9.0
+851.6937792580211 5823.552734375 4.172711372375488 9.0
+851.7142138946947 5811.4453125 4.171947479248047 9.0
+851.7346486314345 5818.3779296875 4.172589302062988 9.0
+851.7550831682311 5808.435546875 4.172004699707031 9.0
+851.7755178049701 5810.68603515625 4.172395706176758 9.0
+851.7959525417027 5798.2978515625 4.1716227531433105 9.0
+851.8163871785 5805.2080078125 4.171443462371826 9.0
+851.8368217152893 5804.7138671875 4.1722025871276855 9.0
+851.8776910889428 5813.59521484375 4.171175479888916 9.0
+851.898125725791 5815.10009765625 4.17213773727417 9.0
+851.938994999502 5807.6708984375 4.171176433563232 9.0
+851.959429736351 5806.1201171875 4.170673370361328 9.0
+851.9798642732057 5809.06494140625 4.170903205871582 9.0
+852.0002989101195 5810.78759765625 4.171150207519531 9.0
+852.0207336470266 5819.1533203125 4.171124458312988 9.0
+852.0411681839396 5814.15673828125 4.172125339508057 9.0
+852.061602920854 5812.88818359375 4.171833515167236 9.0
+852.0820375577605 5804.15771484375 4.170751571655273 9.0
+852.1024720947316 5812.060546875 4.171188831329346 9.0
+852.1229068317043 5807.46484375 4.171257019042969 9.0
+852.1637760056401 5812.82763671875 4.171631336212158 9.0
+852.1842107426128 5809.2607421875 4.171685218811035 9.0
+852.2046453795774 5807.64501953125 4.170302867889404 9.0
+852.2250799166068 5806.86865234375 4.1709723472595215 9.0
+852.2455146536377 5808.376953125 4.169694900512695 9.0
+852.2659491906597 5804.52880859375 4.169844627380371 9.0
+852.2863839276906 5814.666015625 4.170618534088135 9.0
+852.3068185647207 5808.11181640625 4.170546054840088 9.0
+852.327253101801 5824.86279296875 4.172562599182129 9.0
+852.3476878388319 5826.40771484375 4.171848297119141 9.0
+852.3681224759202 5820.67822265625 4.171159744262695 9.0
+852.3885571130013 5809.958984375 4.170847415924072 9.0
+852.4089917500896 5817.173828125 4.171617031097412 9.0
+852.4294263872362 5807.7333984375 4.170429229736328 9.0
+852.4498610243172 5813.60107421875 4.17026948928833 9.0
+852.4702956614055 5810.51220703125 4.171267986297607 9.0
+852.4907302985521 5808.41943359375 4.1707658767700195 9.0
+852.5111650356921 5809.69921875 4.170193672180176 9.0
+852.5315996728386 5810.94384765625 4.171017646789551 9.0
+852.5520342099844 5819.333984375 4.171084880828857 9.0
+852.5724689471244 5823.4306640625 4.171604633331299 9.0
+852.5929035843292 5822.03759765625 4.170314788818359 9.0
+852.613338121475 5818.28271484375 4.171529769897461 9.0
+852.6337728586732 5816.1630859375 4.170291423797607 9.0
+852.6542074958779 5826.767578125 4.171814441680908 9.0
+852.6950767702801 5809.97119140625 4.16974401473999 9.0
+852.7155114074849 5824.88623046875 4.170434474945068 9.0
+852.7359461446831 5811.626953125 4.170135974884033 9.0
+852.7563806819453 5814.69921875 4.170894622802734 9.0
+852.77681531915 5819.22021484375 4.171876430511475 9.0
+852.7972500564065 5813.08251953125 4.17104959487915 9.0
+852.8176845936687 5811.5498046875 4.170919895172119 9.0
+852.8381192309316 5807.28125 4.170640468597412 9.0
+852.8585539681881 5808.84521484375 4.170820236206055 9.0
+852.8789885054503 5824.17236328125 4.172229290008545 9.0
+852.899423242714 5825.30615234375 4.170967102050781 9.0
+852.9198577799689 5816.837890625 4.17034387588501 9.0
+852.94029241729 5816.2451171875 4.1705241203308105 9.0
+852.9607271545538 5815.54248046875 4.170876502990723 9.0
+852.9811616918741 5823.29638671875 4.171899318695068 9.0
+853.0220310664517 5815.9169921875 4.17092227935791 9.0
+853.0629003410868 5813.99169921875 4.170393466949463 9.0
+853.083334978408 5816.5966796875 4.170649528503418 9.0
+853.1242042531012 5814.8330078125 4.170506954193115 9.0
+853.1446388904224 5817.9501953125 4.170867919921875 9.0
+853.1650735277362 5819.3232421875 4.171430587768555 9.0
+853.1855082651164 5817.5556640625 4.1706037521362305 9.0
+853.2059428024368 5816.86376953125 4.171097755432129 9.0
+853.2263774398089 5812.72021484375 4.170439720153809 9.0
+853.246812177189 5821.2763671875 4.170759677886963 9.0
+853.2672467145676 5822.91650390625 4.171294689178467 9.0
+853.2876814519404 5820.1552734375 4.171424865722656 9.0
+853.3081160892616 5819.060546875 4.170652866363525 9.0
+853.3285506266402 5820.41552734375 4.170747756958008 9.0
+853.3489853640131 5822.76806640625 4.169524669647217 9.0
+853.3694200014506 5820.38671875 4.170058250427246 9.0
+853.3898545388292 5821.94384765625 4.170638084411621 9.0
+853.4102892762021 5812.96142578125 4.170023441314697 9.0
+853.4307239135815 5824.83837890625 4.170507907867432 9.0
+853.4715931883911 5830.017578125 4.171448707580566 9.0
+853.4920278257705 5822.21533203125 4.171016216278076 9.0
+853.5124624632008 5815.9990234375 4.169891834259033 9.0
+853.5328971005802 5823.99755859375 4.171784400939941 9.0
+853.5533317380177 5819.76904296875 4.172030448913574 9.0
+853.5737663753971 5813.3740234375 4.170332908630371 9.0
+853.5942010128274 5825.55224609375 4.171800136566162 9.0
+853.6146356502068 5823.52880859375 4.171710968017578 9.0
+853.6350702876371 5824.763671875 4.171884059906006 9.0
+853.6555049250746 5826.4150390625 4.172338962554932 9.0
+853.675939662513 5813.5673828125 4.170721054077148 9.0
+853.6963742999433 5817.21435546875 4.171006202697754 9.0
+853.7168088373219 5815.82080078125 4.17080020904541 9.0
+853.7372435747602 5811.4970703125 4.17077112197876 9.0
+853.7576782121905 5827.86279296875 4.1721086502075195 9.0
+853.7781127496273 5824.72412109375 4.172240734100342 9.0
+853.7985474870657 5826.2333984375 4.171960830688477 9.0
+853.818982124496 5821.95068359375 4.171053886413574 9.0
+853.8394168619343 5822.68896484375 4.171720504760742 9.0
+853.8598513993711 5825.615234375 4.171423435211182 9.0
+853.8802860368014 5826.31982421875 4.172171115875244 9.0
+853.9211553116766 5834.53759765625 4.172544956207275 9.0
+853.9415899491069 5826.2119140625 4.172651767730713 9.0
+853.9824592239238 5830.41357421875 4.172609329223633 9.0
+854.0028938614123 5818.2021484375 4.172149658203125 9.0
+854.0233285987924 5827.3330078125 4.173000812530518 9.0
+854.0437631362875 5824.73583984375 4.17221736907959 9.0
+854.0641978736603 5826.69970703125 4.172281265258789 9.0
+854.0846325110979 5820.92431640625 4.171339988708496 9.0
+854.1050670485347 5828.51513671875 4.172300815582275 9.0
+854.1255017859658 5831.11328125 4.173233985900879 9.0
+854.1459363234026 5830.05908203125 4.171910285949707 9.0
+854.1663710608409 5826.6279296875 4.172937393188477 9.0
+854.1868056982712 5829.51025390625 4.172842979431152 9.0
+854.2072403357088 5826.11376953125 4.172794818878174 9.0
+854.2276748730874 5827.5029296875 4.173375129699707 9.0
+854.2481096105184 5827.06396484375 4.1729736328125 9.0
+854.268544247956 5834.21533203125 4.173694133758545 9.0
+854.2889788853936 5830.560546875 4.172920227050781 9.0
+854.3094135228239 5836.87890625 4.173764228820801 9.0
+854.3298481602033 5841.49609375 4.174306869506836 9.0
+854.3502827976408 5835.8623046875 4.173841953277588 9.0
+854.3707174350129 5850.46728515625 4.174940586090088 9.0
+854.3911520724505 5839.42333984375 4.173653602600098 9.0
+854.4115868098888 5837.87841796875 4.1736674308776855 9.0
+854.4320213472602 5835.94921875 4.173461437225342 9.0
+854.4524560846403 5830.76318359375 4.172549724578857 9.0
+854.4728907220706 5826.0546875 4.172386169433594 9.0
+854.5137599968875 5830.8017578125 4.173190593719482 9.0
+854.5341946342669 5835.0869140625 4.17332124710083 9.0
+854.5546291716382 5842.70654296875 4.173844337463379 9.0
+854.5750639090184 5842.85791015625 4.173942565917969 9.0
+854.5954985463904 5839.294921875 4.1728835105896 9.0
+854.615933083769 5839.0810546875 4.173288822174072 9.0
+854.6363678211492 5839.072265625 4.173638343811035 9.0
+854.6568024585285 5838.505859375 4.173270225524902 9.0
+854.6772371959014 5848.56005859375 4.174139022827148 9.0
+854.6976717332218 5841.5810546875 4.174257755279541 9.0
+854.7181063705939 5843.7841796875 4.173428058624268 9.0
+854.738541007915 5837.2197265625 4.172973155975342 9.0
+854.7589756452944 5845.23681640625 4.173282623291016 9.0
+854.7794102826156 5843.26318359375 4.17356538772583 9.0
+854.7998449199877 5847.35791015625 4.1742377281188965 9.0
+854.8202795573088 5847.5927734375 4.172973155975342 9.0
+854.8407142946235 5836.6357421875 4.173392295837402 9.0
+854.881583469265 5846.90380859375 4.1740946769714355 9.0
+854.9224528439008 5854.357421875 4.174128532409668 9.0
+854.9428873812212 5850.34765625 4.174384593963623 9.0
+854.9633221184777 5845.4287109375 4.174349784851074 9.0
+854.9837567557988 5845.47314453125 4.17401647567749 9.0
+855.004191293061 5846.0830078125 4.174618721008301 9.0
+855.0246260303757 5852.724609375 4.174980640411377 9.0
+855.0450606676386 5852.3388671875 4.174731254577637 9.0
+855.0654954049023 5848.21826171875 4.174654960632324 9.0
+855.0859299421572 5850.18603515625 4.174591541290283 9.0
+855.1063645794202 5859.396484375 4.1756792068481445 9.0
+855.1267993166839 5855.93701171875 4.174767017364502 9.0
+855.1472338538806 5855.94677734375 4.1749043464660645 9.0
+855.1676684911436 5865.99658203125 4.175967216491699 9.0
+855.1881032283491 5858.97607421875 4.174755573272705 9.0
+855.2085377655458 5852.9921875 4.174754619598389 9.0
+855.2289725028095 5862.8427734375 4.175416469573975 9.0
+855.2494071400142 5858.93115234375 4.175461769104004 9.0
+855.2698416772109 5858.94677734375 4.175365924835205 9.0
+855.2902764144164 5855.1201171875 4.174032211303711 9.0
+855.310711051563 5861.27587890625 4.175894737243652 9.0
+855.3311455887597 5862.36328125 4.17526912689209 9.0
+855.351580325907 5861.89013671875 4.175764083862305 9.0
+855.3720149631117 5867.96728515625 4.176011562347412 9.0
+855.392449600251 5870.16650390625 4.175600051879883 9.0
+855.4128842373975 5862.91796875 4.174800872802734 9.0
+855.433318874544 5862.35400390625 4.1752471923828125 9.0
+855.4537535116251 5864.6787109375 4.174686431884766 9.0
+855.49462278586 5863.70947265625 4.174310684204102 9.0
+855.515057422941 5856.96044921875 4.174529552459717 9.0
+855.5354920600876 5861.177734375 4.1752777099609375 9.0
+855.5559266971759 5869.0048828125 4.1757121086120605 9.0
+855.5763614341995 5867.388671875 4.175388813018799 9.0
+855.5967959712871 5870.236328125 4.176090717315674 9.0
+855.6172307083762 5871.36181640625 4.1757025718688965 9.0
+855.637665345399 5868.64990234375 4.175295829772949 9.0
+855.678534619452 5869.85986328125 4.175378322601318 9.0
+855.6989692564821 5866.15673828125 4.174954891204834 9.0
+855.7194037935114 5873.37548828125 4.176112174987793 9.0
+855.7398385304841 5861.62109375 4.1751885414123535 9.0
+855.7602731674488 5876.06494140625 4.176661968231201 9.0
+855.7807077044781 5866.26318359375 4.175313949584961 9.0
+855.8011424413853 5872.822265625 4.176269054412842 9.0
+855.8215770783572 5868.3291015625 4.175767421722412 9.0
+855.8420118153299 5872.6640625 4.176210403442383 9.0
+855.8624463522356 5874.267578125 4.1759209632873535 9.0
+855.8828809891493 5873.55908203125 4.175690174102783 9.0
+855.9237502629694 5872.50390625 4.1757354736328125 9.0
+855.9441848998831 5882.8603515625 4.177340507507324 9.0
+855.9646196367976 5873.65478515625 4.1759748458862305 9.0
+855.985054173645 5866.43115234375 4.175037384033203 9.0
+856.0054888105005 5884.00390625 4.177068710327148 9.0
+856.0259235473568 5881.1220703125 4.176778316497803 9.0
+856.046358084146 5880.4501953125 4.176881313323975 9.0
+856.0667928210023 5879.865234375 4.177331924438477 9.0
+856.0872274577996 5879.96533203125 4.176860332489014 9.0
+856.1076620945896 5880.90087890625 4.1765336990356445 9.0
+856.1280967313869 5883.9375 4.177458763122559 9.0
+856.1485313681842 5873.21875 4.17706298828125 9.0
+856.1689659049152 5866.859375 4.17588996887207 9.0
+856.1894006416551 5878.41259765625 4.177085876464844 9.0
+856.2098352783942 5880.19384765625 4.177020072937012 9.0
+856.2302700151267 5877.09765625 4.1768035888671875 9.0
+856.250704551865 5891.70703125 4.178389549255371 9.0
+856.2711391885459 5871.91259765625 4.175631046295166 9.0
+856.2915739252203 5883.8798828125 4.176827907562256 9.0
+856.3120084619004 5895.26318359375 4.1778564453125 9.0
+856.3324430985813 5888.0654296875 4.176835060119629 9.0
+856.3528778351974 5882.42578125 4.176769256591797 9.0
+856.393747008442 5887.92578125 4.1772847175598145 9.0
+856.4141817450582 5889.12890625 4.177340984344482 9.0
+856.4346162816801 5885.83251953125 4.176898002624512 9.0
+856.4550510182453 5893.07666015625 4.178109169006348 9.0
+856.4754856548025 5889.90234375 4.17694091796875 9.0
+856.495920191308 5891.84912109375 4.177857398986816 9.0
+856.5163549278659 5881.24267578125 4.176549911499023 9.0
+856.5367895643722 5888.56103515625 4.176696300506592 9.0
+856.5572242008784 5905.95068359375 4.178682327270508 9.0
+856.5776588373847 5887.3828125 4.177318096160889 9.0
+856.5980934738254 5891.21826171875 4.177677154541016 9.0
+856.6185282103324 5892.39794921875 4.177579879760742 9.0
+856.6389627467724 5894.48974609375 4.177880764007568 9.0
+856.6593973831623 5895.1328125 4.17756986618042 9.0
+856.7002666560002 5900.7265625 4.178677558898926 9.0
+856.7207012923827 5902.60205078125 4.178269386291504 9.0
+856.7411359287144 5902.70703125 4.178671836853027 9.0
+856.7615705650969 5896.16064453125 4.1774749755859375 9.0
+856.7820052014285 5899.64501953125 4.1780571937561035 9.0
+856.8024399377609 5895.44091796875 4.178075790405273 9.0
+856.8228744740336 5894.61767578125 4.178014755249023 9.0
+856.8433092103587 5903.23583984375 4.179028034210205 9.0
+856.8637438465739 5900.244140625 4.178606986999512 9.0
+856.9046131191135 5903.1142578125 4.178563594818115 9.0
+856.9250477553287 5892.0546875 4.177840232849121 9.0
+856.9454822915432 5898.1435546875 4.178013324737549 9.0
+856.9659170276936 5896.365234375 4.1782917976379395 9.0
+856.9863516638507 5899.88818359375 4.1787495613098145 9.0
+857.0067864000594 5900.8974609375 4.178709506988525 9.0
+857.0272209361574 5903.794921875 4.178990840911865 9.0
+857.0476555722562 5908.24755859375 4.179466724395752 9.0
+857.0680903084067 5890.8369140625 4.177404403686523 9.0
+857.0885248444465 5897.794921875 4.17884635925293 9.0
+857.1089594805453 5906.6083984375 4.179424285888672 9.0
+857.1293942165794 5907.87841796875 4.179553508758545 9.0
+857.1498287526192 5906.40673828125 4.17919921875 9.0
+857.1702633886016 5902.001953125 4.178493499755859 9.0
+857.1906981245775 5903.3330078125 4.178859233856201 9.0
+857.2111326605591 5901.68212890625 4.178840160369873 9.0
+857.2315673965422 5903.9755859375 4.17872428894043 9.0
+857.2520020324591 5915.25341796875 4.17938232421875 9.0
+857.2724366683833 5907.19970703125 4.178345680236816 9.0
+857.2928713043075 5905.63037109375 4.17889928817749 9.0
+857.3133059401662 5908.55859375 4.180013179779053 9.0
+857.3337404760314 5904.099609375 4.1784539222717285 9.0
+857.3541752118981 5907.90576171875 4.178933143615723 9.0
+857.3746098476986 5910.36083984375 4.179557800292969 9.0
+857.3950444835064 5913.86181640625 4.179017543792725 9.0
+857.4154791193141 5913.92333984375 4.179030895233154 9.0
+857.4359137550564 5913.0556640625 4.178645133972168 9.0
+857.4563484908067 5913.0859375 4.17832612991333 9.0
+857.4767830265555 5913.81591796875 4.179429054260254 9.0
+857.4972176622396 5909.77197265625 4.178732872009277 9.0
+857.5176523979317 5919.404296875 4.179283618927002 9.0
+857.538086933564 5903.66357421875 4.178305149078369 9.0
+857.5585215692481 5906.63720703125 4.178565502166748 9.0
+857.5789563048238 5914.921875 4.179458141326904 9.0
+857.5993908404562 5910.44189453125 4.178555011749268 9.0
+857.6198255760246 5921.27099609375 4.178305149078369 9.0
+857.6402602115995 5923.4990234375 4.17915153503418 9.0
+857.6606947471155 5916.998046875 4.1780595779418945 9.0
+857.6811294826839 5918.36962890625 4.1795549392700195 9.0
+857.7015641181424 5916.0771484375 4.179147720336914 9.0
+857.7219987536519 5907.63671875 4.178455829620361 9.0
+857.7424333891104 5910.9833984375 4.177751064300537 9.0
+857.7628680245689 5909.03271484375 4.178891181945801 9.0
+857.7833027599627 5920.64990234375 4.179621696472168 9.0
+857.8037372953622 5919.40283203125 4.1794281005859375 9.0
+857.8241719307043 5916.1787109375 4.178884506225586 9.0
+857.8446066660399 5910.66357421875 4.17812967300415 9.0
+857.865041301382 5917.92333984375 4.179234504699707 9.0
+857.8854758367233 5915.185546875 4.179210186004639 9.0
+857.9059105720007 5924.78857421875 4.179984092712402 9.0
+857.9263452072264 5918.419921875 4.17957067489624 9.0
+857.9467797424513 5912.85400390625 4.1787919998168945 9.0
+857.9672144777287 5915.9755859375 4.179583549499512 9.0
+857.9876490128954 5909.20458984375 4.178802490234375 9.0
+858.0080837480637 5912.85546875 4.1792426109313965 9.0
+858.0285183832239 5907.2001953125 4.178551197052002 9.0
+858.0489529183324 5914.4873046875 4.1790971755981445 9.0
+858.0693876534424 5919.3916015625 4.179661750793457 9.0
+858.0898222884862 5912.17138671875 4.179300785064697 9.0
+858.1102568235365 5915.33203125 4.179409503936768 9.0
+858.1306915585883 5918.24462890625 4.1793646812438965 9.0
+858.1715609285675 5911.5341796875 4.1790900230407715 9.0
+858.1919954635596 5912.51318359375 4.178591728210449 9.0
+858.2328648333641 5921.34765625 4.178730010986328 9.0
+858.253299368298 5914.1748046875 4.177586078643799 9.0
+858.2941687379862 5932.06640625 4.180440902709961 9.0
+858.3146032728037 5931.10791015625 4.180868148803711 9.0
+858.3350379075564 5923.5 4.179356098175049 9.0
+858.3554726423754 5920.83056640625 4.179435729980469 9.0
+858.3759071770764 5923.69287109375 4.179263591766357 9.0
+858.3963419117717 5919.27099609375 4.179609775543213 9.0
+858.4167765464736 5925.296875 4.180281162261963 9.0
+858.4372111811754 5927.94970703125 4.1805267333984375 9.0
+858.4576458157535 5920.22314453125 4.179010391235352 9.0
+858.4780804503971 5927.38037109375 4.180308818817139 9.0
+858.4985150849825 5927.01904296875 4.179421901702881 9.0
+858.5189497195606 5922.9638671875 4.180204391479492 9.0
+858.5393843540878 5919.77001953125 4.17969274520874 9.0
+858.5598189886077 5920.6796875 4.179860591888428 9.0
+858.5802537230775 5917.1767578125 4.179361820220947 9.0
+858.6006882575457 5922.44140625 4.180062770843506 9.0
+858.62112299195 5919.64892578125 4.179304122924805 9.0
+858.64155752636 5925.560546875 4.180004596710205 9.0
+858.6824268951168 5918.7734375 4.179263114929199 9.0
+858.7028614294104 5923.1923828125 4.179773330688477 9.0
+858.7232960637048 5920.52685546875 4.178804874420166 9.0
+858.7437307979926 5918.37744140625 4.178765773773193 9.0
+858.764165332228 5916.9697265625 4.178874492645264 9.0
+858.7846000664649 5911.82958984375 4.178206443786621 9.0
+858.8459039689333 5914.322265625 4.178743362426758 9.0
+858.8663386031039 5921.54638671875 4.179026126861572 9.0
+858.907207871227 5921.20361328125 4.178802967071533 9.0
+858.927642505223 5920.7451171875 4.179619312286377 9.0
+858.9480771392264 5925.798828125 4.180108070373535 9.0
+858.9685117732297 5920.66748046875 4.179468631744385 9.0
+858.9889464071093 5912.25634765625 4.178726673126221 9.0
+859.009381140997 5914.90771484375 4.178699970245361 9.0
+859.0298156748831 5921.666015625 4.178930282592773 9.0
+859.0502503087628 5915.32275390625 4.178908824920654 9.0
+859.070685042534 5921.27197265625 4.179625988006592 9.0
+859.0911196764209 5917.685546875 4.1791887283325195 9.0
+859.1115542101834 5917.853515625 4.1782732009887695 9.0
+859.1319889438382 5910.77197265625 4.179357528686523 9.0
+859.1524235776087 5918.19482421875 4.179433345794678 9.0
+859.1728582112555 5911.3564453125 4.177899360656738 9.0
+859.1932928449096 5917.11376953125 4.1786346435546875 9.0
+859.2137274785637 5917.8916015625 4.179462432861328 9.0
+859.2341622120948 5930.72314453125 4.179749488830566 9.0
+859.2545967457481 5917.67724609375 4.179284572601318 9.0
+859.275031279285 5917.24609375 4.17849588394165 9.0
+859.3159006462374 5913.77294921875 4.177638053894043 9.0
+859.3363351796579 5920.27197265625 4.178943634033203 9.0
+859.3567699130726 5916.86572265625 4.179227352142334 9.0
+859.3772045463775 5918.10693359375 4.178138256072998 9.0
+859.4180738130963 5910.14111328125 4.1785054206848145 9.0
+859.4385084464011 5908.65576171875 4.177621841430664 9.0
+859.4589431795903 5913.34912109375 4.178654193878174 9.0
+859.4793777128871 5916.392578125 4.178038120269775 9.0
+859.4998123460755 5912.1875 4.177269458770752 9.0
+859.5202470792574 5917.58740234375 4.1783928871154785 9.0
+859.5406816123286 5908.818359375 4.177709102630615 9.0
+859.5611163454014 5912.251953125 4.178280353546143 9.0
+859.6019856115381 5908.30712890625 4.177621841430664 9.0
+859.6224202446101 5911.3212890625 4.178554534912109 9.0
+859.663289510514 5912.416015625 4.179074764251709 9.0
+859.6837241433532 5912.224609375 4.178098678588867 9.0
+859.7041587763088 5906.06884765625 4.177304267883301 9.0
+859.7245934091407 5911.51708984375 4.178318977355957 9.0
+859.7450281418642 5907.05517578125 4.178037166595459 9.0
+859.7654626746953 5912.3701171875 4.17932653427124 9.0
+859.7858974074188 5907.5361328125 4.178889751434326 9.0
+859.8063320401416 5907.6162109375 4.178569793701172 9.0
+859.8267665728636 5902.77392578125 4.178328990936279 9.0
+859.8472013054634 5906.27685546875 4.177450656890869 9.0
+859.888070470668 5909.984375 4.179067611694336 9.0
+859.9085052031587 5906.0703125 4.177366256713867 9.0
+859.9289397357643 5903.0615234375 4.178475379943848 9.0
+859.9698091006212 5904.57421875 4.178311347961426 9.0
+859.990243632994 5903.96337890625 4.177647590637207 9.0
+860.0106783654774 5898.37744140625 4.178102016448975 9.0
+860.0311129977345 5892.65380859375 4.17765998840332 9.0
+860.0515475301072 5901.88134765625 4.178028583526611 9.0
+860.0719822623578 5907.18798828125 4.178837299346924 9.0
+860.0924168946149 5908.0556640625 4.178183078765869 9.0
+860.1128515267555 5907.587890625 4.1776885986328125 9.0
+860.1332861590054 5907.31103515625 4.177933692932129 9.0
+860.153720791146 5902.76416015625 4.177692890167236 9.0
+860.1945900553037 5898.96142578125 4.177072048187256 9.0
+860.215024687328 5895.34765625 4.176205635070801 9.0
+860.235459419353 5898.357421875 4.176896095275879 9.0
+860.2558939512528 5893.33251953125 4.176115036010742 9.0
+860.2763285831606 5898.921875 4.177204608917236 9.0
+860.2967633150693 5893.99658203125 4.177656650543213 9.0
+860.3171979469698 5898.212890625 4.176642417907715 9.0
+860.3376325787613 5893.9072265625 4.175973892211914 9.0
+860.3785018422204 5889.3369140625 4.176614761352539 9.0
+860.3989364740119 5893.9013671875 4.176319122314453 9.0
+860.4398057372382 5898.80908203125 4.176501750946045 9.0
+860.4602403689132 5894.23828125 4.176543712615967 9.0
+860.4806750004718 5898.3525390625 4.176024913787842 9.0
+860.5011096320231 5894.7119140625 4.176214694976807 9.0
+860.5215442634653 5894.92529296875 4.176362991333008 9.0
+860.5419788949075 5894.712890625 4.176799774169922 9.0
+860.5624136263432 5888.0517578125 4.175807952880859 9.0
+860.5828481576682 5892.51953125 4.175921440124512 9.0
+860.603282788994 5888.22509765625 4.175079822540283 9.0
+860.6237175203132 5887.205078125 4.175563335418701 9.0
+860.6441520516382 5893.17431640625 4.1762847900390625 9.0
+860.6645866828476 5886.3427734375 4.174073219299316 9.0
+860.6850214140504 5913.306640625 4.176899433135986 9.0
+860.7054559451426 5898.666015625 4.174551486968994 9.0
+860.746325307322 5881.4130859375 4.17450475692749 9.0
+860.7667598384141 5888.9248046875 4.175013542175293 9.0
+860.7871945693914 5895.15283203125 4.1761651039123535 9.0
+860.8280638313372 5890.59326171875 4.175625324249268 9.0
+860.8689330930501 5891.43896484375 4.175720691680908 9.0
+860.8893677237938 5885.5146484375 4.174712657928467 9.0
+860.9098023545375 5872.33740234375 4.17378044128418 9.0
+860.930236985274 5892.30810546875 4.1768341064453125 9.0
+860.9506717160184 5871.66943359375 4.174126625061035 9.0
+860.9711063466384 5875.51953125 4.1745123863220215 9.0
+860.9915408772649 5885.080078125 4.174953460693359 9.0
+861.0324102383966 5886.0 4.17459774017334 9.0
+861.0528447687902 5883.4990234375 4.174716949462891 9.0
+861.0732794993019 5880.58056640625 4.173915386199951 9.0
+861.093714129689 5879.74072265625 4.174121379852295 9.0
+861.1141487600835 5883.02685546875 4.174377918243408 9.0
+861.1345833903615 5873.70947265625 4.173168182373047 9.0
+861.1754526509103 5876.845703125 4.173831939697266 9.0
+861.2163218113419 5877.33056640625 4.174294948577881 9.0
+861.2367565415043 5880.22412109375 4.1743268966674805 9.0
+861.2776257015867 5877.29541015625 4.17366886138916 9.0
+861.3184950615614 5884.87255859375 4.1741790771484375 9.0
+861.3389297914837 5878.173828125 4.173427104949951 9.0
+861.3593643212953 5879.3349609375 4.173763275146484 9.0
+861.3797989512241 5885.31884765625 4.174047946929932 9.0
+861.4002336809135 5870.869140625 4.172809600830078 9.0
+861.4411028404211 5874.41357421875 4.173373222351074 9.0
+861.4615375701105 5868.60498046875 4.1723432540893555 9.0
+861.4819721996901 5870.9287109375 4.173022270202637 9.0
+861.5024067292688 5874.05224609375 4.173393726348877 9.0
+861.5228414588419 5863.01171875 4.171947956085205 9.0
+861.543276088305 5872.5166015625 4.172883987426758 9.0
+861.5637107177608 5885.52001953125 4.174248695373535 9.0
+861.584145347224 5863.9677734375 4.171396255493164 9.0
+861.6045799765707 5869.09765625 4.171022891998291 9.0
+861.6250147059109 5867.34912109375 4.172262668609619 9.0
+861.6454492352568 5865.45849609375 4.171092510223389 9.0
+861.6863185935945 5867.20947265625 4.172091960906982 9.0
+861.706753122824 5861.9970703125 4.171784400939941 9.0
+861.7271878519387 5866.06005859375 4.171896934509277 9.0
+861.7476224809288 5866.01904296875 4.172530174255371 9.0
+861.768057010042 5859.796875 4.17167329788208 9.0
+861.8089262679132 5855.67578125 4.170230865478516 9.0
+861.8293608967942 5863.99169921875 4.171087741851807 9.0
+861.849795625676 5862.77392578125 4.170996189117432 9.0
+861.8702301544399 5868.71826171875 4.1703996658325195 9.0
+861.8906647831973 5868.01123046875 4.171259880065918 9.0
+861.9110995119627 5865.36376953125 4.169600963592529 9.0
+861.9315340406029 5864.8291015625 4.170030117034912 9.0
+861.9519687692518 5863.23681640625 4.171387672424316 9.0
+861.9724033977836 5860.783203125 4.170909881591797 9.0
+861.9928380263082 5861.02392578125 4.170589923858643 9.0
+862.01327265484 5863.2470703125 4.171126842498779 9.0
+862.0337072832554 5861.1171875 4.171431541442871 9.0
+862.0541419116635 5855.2587890625 4.170111656188965 9.0
+862.0745765400789 5859.419921875 4.170892715454102 9.0
+862.0950111683778 5860.92626953125 4.1707000732421875 9.0
+862.1154457965531 5861.181640625 4.169999122619629 9.0
+862.1563150530346 5851.82177734375 4.169135093688965 9.0
+862.1767497810943 5858.787109375 4.171347618103027 9.0
+862.1971844091604 5856.8994140625 4.170045852661133 9.0
+862.2176189372258 5858.70361328125 4.171381950378418 9.0
+862.2584882931187 5853.90625 4.1709980964660645 9.0
+862.2789228210677 5850.14501953125 4.170703411102295 9.0
+862.2993575488945 5843.28662109375 4.169164657592773 9.0
+862.3197921767278 5852.0048828125 4.170794486999512 9.0
+862.3402269044454 5858.1025390625 4.170907497406006 9.0
+862.3606614321543 5862.9248046875 4.172149658203125 9.0
+862.3810960597548 5853.76611328125 4.1706318855285645 9.0
+862.4015306873553 5848.08740234375 4.17020845413208 9.0
+862.4219653149485 5844.0458984375 4.169967174530029 9.0
+862.4423999424325 5847.33349609375 4.170304298400879 9.0
+862.4628345699166 5844.919921875 4.170014381408691 9.0
+862.4832691973934 5847.73486328125 4.169464588165283 9.0
+862.503703824761 5857.982421875 4.171169281005859 9.0
+862.5241384520123 5855.35546875 4.170475482940674 9.0
+862.5445730793726 5854.326171875 4.1702189445495605 9.0
+862.5650078065082 5854.9189453125 4.1702423095703125 9.0
+862.5854423337587 5847.05078125 4.1690521240234375 9.0
+862.6058769608862 5845.62939453125 4.170527458190918 9.0
+862.6263116879054 5848.28662109375 4.170748233795166 9.0
+862.646746214923 5850.45751953125 4.170660972595215 9.0
+862.6671808419342 5847.58642578125 4.170679569244385 9.0
+862.6876155688369 5847.630859375 4.170264720916748 9.0
+862.7080501957389 5852.12841796875 4.170024871826172 9.0
+862.7284848226336 5851.36181640625 4.169683456420898 9.0
+862.7489194494192 5844.26708984375 4.170603275299072 9.0
+862.7693540761975 5847.8916015625 4.170981407165527 9.0
+862.7897888028674 5837.91845703125 4.170302391052246 9.0
+862.8306579560885 5833.9072265625 4.170037269592285 9.0
+862.8715272090703 5828.33203125 4.169369697570801 9.0
+862.8919618354994 5837.03125 4.170825481414795 9.0
+862.9123965619365 5842.59619140625 4.169409275054932 9.0
+862.9328310882556 5840.11083984375 4.169146537780762 9.0
+862.953265814569 5838.85791015625 4.169257640838623 9.0
+862.9737004407725 5835.7470703125 4.169040203094482 9.0
+862.9941349669753 5837.81396484375 4.169663429260254 9.0
+863.0145696931722 5838.732421875 4.169412612915039 9.0
+863.0350043191429 5838.17626953125 4.1696014404296875 9.0
+863.0554388452292 5842.78955078125 4.170083999633789 9.0
+863.0758735711934 5844.8232421875 4.169567108154297 9.0
+863.0963080971633 5830.67919921875 4.16836404800415 9.0
+863.1167427230175 5827.76513671875 4.168251991271973 9.0
+863.1371774488653 5827.9296875 4.169084072113037 9.0
+863.1576119746023 5831.4833984375 4.169841289520264 9.0
+863.1780467003409 5838.82373046875 4.170809268951416 9.0
+863.1984813260715 5827.921875 4.168928146362305 9.0
+863.2393505771979 5839.80126953125 4.170022964477539 9.0
+863.259785202812 5835.23583984375 4.168698310852051 9.0
+863.2802198282006 5838.85546875 4.169532299041748 9.0
+863.3006544537056 5840.02587890625 4.169358730316162 9.0
+863.3210890789705 5835.724609375 4.168461322784424 9.0
+863.3415238043599 5832.857421875 4.168541431427002 9.0
+863.3619584296321 5831.896484375 4.168746471405029 9.0
+863.4028276799363 5831.07177734375 4.168356418609619 9.0
+863.4232623050921 5826.90869140625 4.168379306793213 9.0
+863.4436968301234 5832.306640625 4.168868541717529 9.0
+863.4641315550471 5830.31103515625 4.168440818786621 9.0
+863.4845661800864 5833.35888671875 4.168790340423584 9.0
+863.5050007048849 5828.470703125 4.169084548950195 9.0
+863.5458700544987 5839.95166015625 4.169460773468018 9.0
+863.5663047792987 5825.78076171875 4.168442249298096 9.0
+863.5867393038716 5823.419921875 4.16834020614624 9.0
+863.6071739285617 5825.19140625 4.167760372161865 9.0
+863.6276086531288 5825.78515625 4.168509006500244 9.0
+863.6480431775854 5828.662109375 4.169198513031006 9.0
+863.6684778020426 5825.22900390625 4.169492721557617 9.0
+863.6889125264934 5818.10009765625 4.168262481689453 9.0
+863.7093470508335 5819.8349609375 4.167905807495117 9.0
+863.7297816750506 5821.609375 4.1680216789245605 9.0
+863.7502162993915 5822.68798828125 4.167912483215332 9.0
+863.7706509234995 5830.71923828125 4.168975353240967 9.0
+863.791085647601 5824.9697265625 4.1684250831604 9.0
+863.8115201717083 5825.50634765625 4.168909072875977 9.0
+863.8319547956999 5825.5 4.169057369232178 9.0
+863.852389519685 5829.72802734375 4.169226169586182 9.0
+863.8728241435601 5821.3583984375 4.168059825897217 9.0
+863.9136933913032 5831.140625 4.168921947479248 9.0
+863.934128015062 5828.08544921875 4.168229103088379 9.0
+863.9545625387036 5821.35400390625 4.168307304382324 9.0
+863.9749972623395 5827.79443359375 4.168393611907959 9.0
+863.9954318858654 5817.36669921875 4.166718482971191 9.0
+864.0158666093921 5823.5029296875 4.168168067932129 9.0
+864.03630113291 5831.54248046875 4.168680667877197 9.0
+864.0567357562031 5817.01708984375 4.167704105377197 9.0
+864.0771704796134 5824.72509765625 4.167649745941162 9.0
+864.0976050028985 5819.01318359375 4.167344570159912 9.0
+864.1180396260752 5823.57275390625 4.167653560638428 9.0
+864.1384743493691 5817.6220703125 4.167403697967529 9.0
+864.1589088724213 5823.982421875 4.167029857635498 9.0
+864.1793435954824 5825.89697265625 4.168388843536377 9.0
+864.1997782185426 5819.337890625 4.166669845581055 9.0
+864.2202127414785 5818.3544921875 4.167248725891113 9.0
+864.2406474643067 5828.8203125 4.167297840118408 9.0
+864.2610820871341 5821.4609375 4.166660308837891 9.0
+864.2815166099535 5819.6953125 4.167133331298828 9.0
+864.3019513326653 5823.13134765625 4.167311191558838 9.0
+864.32238595526 5827.81103515625 4.168026924133301 9.0
+864.3428204778465 5821.130859375 4.16633939743042 9.0
+864.3836898229201 5824.59765625 4.1671295166015625 9.0
+864.4041244453911 5817.234375 4.165472030639648 9.0
+864.4245590677529 5814.52099609375 4.165813446044922 9.0
+864.4449936899982 5824.28271484375 4.166562080383301 9.0
+864.4654283122363 5825.322265625 4.166863441467285 9.0
+864.4858629344817 5822.9765625 4.167220592498779 9.0
+864.5062975566107 5825.220703125 4.166337013244629 9.0
+864.5267321787323 5815.810546875 4.165441989898682 9.0
+864.5471668007449 5820.38818359375 4.165990829467773 9.0
+864.567601422641 5817.23779296875 4.166013717651367 9.0
+864.5880361445306 5820.005859375 4.166817665100098 9.0
+864.608470666426 5812.9453125 4.166000843048096 9.0
+864.6289053882065 5812.99267578125 4.166648864746094 9.0
+864.6493400098625 5811.54931640625 4.166667461395264 9.0
+864.669774531525 5810.05712890625 4.166074752807617 9.0
+864.6902092531818 5812.89794921875 4.167120456695557 9.0
+864.7106438747287 5815.86572265625 4.165879726409912 9.0
+864.7310783961584 5819.36328125 4.166536808013916 9.0
+864.7515131175896 5815.658203125 4.166149139404297 9.0
+864.7719477388964 5823.31396484375 4.166136264801025 9.0
+864.7923822602097 5820.20654296875 4.166708469390869 9.0
+864.8128169815172 5818.5283203125 4.165921688079834 9.0
+864.8332516025985 5811.8134765625 4.165940761566162 9.0
+864.8536863237969 5813.29736328125 4.16680383682251 9.0
+864.8741208447609 5813.50634765625 4.166293144226074 9.0
+864.8945554658349 5811.06982421875 4.166112899780273 9.0
+864.9149901868004 5809.10546875 4.1656341552734375 9.0
+864.9354247076408 5806.4609375 4.164713382720947 9.0
+864.9558593283728 5797.90966796875 4.164098739624023 9.0
+864.9762940492219 5813.91259765625 4.165874004364014 9.0
+864.9967285698367 5808.77099609375 4.165935039520264 9.0
+865.017163190445 5809.0478515625 4.164992332458496 9.0
+865.0375979110613 5804.00830078125 4.164510726928711 9.0
+865.0580324315524 5811.26025390625 4.1651506423950195 9.0
+865.0784671519359 5814.35546875 4.1660966873168945 9.0
+865.0989017723186 5813.3857421875 4.165846347808838 9.0
+865.1193362927006 5810.83203125 4.1643476486206055 9.0
+865.1397710129604 5813.37548828125 4.165543079376221 9.0
+865.1602056331103 5820.2236328125 4.165853023529053 9.0
+865.1806401532522 5813.2509765625 4.164617538452148 9.0
+865.2010748732864 5815.7626953125 4.1640424728393555 9.0
+865.2215094933199 5815.8876953125 4.164875507354736 9.0
+865.2419442132305 5809.11767578125 4.164099216461182 9.0
+865.2623787331468 5810.4541015625 4.163559913635254 9.0
+865.2828133529474 5817.06640625 4.16547155380249 9.0
+865.3032480727416 5817.52197265625 4.165005683898926 9.0
+865.323682592425 5815.3896484375 4.164255142211914 9.0
+865.3441172119929 5812.46240234375 4.163450241088867 9.0
+865.3645519315542 5815.51708984375 4.163290500640869 9.0
+865.4054210704562 5817.46630859375 4.16409158706665 9.0
+865.4258557899011 5815.587890625 4.164285182952881 9.0
+865.4462903091189 5803.7763671875 4.16375732421875 9.0
+865.4667250284547 5811.33837890625 4.1641106605529785 9.0
+865.4871596475496 5812.87109375 4.164853572845459 9.0
+865.5075942666517 5811.2568359375 4.1642165184021 9.0
+865.5280288857539 5812.68310546875 4.164088726043701 9.0
+865.5484635047324 5810.20458984375 4.163819789886475 9.0
+865.5688981236017 5820.8955078125 4.165451526641846 9.0
+865.589332742471 5804.3408203125 4.1634416580200195 9.0
+865.6097673612167 5806.82958984375 4.164690017700195 9.0
+865.6302019799696 5810.43505859375 4.164812088012695 9.0
+865.6506365987225 5808.79931640625 4.1630167961120605 9.0
+865.6710712172353 5809.2314453125 4.164543628692627 9.0
+865.6915058357554 5811.505859375 4.164356231689453 9.0
+865.7119404542755 5815.806640625 4.165472507476807 9.0
+865.7732443092464 5826.3173828125 4.166114330291748 9.0
+865.7936789274099 5804.9033203125 4.165031433105469 9.0
+865.8141136455815 5812.5166015625 4.164732933044434 9.0
+865.8549827816823 5806.2001953125 4.164652347564697 9.0
+865.8754174996211 5816.15869140625 4.165508270263672 9.0
+865.8958520174419 5812.61181640625 4.165889739990234 9.0
+865.916286735257 5815.51318359375 4.166252136230469 9.0
+865.9367213529622 5811.7412109375 4.165095329284668 9.0
+865.9571558706666 5812.41259765625 4.165202617645264 9.0
+865.9980252057212 5812.94287109375 4.165492534637451 9.0
+866.0184598231863 5807.552734375 4.165065288543701 9.0
+866.0388944406586 5816.58349609375 4.165393352508545 9.0
+866.0593290580146 5809.662109375 4.16455078125 9.0
+866.0797636752541 5804.46728515625 4.163870811462402 9.0
+866.1001982924863 5817.24755859375 4.165201663970947 9.0
+866.1410676266096 5803.53173828125 4.1639084815979 9.0
+866.1615021436155 5800.42138671875 4.163727283477783 9.0
+866.1819367605058 5807.6318359375 4.164653778076172 9.0
+866.2023714773895 5813.99609375 4.165017127990723 9.0
+866.2228060941634 5815.36279296875 4.165175914764404 9.0
+866.2432406109365 5816.49267578125 4.165093898773193 9.0
+866.2841098441277 5803.88427734375 4.163700580596924 9.0
+866.3249791770868 5815.82275390625 4.164254665374756 9.0
+866.3454136935106 5801.04736328125 4.162741661071777 9.0
+866.3658484098196 5805.9814453125 4.163917064666748 9.0
+866.3862830260041 5814.14306640625 4.164956092834473 9.0
+866.4271522582712 5808.8515625 4.164666652679443 9.0
+866.4475868743393 5817.326171875 4.1643242835998535 9.0
+866.4680213902975 5803.26611328125 4.163534641265869 9.0
+866.4884561062572 5804.8916015625 4.163712024688721 9.0
+866.5088907219761 5804.8779296875 4.163496971130371 9.0
+866.5293254378194 5811.00341796875 4.163667678833008 9.0
+866.5497599534283 5803.7392578125 4.163646221160889 9.0
+866.5701945690307 5796.3759765625 4.161813735961914 9.0
+866.5906292846412 5805.4873046875 4.16353178024292 9.0
+866.6110638001337 5817.0400390625 4.165081977844238 9.0
+866.6314984155033 5820.61865234375 4.163829326629639 9.0
+866.6519331308809 5814.36572265625 4.16335391998291 9.0
+866.6928022612774 5811.95849609375 4.162822246551514 9.0
+866.7132369764222 5810.92529296875 4.16395378112793 9.0
+866.7336715914425 5814.06005859375 4.162134647369385 9.0
+866.7541062064702 5811.99951171875 4.163570404052734 9.0
+866.7745408213814 5825.4638671875 4.1662726402282715 9.0
+866.7949754361762 5813.28662109375 4.163333415985107 9.0
+866.8154100509637 5817.677734375 4.164455413818359 9.0
+866.8562792801968 5819.8466796875 4.165240287780762 9.0
+866.8971485093207 5818.3798828125 4.164799213409424 9.0
+866.9380177379717 5812.5888671875 4.163958549499512 9.0
+866.9584523523008 5816.11376953125 4.163650989532471 9.0
+866.978887066507 5821.17724609375 4.164185047149658 9.0
+866.9993215806026 5819.5224609375 4.164309024810791 9.0
+867.0197561945824 5818.171875 4.163957118988037 9.0
+867.0401909085558 5812.25927734375 4.163710117340088 9.0
+867.0606254224185 5820.95703125 4.1648712158203125 9.0
+867.081060036282 5816.216796875 4.164400577545166 9.0
+867.1014947500225 5815.00830078125 4.164437294006348 9.0
+867.1219292637688 5821.23974609375 4.165327548980713 9.0
+867.1423638772831 5819.1044921875 4.164301872253418 9.0
+867.1627985909072 5817.45166015625 4.164200782775879 9.0
+867.1832331043042 5816.85400390625 4.165224552154541 9.0
+867.2036678177028 5814.70947265625 4.164610862731934 9.0
+867.2241024309769 5813.11279296875 4.164409637451172 9.0
+867.2445370442583 5811.5927734375 4.164752960205078 9.0
+867.2649716574233 5817.30419921875 4.165769577026367 9.0
+867.285406270581 5814.73779296875 4.165242671966553 9.0
+867.3058408835132 5816.78125 4.16486930847168 9.0
+867.3262754964453 5815.2490234375 4.165175437927246 9.0
+867.3467101093702 5817.97265625 4.16563606262207 9.0
+867.3671447221859 5816.9296875 4.164913654327393 9.0
+867.387579434886 5812.02783203125 4.165290355682373 9.0
+867.4284486600445 5816.46630859375 4.164630889892578 9.0
+867.4488832726274 5821.54638671875 4.16576623916626 9.0
+867.4693177849695 5821.0556640625 4.165395259857178 9.0
+867.4897524973203 5806.68798828125 4.163937568664551 9.0
+867.5101871096704 5822.302734375 4.164528846740723 9.0
+867.5306216217796 5820.1875 4.165102958679199 9.0
+867.5510563338976 5821.041015625 4.165327072143555 9.0
+867.5714909460148 5828.68408203125 4.166110515594482 9.0
+867.5919254578912 5815.56396484375 4.16499137878418 9.0
+867.6123601697764 5820.54052734375 4.165126800537109 9.0
+867.63279468166 5826.76806640625 4.165333271026611 9.0
+867.6532293934215 5825.13525390625 4.1658220291137695 9.0
+867.6736640050731 5825.0322265625 4.165802955627441 9.0
+867.6940985166075 5821.61181640625 4.164926052093506 9.0
+867.7145332281361 5826.5986328125 4.164910316467285 9.0
+867.7349678395549 5822.4453125 4.165713310241699 9.0
+867.7554024509736 5828.19384765625 4.165738105773926 9.0
+867.7758370622687 5828.3857421875 4.165401935577393 9.0
+867.7962716734546 5829.58349609375 4.16607141494751 9.0
+867.8167062845241 5841.064453125 4.167052268981934 9.0
+867.8371408955863 5827.08837890625 4.165492534637451 9.0
+867.8575755065394 5826.63818359375 4.166014194488525 9.0
+867.8780102174933 5826.10302734375 4.1660895347595215 9.0
+867.8984448283227 5829.32470703125 4.166043281555176 9.0
+867.9188793390422 5823.1220703125 4.165707588195801 9.0
+867.9393140497559 5827.9599609375 4.166125297546387 9.0
+867.9597486603598 5828.13818359375 4.1663384437561035 9.0
+867.9801831708464 5825.43701171875 4.166065692901611 9.0
+868.0006178812182 5829.69140625 4.165658473968506 9.0
+868.0210524915819 5830.46044921875 4.166481018066406 9.0
+868.0414870018358 5825.8564453125 4.165853023529053 9.0
+868.0619217120839 5829.73486328125 4.165660858154297 9.0
+868.082356322222 5826.5419921875 4.165598392486572 9.0
+868.1027910322446 5836.205078125 4.166755676269531 9.0
+868.1232255421492 5842.3115234375 4.166931629180908 9.0
+868.1436601520472 5832.72998046875 4.166039943695068 9.0
+868.1640948619533 5838.4892578125 4.166822910308838 9.0
+868.1845293716178 5822.28076171875 4.165042400360107 9.0
+868.2049639812903 5830.0341796875 4.166162967681885 9.0
+868.2253986908472 5826.45068359375 4.166845321655273 9.0
+868.2458332002861 5834.19384765625 4.167358875274658 9.0
+868.2867024190418 5832.595703125 4.166464328765869 9.0
+868.3071370283578 5840.6328125 4.167386054992676 9.0
+868.327571737449 5835.5341796875 4.166599273681641 9.0
+868.3480062465387 5838.001953125 4.166443347930908 9.0
+868.3684408556292 5841.06689453125 4.167335510253906 9.0
+868.3888755644803 5836.513671875 4.166831970214844 9.0
+868.4093100733371 5844.86669921875 4.167841911315918 9.0
+868.4297446821874 5839.02880859375 4.1669230461120605 9.0
+868.450179390813 5841.92724609375 4.167471885681152 9.0
+868.4706139994378 5835.81494140625 4.167232513427734 9.0
+868.4910486080553 5844.25927734375 4.168389797210693 9.0
+868.5114832164472 5838.36767578125 4.1675214767456055 9.0
+868.5319178248392 5837.81640625 4.16752815246582 9.0
+868.5523524331074 5832.0126953125 4.167055606842041 9.0
+868.572787041383 5834.3193359375 4.167561054229736 9.0
+868.5932216494257 5830.6953125 4.1671929359436035 9.0
+868.6136563574619 5835.44775390625 4.167426109313965 9.0
+868.6340908655038 5825.44189453125 4.166539192199707 9.0
+868.6545254733137 5845.9111328125 4.167938232421875 9.0
+868.6749601811171 5838.57568359375 4.16750955581665 9.0
+868.6953946889262 5839.8271484375 4.167572021484375 9.0
+868.715829396504 5837.81005859375 4.167353630065918 9.0
+868.7566985115336 5841.19921875 4.168435096740723 9.0
+868.777133218995 5829.55029296875 4.166814804077148 9.0
+868.7975678262155 5838.4501953125 4.167965412139893 9.0
+868.8384370406711 5841.2138671875 4.168485641479492 9.0
+868.879306154653 5844.0302734375 4.168288230895996 9.0
+868.8997408616415 5851.99853515625 4.16908073425293 9.0
+868.9406100751658 5864.0419921875 4.170682430267334 9.0
+868.9610446818115 5856.65283203125 4.170116424560547 9.0
+868.9814792884499 5849.462890625 4.168825149536133 9.0
+869.0019138948628 5844.59912109375 4.1685895919799805 9.0
+869.0223485012684 5847.7607421875 4.168379783630371 9.0
+869.0427831075649 5843.1904296875 4.168424606323242 9.0
+869.0632177138614 5842.96484375 4.168365478515625 9.0
+869.0836523200414 5844.74853515625 4.1682963371276855 9.0
+869.1040869260978 5837.30126953125 4.167922496795654 9.0
+869.1245216320458 5843.53369140625 4.168572902679443 9.0
+869.144956137985 5843.9111328125 4.168347358703613 9.0
+869.1653908438166 5846.76953125 4.168845176696777 9.0
+869.185825449531 5845.32861328125 4.1678690910339355 9.0
+869.2062599551282 5849.97607421875 4.167972087860107 9.0
+869.2266946607197 5850.53662109375 4.16841459274292 9.0
+869.2471292662012 5848.99755859375 4.168060779571533 9.0
+869.2675637715583 5860.99169921875 4.169610500335693 9.0
+869.2879984769243 5848.01220703125 4.167999267578125 9.0
+869.308433082173 5843.501953125 4.168374061584473 9.0
+869.3288675873046 5843.48291015625 4.168553829193115 9.0
+869.349302292314 5842.7197265625 4.167968273162842 9.0
+869.3697368973299 5842.91552734375 4.168464660644531 9.0
+869.3901716022228 5841.79443359375 4.168148517608643 9.0
+869.4106061070052 5844.14794921875 4.167909145355225 9.0
+869.4310407116718 5848.76171875 4.168747901916504 9.0
+869.451475416332 5848.83447265625 4.168335437774658 9.0
+869.4719099208814 5842.55810546875 4.16768217086792 9.0
+869.4923445253153 5858.35888671875 4.169453144073486 9.0
+869.5127792297426 5859.8896484375 4.169007778167725 9.0
+869.5332137340592 5858.2490234375 4.169035911560059 9.0
+869.5536483382602 5854.091796875 4.168764114379883 9.0
+869.5740829423376 5859.80615234375 4.168630599975586 9.0
+869.5945175463057 5859.10107421875 4.16923713684082 9.0
+869.6149522502747 5867.013671875 4.170156002044678 9.0
+869.6558213579701 5859.70263671875 4.1690850257873535 9.0
+869.6762560615898 5855.5703125 4.168453693389893 9.0
+869.6966906652015 5860.66064453125 4.168771743774414 9.0
+869.7171251687032 5853.8955078125 4.168674945831299 9.0
+869.7375598720901 5859.48974609375 4.169511795043945 9.0
+869.7579944754689 5861.19482421875 4.169538497924805 9.0
+869.7784289787378 5864.130859375 4.169977188110352 9.0
+869.7988636818918 5857.41015625 4.169071197509766 9.0
+869.8192982849214 5864.17333984375 4.169431686401367 9.0
+869.839732987959 5851.99365234375 4.168091297149658 9.0
+869.8601674908787 5854.8125 4.168918132781982 9.0
+869.8806020936754 5858.38671875 4.169332504272461 9.0
+869.9010367963638 5860.3603515625 4.1695356369018555 9.0
+869.9214712990506 5856.673828125 4.169795989990234 9.0
+869.9419059014981 5859.078125 4.169125556945801 9.0
+869.9623406039536 5853.87744140625 4.168881893157959 9.0
+869.9827751064076 5864.20166015625 4.1700825691223145 9.0
+870.0032097086223 5863.65576171875 4.169678211212158 9.0
+870.023644410845 5866.76416015625 4.169571876525879 9.0
+870.0440789129498 5864.98974609375 4.169631004333496 9.0
+870.0645136149324 5858.09375 4.168633937835693 9.0
+870.0849482169215 5873.77294921875 4.170508861541748 9.0
+870.1053828186705 5873.6611328125 4.170228481292725 9.0
+870.1258174204268 5866.98486328125 4.169398307800293 9.0
+870.146252022183 5869.84521484375 4.169755458831787 9.0
+870.1666866237065 5873.458984375 4.169711589813232 9.0
+870.1871212252227 5877.3330078125 4.170371055603027 9.0
+870.2075558265133 5878.49755859375 4.170663833618164 9.0
+870.2279903278031 5869.93505859375 4.169744968414307 9.0
+870.2484250290872 5875.61669921875 4.169630527496338 9.0
+870.268859630145 5862.61767578125 4.1687331199646 9.0
+870.2892943311963 5870.5205078125 4.1700053215026855 9.0
+870.3097288321369 5865.40185546875 4.169378757476807 9.0
+870.3301634329619 5879.06591796875 4.169830322265625 9.0
+870.3505981337803 5876.2470703125 4.1697869300842285 9.0
+870.3710326344881 5875.70263671875 4.170016288757324 9.0
+870.3914672350802 5878.00341796875 4.1701459884643555 9.0
+870.4119019355494 5876.716796875 4.170329570770264 9.0
+870.4323364359079 5869.8359375 4.170005798339844 9.0
+870.4527710362672 5870.70166015625 4.1705641746521 9.0
+870.4732057363872 5873.02587890625 4.17051362991333 9.0
+870.4936402365129 5864.275390625 4.169480323791504 9.0
+870.5140749366401 5871.40771484375 4.170172691345215 9.0
+870.5345095365265 5867.001953125 4.169990539550781 9.0
+870.5549440364193 5871.62158203125 4.170023441314697 9.0
+870.5753787361973 5873.24755859375 4.169822692871094 9.0
+870.5958133358508 5884.751953125 4.17109489440918 9.0
+870.6162479353952 5869.939453125 4.169407844543457 9.0
+870.6366825348232 5869.3291015625 4.169522762298584 9.0
+870.6775517335554 5879.140625 4.170539855957031 9.0
+870.6979863327506 5872.33251953125 4.17042350769043 9.0
+870.7388556309015 5887.70654296875 4.171106338500977 9.0
+870.7592902298638 5882.103515625 4.170410633087158 9.0
+870.7797247287017 5885.05712890625 4.1704277992248535 9.0
+870.8001594274319 5889.1083984375 4.170997142791748 9.0
+870.8205939260442 5884.33203125 4.169869422912598 9.0
+870.84102852465 5880.8046875 4.169203281402588 9.0
+870.8614632231474 5885.796875 4.171012878417969 9.0
+870.8818977215269 5883.82421875 4.170650959014893 9.0
+870.9023323197835 5883.45458984375 4.170746326446533 9.0
+870.9432015160783 5882.49462890625 4.171136379241943 9.0
+870.9636362141027 5877.7421875 4.169992923736572 9.0
+870.9840708120173 5874.6142578125 4.169816493988037 9.0
+871.0045053098147 5881.576171875 4.170221328735352 9.0
+871.0249400074899 5883.99560546875 4.170496463775635 9.0
+871.0453746051717 5894.0380859375 4.171342849731445 9.0
+871.0658091026198 5879.67919921875 4.169955730438232 9.0
+871.0862438000622 5876.8623046875 4.170014381408691 9.0
+871.1066783973947 5896.26904296875 4.172004699707031 9.0
+871.1271129947272 5888.69775390625 4.170989990234375 9.0
+871.1475475918196 5884.72900390625 4.170879364013672 9.0
+871.1679821889193 5881.353515625 4.169280529022217 9.0
+871.1884167859025 5885.05908203125 4.170102119445801 9.0
+871.2088513827621 5894.46142578125 4.171064376831055 9.0
+871.2292859795125 5897.4873046875 4.170693397521973 9.0
+871.2497206761473 5891.24267578125 4.170534610748291 9.0
+871.2701551727732 5899.18701171875 4.171051502227783 9.0
+871.2905897692908 5891.0654296875 4.170537948608398 9.0
+871.3110244656855 5893.82861328125 4.170975685119629 9.0
+871.3314590619702 5897.18994140625 4.171414852142334 9.0
+871.3518935581378 5880.91796875 4.170097827911377 9.0
+871.3723282542996 5889.70947265625 4.170731067657471 9.0
+871.3927628502352 5896.42041015625 4.170389652252197 9.0
+871.4131973461699 5885.18896484375 4.169907093048096 9.0
+871.4336320419825 5890.93115234375 4.170915603637695 9.0
+871.4540666376852 5893.97900390625 4.170904159545898 9.0
+871.4745012333879 5903.591796875 4.171633243560791 9.0
+871.4949358288504 5893.25439453125 4.170609951019287 9.0
+871.5153703243195 5891.34375 4.170388698577881 9.0
+871.5358050196737 5885.78564453125 4.170061111450195 9.0
+871.5562396149035 5899.9521484375 4.170557975769043 9.0
+871.5971088051447 5889.04931640625 4.169867515563965 9.0
+871.6175434000252 5904.59814453125 4.171225547790527 9.0
+871.6379778949122 5894.84033203125 4.170384883880615 9.0
+871.6584125896843 5905.8388671875 4.172441005706787 9.0
+871.678847184332 5903.96337890625 4.172001361846924 9.0
+871.6992818788713 5895.85400390625 4.170312404632568 9.0
+871.719716373409 5902.37353515625 4.171480178833008 9.0
+871.7401509677075 5898.087890625 4.1700825691223145 9.0
+871.7605856620139 5895.970703125 4.170999526977539 9.0
+871.7810202562032 5897.8662109375 4.171718120574951 9.0
+871.8218894442252 5896.2626953125 4.17066764831543 9.0
+871.8423240380653 5891.14892578125 4.169136047363281 9.0
+871.8627585318973 5894.7734375 4.1700825691223145 9.0
+871.8831932256217 5894.697265625 4.169713497161865 9.0
+871.9036278191124 5898.4482421875 4.170064449310303 9.0
+871.9240625125967 5893.125 4.16888952255249 9.0
+871.9444970060867 5893.05029296875 4.169867515563965 9.0
+871.9649315993447 5902.146484375 4.171493053436279 9.0
+871.9853662924797 5894.0615234375 4.169576168060303 9.0
+872.0058007856205 5891.01220703125 4.170401096343994 9.0
+872.0262353785292 5897.52783203125 4.170281887054443 9.0
+872.0466700714314 5885.53466796875 4.169395446777344 9.0
+872.067104564223 5897.71923828125 4.169137954711914 9.0
+872.0875391570153 5900.71240234375 4.170316696166992 9.0
+872.1079738495682 5899.2197265625 4.169078350067139 9.0
+872.1284083420105 5895.63427734375 4.169271469116211 9.0
+872.148843034447 5889.58642578125 4.168942451477051 9.0
+872.1692775267729 5889.09716796875 4.168262004852295 9.0
+872.1897121188667 5895.15478515625 4.1698689460754395 9.0
+872.2101468110777 5889.46337890625 4.168101787567139 9.0
+872.2305813030471 5894.8447265625 4.170068740844727 9.0
+872.2714505866461 5893.5947265625 4.16908073425293 9.0
+872.2918850783899 5897.00146484375 4.169339656829834 9.0
+872.3327543615305 5888.90771484375 4.168605804443359 9.0
+872.3531889528022 5890.037109375 4.168930530548096 9.0
+872.3940581353527 5900.220703125 4.170028209686279 9.0
+872.4349273174448 5888.06298828125 4.169540882110596 9.0
+872.455361908258 5895.31787109375 4.1700239181518555 9.0
+872.475796499064 5888.80712890625 4.16905403137207 9.0
+872.4962311897616 5895.02880859375 4.169968605041504 9.0
+872.516665680334 5897.33447265625 4.170281410217285 9.0
+872.537100270798 5896.60888671875 4.170965194702148 9.0
+872.5575349611463 5895.4345703125 4.169688701629639 9.0
+872.5779694514931 5901.787109375 4.170866012573242 9.0
+872.5984041416013 5900.626953125 4.169407844543457 9.0
+872.6188387317161 5896.89892578125 4.169015407562256 9.0
+872.6392732217064 5891.62451171875 4.168848991394043 9.0
+872.6597079115891 5896.3349609375 4.1691083908081055 9.0
+872.6801425013546 5896.02099609375 4.17000150680542 9.0
+872.7005769910029 5891.966796875 4.1698455810546875 9.0
+872.721011680529 5894.89208984375 4.170357704162598 9.0
+872.7414462699453 5889.10693359375 4.169193267822266 9.0
+872.7618807593535 5896.4716796875 4.170391082763672 9.0
+872.7823154485377 5890.06103515625 4.169325828552246 9.0
+872.8027499377204 5891.11181640625 4.16842794418335 9.0
+872.8231846267809 5898.845703125 4.169668674468994 9.0
+872.8436192157315 5897.28125 4.169714450836182 9.0
+872.8640538045656 5896.14111328125 4.170175552368164 9.0
+872.8844883932761 5891.28564453125 4.1696929931640625 9.0
+872.9049229818775 5891.85302734375 4.169260025024414 9.0
+872.9253575704788 5890.1220703125 4.168636322021484 9.0
+872.94579215884 5894.18115234375 4.169594764709473 9.0
+872.9662267472086 5890.02783203125 4.169390678405762 9.0
+872.9866613353443 5890.07080078125 4.169623374938965 9.0
+873.0070960234734 5888.34423828125 4.168924331665039 9.0
+873.0275305114919 5896.55517578125 4.169262409210205 9.0
+873.0479651993955 5888.98876953125 4.168364524841309 9.0
+873.0683997871747 5885.67138671875 4.1688127517700195 9.0
+873.088834274844 5886.5771484375 4.169046401977539 9.0
+873.1092689625148 5897.92041015625 4.169797420501709 9.0
+873.1297035499447 5892.53857421875 4.169048309326172 9.0
+873.1501380373811 5886.5068359375 4.168275356292725 9.0
+873.1705727245862 5893.47216796875 4.168978214263916 9.0
+873.1910073117833 5895.90673828125 4.168757438659668 9.0
+873.2114417988705 5891.8271484375 4.168694019317627 9.0
+873.2318764858428 5894.31689453125 4.169517517089844 9.0
+873.2523110726906 5896.27880859375 4.1691575050354 9.0
+873.2727457594301 5891.66455078125 4.169247150421143 9.0
+873.2931802460516 5895.4755859375 4.168581485748291 9.0
+873.3136148325502 5888.1220703125 4.168451309204102 9.0
+873.3340495189404 5887.90234375 4.167721271514893 9.0
+873.3544840053291 5893.5458984375 4.168846130371094 9.0
+873.3749185914785 5898.33203125 4.167436599731445 9.0
+873.3953532776359 5900.71630859375 4.167316913604736 9.0
+873.4157877636753 5894.0068359375 4.167359828948975 9.0
+873.4770915209738 5889.22509765625 4.167105674743652 9.0
+873.4975262065418 5890.6259765625 4.167497634887695 9.0
+873.5383952774573 5889.47314453125 4.167144298553467 9.0
+873.5588299626761 5897.2509765625 4.167341709136963 9.0
+873.579264547785 5893.10546875 4.167346000671387 9.0
+873.6201337177627 5892.39111328125 4.16798210144043 9.0
+873.6405683026387 5892.04345703125 4.166890621185303 9.0
+873.6610027872812 5890.2431640625 4.167956829071045 9.0
+873.6814374719179 5887.9326171875 4.167155742645264 9.0
+873.7018720564447 5883.78271484375 4.168091773986816 9.0
+873.7223065408471 5893.09521484375 4.167934417724609 9.0
+873.7427412251418 5891.27392578125 4.166388034820557 9.0
+873.7631758093194 5892.1826171875 4.166009902954102 9.0
+873.783610493374 5887.9609375 4.167280197143555 9.0
+873.804044977318 5885.31494140625 4.165209770202637 9.0
+873.8244795611463 5886.71435546875 4.16674280166626 9.0
+873.8449142449681 5879.857421875 4.166544437408447 9.0
+873.8653487285628 5888.41650390625 4.166467189788818 9.0
+873.8857833121583 5884.6943359375 4.167642593383789 9.0
+873.9062179955145 5890.3330078125 4.167010307312012 9.0
+873.9266524788763 5883.90625 4.165818214416504 9.0
+873.9470870620062 5885.71435546875 4.167291641235352 9.0
+873.9675217451295 5887.16748046875 4.165999889373779 9.0
+873.9879563281429 5884.3623046875 4.1667680740356445 9.0
+874.0083909110399 5880.22509765625 4.166232109069824 9.0
+874.0288254938132 5873.9365234375 4.16536283493042 9.0
+874.0492600764774 5871.4296875 4.1665940284729 9.0
+874.0696946589087 5878.18505859375 4.166294574737549 9.0
+874.0901292414492 5874.7900390625 4.165213584899902 9.0
+874.1105637237633 5907.0751953125 4.168280601501465 9.0
+874.7849050781442 5870.14111328125 4.1612067222595215 9.0
+874.8053397566109 5868.06689453125 4.16334342956543 9.0
+874.8257742350834 5867.1337890625 4.1621551513671875 9.0
+874.8462088133238 5867.20263671875 4.162241458892822 9.0
+874.8666434915576 5864.50439453125 4.162776947021484 9.0
+874.8870779696808 5868.95849609375 4.164548397064209 9.0
+874.9075126475727 5868.19189453125 4.163074493408203 9.0
+874.9279472254566 5869.46923828125 4.164053440093994 9.0
+874.9688163807732 5868.916015625 4.161727428436279 9.0
+874.9892509583078 5888.47705078125 4.164167404174805 9.0
+875.0096855356169 5864.1171875 4.161930561065674 9.0
+875.0301201129259 5869.96826171875 4.163186073303223 9.0
+875.0505546901113 5869.33203125 4.1639204025268555 9.0
+875.0709892671875 5865.49267578125 4.162303924560547 9.0
+875.0914238440309 5858.9736328125 4.162397384643555 9.0
+875.1118584208671 5862.84716796875 4.162716388702393 9.0
+875.1527275742046 5853.99609375 4.160208225250244 9.0
+875.1731621505751 5850.66015625 4.161142349243164 9.0
+875.1935968269536 5860.486328125 4.16266393661499 9.0
+875.2140314032149 5849.716796875 4.161205291748047 9.0
+875.2344658793518 5856.92724609375 4.161177635192871 9.0
+875.254900555381 5852.3984375 4.160229682922363 9.0
+875.2753351311767 5855.1435546875 4.16102409362793 9.0
+875.2957696069643 5862.11279296875 4.162391662597656 9.0
+875.3366388582072 5857.90478515625 4.158553600311279 9.0
+875.3570734336463 5855.92578125 4.158874034881592 9.0
+875.3775080089763 5852.12158203125 4.1596479415893555 9.0
+875.4183771591634 5853.408203125 4.15775203704834 9.0
+875.5001154582642 5850.46728515625 4.158763408660889 9.0
+875.5205499327785 5851.30126953125 4.15872049331665 9.0
+875.5409846071707 5846.9921875 4.157908916473389 9.0
+875.561419181453 5855.50439453125 4.160825252532959 9.0
+875.5818538556196 5848.34228515625 4.158991813659668 9.0
+875.6022883295445 5847.91064453125 4.158447265625 9.0
+875.6227229034776 5842.6484375 4.157567977905273 9.0
+875.6840266244544 5844.33203125 4.159471035003662 9.0
+875.7044612979225 5836.40869140625 4.158278942108154 9.0
+875.7453303443835 5844.31103515625 4.158748149871826 9.0
+875.7861995904968 5843.564453125 4.158026695251465 9.0
+875.8066341632657 5843.8955078125 4.158181667327881 9.0
+875.8270687360346 5834.80224609375 4.157368183135986 9.0
+875.8475033086797 5833.1552734375 4.157214164733887 9.0
+875.8679379811001 5838.7861328125 4.1583991050720215 9.0
+875.8883724535117 5834.58984375 4.157037258148193 9.0
+875.9088070256985 5838.232421875 4.156881332397461 9.0
+875.929241697886 5843.82080078125 4.15753173828125 9.0
+875.9496761698392 5847.99853515625 4.158195972442627 9.0
+875.9905454135078 5839.28369140625 4.156928539276123 9.0
+876.0109798851045 5835.78173828125 4.157400608062744 9.0
+876.0314144567092 5833.849609375 4.156269550323486 9.0
+876.051849028081 5830.95458984375 4.157104969024658 9.0
+876.0722835993365 5832.84716796875 4.157037258148193 9.0
+876.0927182705855 5835.4697265625 4.15703010559082 9.0
+876.1131527416073 5831.77392578125 4.1562581062316895 9.0
+876.1335873125063 5833.85986328125 4.157415866851807 9.0
+876.1540219832968 5829.81884765625 4.156604290008545 9.0
+876.1744564540859 5837.23779296875 4.157316207885742 9.0
+876.1948910246356 5840.2744140625 4.15775728225708 9.0
+876.2153256950769 5837.4453125 4.156947135925293 9.0
+876.235760265401 5826.34228515625 4.1555352210998535 9.0
+876.2561947356007 5829.72265625 4.156815052032471 9.0
+876.2766294056928 5838.12744140625 4.157098770141602 9.0
+876.2970639756677 5836.19873046875 4.157865524291992 9.0
+876.3174985455189 5825.37109375 4.155760765075684 9.0
+876.3379331151446 5835.42236328125 4.156394958496094 9.0
+876.3583676847702 5830.68310546875 4.156169414520264 9.0
+876.3788023542729 5834.93896484375 4.156002521514893 9.0
+876.399236823665 5840.30322265625 4.15756893157959 9.0
+876.419671392825 5835.29736328125 4.156795501708984 9.0
+876.4401060619784 5827.6162109375 4.154691696166992 9.0
+876.4605405309048 5832.96484375 4.156402111053467 9.0
+876.480975099832 5836.6650390625 4.15500020980835 9.0
+876.5014097685198 5836.23583984375 4.15596342086792 9.0
+876.5218442372134 5825.02099609375 4.154609203338623 9.0
+876.5422789056756 5832.82421875 4.154962062835693 9.0
+876.5627134741299 5836.58447265625 4.155560493469238 9.0
+876.5831479423578 5835.509765625 4.155154705047607 9.0
+876.6035826104635 5836.51123046875 4.154552459716797 9.0
+876.6240171784593 5830.03466796875 4.155231952667236 9.0
+876.644451646338 5826.126953125 4.154040336608887 9.0
+876.6648863141018 5825.927734375 4.154840469360352 9.0
+876.6853207817403 5836.06103515625 4.155823230743408 9.0
+876.7057554492712 5829.51025390625 4.155338764190674 9.0
+876.7261900166777 5829.40234375 4.155806064605713 9.0
+876.7466245839751 5828.3662109375 4.15554666519165 9.0
+876.767059151156 5829.048828125 4.155282974243164 9.0
+876.8079282850449 5828.44189453125 4.154877662658691 9.0
+876.8487974184682 5824.296875 4.154143333435059 9.0
+876.869231985067 5825.47412109375 4.15519905090332 9.0
+876.8896666514338 5817.19775390625 4.154728412628174 9.0
+876.9101011176826 5818.4580078125 4.154175758361816 9.0
+876.930535683925 5821.4462890625 4.153564929962158 9.0
+876.9509703499425 5821.68701171875 4.154353618621826 9.0
+876.9714048158348 5820.7265625 4.15389347076416 9.0
+877.0122740472871 5824.70458984375 4.154250621795654 9.0
+877.0327085128374 5822.63671875 4.154051780700684 9.0
+877.0531431782656 5820.75048828125 4.153075695037842 9.0
+877.0735777434675 5820.18798828125 4.1533403396606445 9.0
+877.0940122086613 5818.6025390625 4.153379440307617 9.0
+877.1144468737475 5817.94287109375 4.154346466064453 9.0
+877.1348814386001 5821.89599609375 4.154332637786865 9.0
+877.1757505680653 5830.6220703125 4.155457973480225 9.0
+877.1961851325686 5832.82958984375 4.1550445556640625 9.0
+877.2166196969483 5825.31005859375 4.154741287231445 9.0
+877.2370542613353 5811.1591796875 4.153367042541504 9.0
+877.2574888254894 5823.74853515625 4.15439510345459 9.0
+877.2779234895206 5816.60546875 4.153770923614502 9.0
+877.2983579533247 5816.83349609375 4.154156684875488 9.0
+877.3187925171296 5812.66357421875 4.153708457946777 9.0
+877.3392270808108 5816.2568359375 4.154022216796875 9.0
+877.3596616443829 5823.1328125 4.154900074005127 9.0
+877.3800962077221 5816.01318359375 4.153103351593018 9.0
+877.400530771054 5820.7109375 4.153866767883301 9.0
+877.4209653341604 5815.73681640625 4.154159069061279 9.0
+877.4413998971504 5818.0478515625 4.154827117919922 9.0
+877.4618345600175 5814.04296875 4.15384578704834 9.0
+877.4822690227738 5811.4931640625 4.153432369232178 9.0
+877.5027036855317 5819.35546875 4.1548590660095215 9.0
+877.5231382479324 5815.0390625 4.153763771057129 9.0
+877.5435727103395 5815.22900390625 4.153929233551025 9.0
+877.5640073726317 5813.1220703125 4.154073715209961 9.0
+877.5844419347995 5814.48095703125 4.153477191925049 9.0
+877.604876396741 5818.35205078125 4.154151439666748 9.0
+877.625311058684 5818.23974609375 4.153842926025391 9.0
+877.6457456203862 5811.4443359375 4.153006553649902 9.0
+877.6661800819784 5808.5205078125 4.152479648590088 9.0
+877.6866147434557 5810.2958984375 4.1531081199646 9.0
+877.7070493048086 5800.02685546875 4.152853488922119 9.0
+877.7274839660531 5812.341796875 4.153604984283447 9.0
+877.7479184271797 5812.49609375 4.1535797119140625 9.0
+877.7683529881833 5811.31103515625 4.152408599853516 9.0
+877.7887876489622 5819.67138671875 4.152730464935303 9.0
+877.8092221097395 5823.81396484375 4.153800964355469 9.0
+877.8296566702775 5830.03466796875 4.153862476348877 9.0
+877.8500913308235 5818.59619140625 4.152764797210693 9.0
+877.8705258911359 5806.83056640625 4.152535915374756 9.0
+877.8909603513239 5811.9306640625 4.15348482131958 9.0
+877.9113950114042 5811.06103515625 4.154191970825195 9.0
+877.9318295713601 5813.3134765625 4.152632713317871 9.0
+877.9522640312061 5805.93994140625 4.153421401977539 9.0
+877.993133150434 5816.6630859375 4.153568744659424 9.0
+878.0135678098086 5815.81103515625 4.153672218322754 9.0
+878.0340023690733 5824.01806640625 4.154147148132324 9.0
+878.0544369283307 5811.6455078125 4.152594566345215 9.0
+878.0748714873625 5813.55419921875 4.153389930725098 9.0
+878.095306046278 5808.35693359375 4.152509689331055 9.0
+878.1157405049598 5809.04150390625 4.153254508972168 9.0
+878.1361751636359 5809.916015625 4.153113842010498 9.0
+878.1566097222021 5812.0458984375 4.1537322998046875 9.0
+878.1770441805347 5817.33642578125 4.154106616973877 9.0
+878.1974788388616 5812.4248046875 4.1532301902771 9.0
+878.2179133969621 5808.42236328125 4.152273654937744 9.0
+878.2383480549397 5802.5791015625 4.1525187492370605 9.0
+878.2587825128066 5807.7275390625 4.153095245361328 9.0
+878.2792170705579 5809.73681640625 4.153434753417969 9.0
+878.2996517281863 5816.42529296875 4.15266752243042 9.0
+878.3200861855876 5812.95556640625 4.152627468109131 9.0
+878.3405207429896 5812.11767578125 4.151967525482178 9.0
+878.3609554001523 5814.7333984375 4.15224027633667 9.0
+878.3813898572043 5821.72998046875 4.153040409088135 9.0
+878.4018244141407 5827.27783203125 4.154111385345459 9.0
+878.4222590709542 5820.12109375 4.151251316070557 9.0
+878.4426936276577 5817.44482421875 4.152834415435791 9.0
+878.4631281842449 5814.28173828125 4.152347564697266 9.0
+878.4835627405919 5811.48974609375 4.152637004852295 9.0
+878.5039972969462 5805.94873046875 4.149674415588379 9.0
+878.5244319530684 5808.33203125 4.152883052825928 9.0
+878.5448664090654 5800.23095703125 4.152104377746582 9.0
+878.5653009649541 5802.359375 4.151792049407959 9.0
+878.5857356207271 5809.64794921875 4.151268005371094 9.0
+878.6266046317978 5808.57275390625 4.152884006500244 9.0
+878.6470391872208 5813.12548828125 4.152768611907959 9.0
+878.6674737424037 5818.0009765625 4.153656959533691 9.0
+878.6879082974774 5810.56298828125 4.152710437774658 9.0
+878.7083428524347 5812.21240234375 4.151639938354492 9.0
+878.7287774072684 5821.35693359375 4.151925563812256 9.0
+878.7492120619936 5809.9521484375 4.152392864227295 9.0
+878.7696465164845 5805.06689453125 4.150300979614258 9.0
+878.7900810708525 5808.62109375 4.152186870574951 9.0
+878.8309501793701 5818.35009765625 4.152350425720215 9.0
+878.8922538410916 5812.49169921875 4.149645805358887 9.0
+878.9331230482057 5813.3564453125 4.151915073394775 9.0
+878.9535576016497 5810.2451171875 4.15060567855835 9.0
+878.9944267078317 5813.794921875 4.15169620513916 9.0
+879.0148612608027 5805.4384765625 4.148536682128906 9.0
+879.0352958135481 5813.43896484375 4.151765823364258 9.0
+879.0557303662936 5818.45947265625 4.1522216796875 9.0
+879.0761649188062 5820.955078125 4.152978897094727 9.0
+879.0965995713123 5807.9150390625 4.150574207305908 9.0
+879.1170340235913 5813.71923828125 4.1519694328308105 9.0
+879.1374685756309 5810.58447265625 4.150979995727539 9.0
+879.1579032276786 5816.001953125 4.151540279388428 9.0
+879.178337679492 5810.9482421875 4.152215003967285 9.0
+879.1987723312996 5806.892578125 4.151729106903076 9.0
+879.2192068828808 5818.81787109375 4.152872085571289 9.0
+879.2396413342285 5813.09521484375 4.149543762207031 9.0
+879.2600759855704 5815.95458984375 4.15254545211792 9.0
+879.2805104369181 5812.5927734375 4.149542331695557 9.0
+879.3009449878009 5814.712890625 4.152513027191162 9.0
+879.32137963891 5809.6689453125 4.150023460388184 9.0
+879.3418140895592 5817.5693359375 4.149991989135742 9.0
+879.3622486402091 5822.25830078125 4.15256404876709 9.0
+879.3826832906198 5814.41650390625 4.148892402648926 9.0
+879.4031177410361 5815.82080078125 4.149188041687012 9.0
+879.4235522912204 5813.6484375 4.1487040519714355 9.0
+879.4439869413982 5817.75439453125 4.151820182800293 9.0
+879.4644214913496 5818.8232421875 4.151603698730469 9.0
+879.4848560413011 5814.5322265625 4.1521077156066895 9.0
+879.5052905907796 5823.2509765625 4.152206897735596 9.0
+879.5257251404983 5810.86376953125 4.149197578430176 9.0
+879.5461596897512 5815.7470703125 4.1520094871521 9.0
+879.5665942392297 5818.98583984375 4.152100563049316 9.0
+879.5870287882499 5814.39306640625 4.1517815589904785 9.0
+879.6074634372708 5822.87255859375 4.151437759399414 9.0
+879.62789788605 5823.29345703125 4.152690887451172 9.0
+879.6483324348374 5818.46728515625 4.149430751800537 9.0
+879.6687670833926 5813.7080078125 4.1491618156433105 9.0
+879.689201531939 5816.3642578125 4.149294376373291 9.0
+879.7096361802614 5815.49755859375 4.151650905609131 9.0
+879.7300707283503 5820.26416015625 4.152420997619629 9.0
+879.750505176431 5830.52197265625 4.153157711029053 9.0
+879.7709398242878 5817.423828125 4.152245044708252 9.0
+879.7913743721438 5817.4462890625 4.1503190994262695 9.0
+879.8118088197589 5813.16455078125 4.1509552001953125 9.0
+879.8731124616897 5816.337890625 4.153193473815918 9.0
+879.893547108848 5814.4306640625 4.151992321014404 9.0
+879.9139816557727 5809.06787109375 4.151080131530762 9.0
+879.9344162024572 5804.40478515625 4.151172161102295 9.0
+879.954850749149 5808.9931640625 4.149945259094238 9.0
+879.9957198420598 5816.64599609375 4.150843620300293 9.0
+880.0161543882859 5823.81494140625 4.155129909515381 9.0
+880.0365889342793 5823.70361328125 4.153581142425537 9.0
+880.0570234802653 5829.31982421875 4.156195163726807 9.0
+880.0774580260259 5817.77978515625 4.150941848754883 9.0
+880.0978925717864 5827.544921875 4.155452251434326 9.0
+880.1183272173075 5825.52587890625 4.150298595428467 9.0
+880.1591962078965 5823.916015625 4.152426242828369 9.0
+880.179630852952 5821.72607421875 4.152191162109375 9.0
+880.2000652980132 5817.73486328125 4.1553497314453125 9.0
+880.2204999428359 5813.595703125 4.154595375061035 9.0
+880.2409344874322 5820.15966796875 4.156028747558594 9.0
+880.2613689320278 5811.74169921875 4.152502059936523 9.0
+880.2818035763921 5819.80419921875 4.155423164367676 9.0
+880.3022381207484 5809.76611328125 4.15162467956543 9.0
+880.3226725648783 5819.94189453125 4.1529130935668945 9.0
+880.3431072087697 5820.603515625 4.152221202850342 9.0
+880.3635417526675 5817.2978515625 4.152196407318115 9.0
+880.3839761963318 5828.767578125 4.1554436683654785 9.0
+880.4248453831897 5822.08984375 4.155185699462891 9.0
+880.4452800266226 5814.822265625 4.152892589569092 9.0
+880.4657144695811 5809.8251953125 4.152509689331055 9.0
+880.4861490127805 5812.35693359375 4.1532087326049805 9.0
+880.506583655515 5814.13037109375 4.15225887298584 9.0
+880.5270180982479 5814.423828125 4.15225076675415 9.0
+880.5474526407415 5817.90234375 4.152832508087158 9.0
+880.5678872832432 5823.22265625 4.152650356292725 9.0
+880.588321825504 5825.03466796875 4.152836322784424 9.0
+880.6087562675384 5824.296875 4.153066158294678 9.0
+880.6291908095736 5825.00244140625 4.152035236358643 9.0
+880.649625351376 5811.3544921875 4.151742935180664 9.0
+880.6700599931719 5817.49267578125 4.152742385864258 9.0
+880.6904945347414 5824.482421875 4.152401924133301 9.0
+880.7109289760701 5819.85009765625 4.1523027420043945 9.0
+880.7313636174076 5825.302734375 4.153806686401367 9.0
+880.7517981585115 5818.52001953125 4.151579856872559 9.0
+880.7722325996147 5825.087890625 4.15228796005249 9.0
+880.7926672404792 5820.84228515625 4.152245044708252 9.0
+880.8131017811174 5826.61083984375 4.154836177825928 9.0
+880.8335362217476 5832.90087890625 4.15570592880249 9.0
+880.8539708621538 5831.75244140625 4.155428886413574 9.0
+880.8744054023264 5823.021484375 4.15238618850708 9.0
+880.8948398424982 5828.19384765625 4.153120040893555 9.0
+880.9152744824314 5830.2763671875 4.153192043304443 9.0
+880.9357090223712 5820.57177734375 4.151127815246582 9.0
+880.9561436620716 5831.72607421875 4.152800559997559 9.0
+880.997012641019 5833.21533203125 4.155993461608887 9.0
+881.0174472802537 5825.376953125 4.154375076293945 9.0
+881.0583162582698 5827.654296875 4.152523040771484 9.0
+881.0991853358137 5833.96728515625 4.15230131149292 9.0
+881.1196198743564 5829.513671875 4.152843952178955 9.0
+881.1400545128927 5840.69677734375 4.154924392700195 9.0
+881.1604890509698 5826.06787109375 4.1532301902771 9.0
+881.1809235892797 5834.21142578125 4.156220436096191 9.0
+881.2013581271167 5819.93115234375 4.151957035064697 9.0
+881.221792664961 5819.8974609375 4.152546405792236 9.0
+881.2422272025724 5821.56884765625 4.152431964874268 9.0
+881.2626617401766 5823.50390625 4.1527419090271 9.0
+881.2830962775552 5835.72705078125 4.156726360321045 9.0
+881.3035308146937 5825.3408203125 4.1528754234313965 9.0
+881.3239653518394 5826.69970703125 4.153071403503418 9.0
+881.3443997887516 5827.91650390625 4.152252197265625 9.0
+881.3648344256653 5829.6396484375 4.152642726898193 9.0
+881.3852689621053 5825.17333984375 4.151678562164307 9.0
+881.4057035987862 5842.78857421875 4.155946731567383 9.0
+881.4261380349926 5837.3271484375 4.155213356018066 9.0
+881.4465725712071 5835.45361328125 4.152596473693848 9.0
+881.4670072074223 5834.14453125 4.153848171234131 9.0
+881.4874416431703 5836.91064453125 4.155353546142578 9.0
+881.5078761789118 5840.8505859375 4.154950141906738 9.0
+881.5283108146614 5848.73583984375 4.156547546386719 9.0
+881.5487452501693 5838.72216796875 4.152919769287109 9.0
+881.5691797854524 5831.033203125 4.1529083251953125 9.0
+881.5896144205035 5831.853515625 4.153223514556885 9.0
+881.6100489555465 5827.21044921875 4.151782512664795 9.0
+881.630483390596 5830.8701171875 4.1535964012146 9.0
+881.6509180251815 5836.87109375 4.155752658843994 9.0
+881.6713525597588 5831.23681640625 4.1528449058532715 9.0
+881.6917870943435 5830.25927734375 4.153716087341309 9.0
+881.7122216286953 5838.4736328125 4.15595006942749 9.0
+881.732656162807 5836.12548828125 4.156246662139893 9.0
+881.7530907966939 5832.1220703125 4.153546333312988 9.0
+881.7735252305793 5840.00830078125 4.155211448669434 9.0
+881.8143943978794 5838.474609375 4.156279563903809 9.0
+881.8348288312991 5837.2158203125 4.152469158172607 9.0
+881.8552633644795 5839.552734375 4.153471946716309 9.0
+881.8756979976679 5838.501953125 4.153214454650879 9.0
+881.896132430622 5841.244140625 4.152627468109131 9.0
+881.9165670633374 5840.7392578125 4.154781818389893 9.0
+881.9370015960594 5842.6298828125 4.155503749847412 9.0
+881.9574360285478 5840.74853515625 4.156379699707031 9.0
+881.9778706607976 5834.27734375 4.151913642883301 9.0
+881.9983050930532 5847.57421875 4.155417442321777 9.0
+882.0187396250767 5847.25 4.153230667114258 9.0
+882.0391742570937 5839.50439453125 4.153594970703125 9.0
+882.0596086888836 5837.95166015625 4.151310443878174 9.0
+882.0800432204414 5843.9794921875 4.153507709503174 9.0
+882.1004778519928 5841.11767578125 4.15241003036499 9.0
+882.120912283317 5845.0751953125 4.155353546142578 9.0
+882.1413468144092 5845.94140625 4.153377056121826 9.0
+882.1617814454949 5847.7578125 4.154012203216553 9.0
+882.1822159763542 5845.0947265625 4.155518531799316 9.0
+882.2026505069807 5856.07568359375 4.154842376708984 9.0
+882.2230850376 5843.83837890625 4.1529364585876465 9.0
+882.2435195679936 5847.21044921875 4.1526288986206055 9.0
+882.2639540983873 5853.14404296875 4.156313419342041 9.0
+882.2843886283081 5843.87158203125 4.152914047241211 9.0
+882.3048231582361 5849.525390625 4.154547691345215 9.0
+882.3252577881649 5852.75146484375 4.153666019439697 9.0
+882.345692217852 5848.07861328125 4.1524481773376465 9.0
+882.3661267473144 5850.49462890625 4.153259754180908 9.0
+882.3865613767703 5850.404296875 4.153980255126953 9.0
+882.406995805999 5857.208984375 4.153753757476807 9.0
+882.4274304349965 5855.10009765625 4.153149604797363 9.0
+882.4478649637604 5858.18603515625 4.154149055480957 9.0
+882.4682993925162 5860.75341796875 4.155655860900879 9.0
+882.4887340212808 5850.083984375 4.152609348297119 9.0
+882.5091685495718 5854.39697265625 4.153141498565674 9.0
+882.5296029778692 5858.84375 4.154117584228516 9.0
+882.5500376061682 5858.0537109375 4.156256675720215 9.0
+882.5704721340007 5854.716796875 4.15396785736084 9.0
+882.6113411896586 5853.93408203125 4.154790878295898 9.0
+882.6317756172575 5849.09326171875 4.153569221496582 9.0
+882.6522102446179 5851.9892578125 4.153943061828613 9.0
+882.672644771752 5860.52978515625 4.153594970703125 9.0
+882.71351382578 5857.38427734375 4.154556751251221 9.0
+882.7339483526812 5857.99658203125 4.1534624099731445 9.0
+882.7543828791095 5862.28369140625 4.154335021972656 9.0
+882.774817405545 5865.236328125 4.156660079956055 9.0
+882.7952519319806 5860.60302734375 4.154112815856934 9.0
+882.8156864581833 5865.33251953125 4.1536784172058105 9.0
+882.8361210841467 5865.79736328125 4.156835556030273 9.0
+882.8565555101159 5862.162109375 4.154272556304932 9.0
+882.8974246613507 5864.9990234375 4.1540985107421875 9.0
+882.9178590866213 5858.28271484375 4.153620719909668 9.0
+882.9382937118862 5861.31201171875 4.15348482131958 9.0
+882.9791626619626 5863.62060546875 4.1574296951293945 9.0
+882.9995972867619 5868.14453125 4.157397747039795 9.0
+883.0200318113348 5858.61474609375 4.155862808227539 9.0
+883.0404662359069 5857.466796875 4.153201580047607 9.0
+883.0609008600077 5855.08056640625 4.152838706970215 9.0
+883.0813353843478 5868.52685546875 4.1571736335754395 9.0
+883.1017698082214 5862.94677734375 4.153578281402588 9.0
+883.1222044320893 5872.4541015625 4.1551923751831055 9.0
+883.142638955731 5867.8818359375 4.154691696166992 9.0
+883.1630734793725 5867.5546875 4.154883861541748 9.0
+883.183508002774 5873.18701171875 4.154384136199951 9.0
+883.20394252595 5861.56103515625 4.154344081878662 9.0
+883.2243771491267 5873.26806640625 4.155040264129639 9.0
+883.2448115720617 5866.1904296875 4.152336120605469 9.0
+883.265246094772 5874.43603515625 4.153919219970703 9.0
+883.2856806174823 5869.41455078125 4.154167652130127 9.0
+883.3061151399525 5863.91796875 4.153379917144775 9.0
+883.3265496621971 5874.01708984375 4.155947208404541 9.0
+883.3469841842088 5870.45849609375 4.153692245483398 9.0
+883.3674187062134 5872.666015625 4.154054164886475 9.0
+883.3878532282251 5870.611328125 4.153753757476807 9.0
+883.408287849772 5867.810546875 4.153607368469238 9.0
+883.4287222713101 5877.951171875 4.153521537780762 9.0
+883.4491568926242 5871.77880859375 4.154036998748779 9.0
+883.4695914139375 5875.0546875 4.155673980712891 9.0
+883.4900258350099 5888.26953125 4.156608581542969 9.0
+883.5104604558583 5878.75634765625 4.153879642486572 9.0
+883.5308949767059 5874.2392578125 4.153260707855225 9.0
+883.5717640176954 5879.79150390625 4.154501914978027 9.0
+883.5921985378445 5874.52587890625 4.154730319976807 9.0
+883.6126329579856 5882.77099609375 4.155655384063721 9.0
+883.6330675779027 5878.95947265625 4.155034065246582 9.0
+883.653502097819 5879.6787109375 4.156369209289551 9.0
+883.673936717496 5882.11279296875 4.15615701675415 9.0
+883.6943711369458 5879.1552734375 4.154263496398926 9.0
+883.7148056561637 5874.455078125 4.153933525085449 9.0
+883.735240275375 5890.943359375 4.1554670333862305 9.0
+883.7556746943592 5883.04296875 4.156911373138428 9.0
+883.7761092133442 5889.255859375 4.155102252960205 9.0
+883.796543831857 5878.2939453125 4.152851581573486 9.0
+883.8169783503763 5883.77587890625 4.1552534103393555 9.0
+883.8374127688876 5887.29541015625 4.155941963195801 9.0
+883.8578473871748 5875.2119140625 4.155096530914307 9.0
+883.8782819052285 5878.25634765625 4.155016899108887 9.0
+883.8987163230486 5881.01123046875 4.155340194702148 9.0
+883.9191509408629 5877.34716796875 4.1553874015808105 9.0
+883.9395853584501 5884.22314453125 4.154947280883789 9.0
+883.9600199757988 5886.26953125 4.154567718505859 9.0
+883.980454493154 5883.94384765625 4.154914855957031 9.0
+884.0008889102755 5894.61962890625 4.157733917236328 9.0
+884.0213235271585 5891.78466796875 4.156443119049072 9.0
+884.041758044048 5888.04638671875 4.153945446014404 9.0
+884.062192460704 5890.3935546875 4.156446933746338 9.0
+884.0826270771213 5896.40185546875 4.155158519744873 9.0
+884.1030615933123 5893.046875 4.158196926116943 9.0
+884.1234960095026 5881.89306640625 4.154683589935303 9.0
+884.1439306254542 5890.5546875 4.155853271484375 9.0
+884.1643651414124 5894.13427734375 4.1560821533203125 9.0
+884.184799557137 5893.2470703125 4.155799388885498 9.0
+884.205234172623 5896.0703125 4.158729553222656 9.0
+884.2256686878827 5893.48583984375 4.155030250549316 9.0
+884.2461033031432 5893.77294921875 4.158443450927734 9.0
+884.266537718162 5887.15966796875 4.156797885894775 9.0
+884.286972232956 5895.40966796875 4.15797233581543 9.0
+884.3074068477508 5883.560546875 4.153801918029785 9.0
+884.3278413623048 5890.27099609375 4.157632827758789 9.0
+884.3482757768652 5890.60791015625 4.157620429992676 9.0
+884.3687103909615 5900.4755859375 4.159599781036377 9.0
+884.3891449050498 5898.603515625 4.156311511993408 9.0
+884.4095793189117 5903.51806640625 4.157923221588135 9.0
+884.4300139327752 5910.68017578125 4.159951210021973 9.0
+884.4504484463978 5903.0751953125 4.158260345458984 9.0
+884.491317472959 5901.376953125 4.157870769500732 9.0
+884.511751986116 5901.8037109375 4.159106731414795 9.0
+884.5526210119788 5892.1279296875 4.157920837402344 9.0
+884.5730554244365 5899.93798828125 4.159340858459473 9.0
+884.593490036903 5899.744140625 4.159234046936035 9.0
+884.6139245493687 5903.353515625 4.1593918800354 9.0
+884.6343589613607 5907.6064453125 4.159092426300049 9.0
+884.6547935733615 5897.5439453125 4.1591925621032715 9.0
+884.6752280851288 5898.5751953125 4.159285545349121 9.0
+884.6956625968887 5901.5498046875 4.159174919128418 9.0
+884.7160971084231 5902.89208984375 4.1606292724609375 9.0
+884.7365316197247 5895.92431640625 4.161189079284668 9.0
+884.7569662307869 5890.96923828125 4.156599044799805 9.0
+884.7774006418549 5898.8662109375 4.160871505737305 9.0
+884.7978351526908 5894.03076171875 4.158956527709961 9.0
+884.8182697635202 5904.80859375 4.160353660583496 9.0
+884.8387042738905 5895.53125 4.159487724304199 9.0
+884.85913868426 5895.791015625 4.158562183380127 9.0
+884.8795732943909 5899.08154296875 4.160131931304932 9.0
+884.9000078045283 5902.10791015625 4.157566070556641 9.0
+884.9204422144321 5899.96240234375 4.158939361572266 9.0
+884.9408768240974 5905.34765625 4.160150527954102 9.0
+884.9613113335363 5896.57421875 4.158806324005127 9.0
+884.9817458429752 5894.81640625 4.156872749328613 9.0
+885.002180352174 5903.59912109375 4.15894079208374 9.0
+885.0226148613801 5897.068359375 4.159463405609131 9.0
+885.043049470114 5908.15771484375 4.160016059875488 9.0
+885.0634838788537 5906.97998046875 4.160345554351807 9.0
+885.0839183873613 5900.16162109375 4.157116413116455 9.0
+885.1043529958624 5901.6826171875 4.1591010093688965 9.0
+885.1247874041364 5904.47607421875 4.1595072746276855 9.0
+885.1452219121784 5905.64501953125 4.159980773925781 9.0
+885.165656519981 5906.82275390625 4.157576084136963 9.0
+885.1860909277893 5918.267578125 4.161378860473633 9.0
+885.2269599427091 5901.5419921875 4.158605098724365 9.0
+885.2473944500452 5894.12451171875 4.156953811645508 9.0
+885.2678290571566 5908.54443359375 4.159102916717529 9.0
+885.2882634640264 5897.546875 4.158858299255371 9.0
+885.3086979706713 5904.94775390625 4.159849643707275 9.0
+885.3291325773171 5906.5234375 4.157310962677002 9.0
+885.3495669837284 5900.353515625 4.157714366912842 9.0
+885.3700014899005 5900.1767578125 4.1584858894348145 9.0
+885.3904360960805 5901.1640625 4.159220218658447 9.0
+885.4108706020197 5895.322265625 4.157063961029053 9.0
+885.4313050077326 5896.44482421875 4.155418395996094 9.0
+885.451739613447 5894.3623046875 4.156947612762451 9.0
+885.4721741186877 5907.81884765625 4.1584577560424805 9.0
+885.4926086239357 5911.48876953125 4.159481048583984 9.0
+885.5130431291836 5900.40380859375 4.155703544616699 9.0
+885.5334776339587 5910.69873046875 4.156126499176025 9.0
+885.5539122387418 5905.7177734375 4.1552815437316895 9.0
+885.5743466435233 5899.36279296875 4.154614448547363 9.0
+885.5947811478327 5908.64599609375 4.157806396484375 9.0
+885.6152157521501 5904.017578125 4.156321048736572 9.0
+885.6356501562332 5903.037109375 4.155966281890869 9.0
+885.6560846600769 5897.62548828125 4.155325412750244 9.0
+885.6765192639286 5913.13330078125 4.157058238983154 9.0
+885.696953667546 5894.03125 4.155673980712891 9.0
+885.7173881709241 5896.00341796875 4.155516147613525 9.0
+885.7378227743102 5899.99755859375 4.155714511871338 9.0
+885.7582571772291 5896.82421875 4.155178546905518 9.0
+885.7786917801423 5902.60205078125 4.156111717224121 9.0
+885.7991262830619 5909.7880859375 4.155876159667969 9.0
+885.8195606855152 5904.72314453125 4.156474590301514 9.0
+885.8399952879627 5908.501953125 4.1565093994140625 9.0
+885.8604297901838 5896.6005859375 4.155576229095459 9.0
+885.880864292405 5911.57275390625 4.15601921081543 9.0
+885.9012987943861 5899.828125 4.1544623374938965 9.0
+885.9217332961416 5897.28857421875 4.155186176300049 9.0
+885.9626022989469 5901.154296875 4.157493591308594 9.0
+885.9830368002367 5893.1640625 4.158352851867676 9.0
+886.0034713012938 5897.671875 4.155887603759766 9.0
+886.0239058023435 5894.58349609375 4.1554341316223145 9.0
+886.0443403031677 5892.19140625 4.155063629150391 9.0
+886.0647749037598 5906.44482421875 4.15751838684082 9.0
+886.0852093041103 5895.80517578125 4.155752182006836 9.0
+886.105643804236 5910.89501953125 4.158481121063232 9.0
+886.1260784043552 5901.9150390625 4.156039237976074 9.0
+886.1465128042473 5899.84716796875 4.155914783477783 9.0
+886.1669473039074 5900.49951171875 4.155267238616943 9.0
+886.1873819035682 5897.841796875 4.15535306930542 9.0
+886.2078163029873 5905.6572265625 4.155657768249512 9.0
+886.2282508021817 5920.03857421875 4.157771110534668 9.0
+886.2486854011368 5906.646484375 4.156946182250977 9.0
+886.289554398827 5894.17822265625 4.154049396514893 9.0
+886.3099888973156 5906.77197265625 4.157898426055908 9.0
+886.3304232958108 5901.8330078125 4.155236721038818 9.0
+886.3508578940746 5897.93701171875 4.154494762420654 9.0
+886.3712923920975 5898.18212890625 4.154817581176758 9.0
+886.3917268898949 5895.28759765625 4.153866767883301 9.0
+886.4121613876923 5894.6220703125 4.154973030090332 9.0
+886.4325958852496 5898.67529296875 4.155328750610352 9.0
+886.4530303825813 5890.8505859375 4.154759883880615 9.0
+886.4734648796803 5896.8408203125 4.155856132507324 9.0
+886.4938993767719 5898.72314453125 4.1554789543151855 9.0
+886.514333873638 5900.3623046875 4.156879901885986 9.0
+886.5347683702712 5896.83935546875 4.157679080963135 9.0
+886.5552028666643 5888.494140625 4.1537933349609375 9.0
+886.5756374630655 5895.185546875 4.155182838439941 9.0
+886.5960718592323 5888.14111328125 4.154144763946533 9.0
+886.6165063551598 5888.70458984375 4.15570592880249 9.0
+886.6369409510953 5869.6201171875 4.152771472930908 9.0
+887.5769276723586 5844.73974609375 4.153528690338135 9.0
+887.597362260145 5853.01123046875 4.1542768478393555 9.0
+887.6382311347843 5866.603515625 4.1524553298950195 9.0
+887.6586657220978 5883.94970703125 4.1531081199646 9.0
+887.6791002089521 5869.1005859375 4.152405261993408 9.0
+887.7404036688094 5872.4912109375 4.152796268463135 9.0
+887.7608380551974 5871.1640625 4.153355121612549 9.0
+887.8017071270369 5871.798828125 4.152441501617432 9.0
+887.8221415129519 5872.92822265625 4.152539253234863 9.0
+887.8425760984101 5876.31396484375 4.153234958648682 9.0
+887.8630105838674 5876.6767578125 4.152950286865234 9.0
+887.8834450690847 5865.181640625 4.151945114135742 9.0
+887.9038795540764 5876.0400390625 4.152757167816162 9.0
+887.9243140388353 5874.6279296875 4.152867317199707 9.0
+887.9447485235869 5865.46826171875 4.151910305023193 9.0
+887.965183008113 5871.47021484375 4.152730464935303 9.0
+887.9856174924062 5854.6328125 4.15037202835083 9.0
+888.0060519764593 5866.69287109375 4.152540683746338 9.0
+888.0264864605197 5860.83642578125 4.1510114669799805 9.0
+888.0469209443472 5860.90625 4.150965690612793 9.0
+888.0673554279347 5860.41455078125 4.150585651397705 9.0
+888.0877899112966 5868.1767578125 4.152575492858887 9.0
+888.1082243946585 5865.48291015625 4.151787757873535 9.0
+888.128658977781 5868.06591796875 4.151646614074707 9.0
+888.1490933606765 5861.90478515625 4.15019416809082 9.0
+888.1695279433407 5868.10595703125 4.151693820953369 9.0
+888.189962425764 5855.62255859375 4.149531364440918 9.0
+888.2103968081938 5857.03271484375 4.150272369384766 9.0
+888.2512658723499 5856.37744140625 4.150789260864258 9.0
+888.271700254314 5864.42431640625 4.150912761688232 9.0
+888.2921348358141 5858.5224609375 4.150636672973633 9.0
+888.312569317306 5860.0576171875 4.15350866317749 9.0
+888.3738727606324 5853.46533203125 4.149666786193848 9.0
+888.3943073414339 5856.27685546875 4.149118423461914 9.0
+888.414741722001 5851.2158203125 4.149033546447754 9.0
+888.4351762025617 5855.29833984375 4.1494059562683105 9.0
+888.455610682664 5851.16259765625 4.149237632751465 9.0
+888.4760451627662 5853.80810546875 4.149078369140625 9.0
+888.4964796426284 5855.1728515625 4.149416446685791 9.0
+888.516914122265 5853.3583984375 4.149753093719482 9.0
+888.5373486016688 5852.70751953125 4.149901866912842 9.0
+888.5577830810653 5850.57958984375 4.149570465087891 9.0
+888.5986520391743 5849.9716796875 4.148496150970459 9.0
+888.6190865178723 5853.07470703125 4.148598670959473 9.0
+888.6395210965784 5849.765625 4.149012088775635 9.0
+888.6599554750428 5858.390625 4.149805068969727 9.0
+888.6803900532832 5853.1806640625 4.1482625007629395 9.0
+888.70082453129 5856.0537109375 4.14900541305542 9.0
+888.7212589090632 5857.4169921875 4.149240493774414 9.0
+888.7621279643718 5849.14697265625 4.148850917816162 9.0
+888.782562341672 5852.73828125 4.148512363433838 9.0
+888.8029969189811 5851.75732421875 4.148605823516846 9.0
+888.8234313958237 5853.1669921875 4.147273540496826 9.0
+888.9051692020148 5848.3876953125 4.148709297180176 9.0
+888.9460382538382 5851.57177734375 4.148838043212891 9.0
+888.9869072051879 5844.7685546875 4.148148059844971 9.0
+889.0073416804007 5844.6669921875 4.147491931915283 9.0
+889.027776255607 5851.5947265625 4.148013591766357 9.0
+889.0482106305863 5845.52978515625 4.147364139556885 9.0
+889.0686451053334 5844.99951171875 4.147916793823242 9.0
+889.0890796800741 5849.99609375 4.150484561920166 9.0
+889.1095141543556 5845.25244140625 4.150344371795654 9.0
+889.1299485286363 5843.8232421875 4.1488800048828125 9.0
+889.1503831026785 5846.50732421875 4.148078441619873 9.0
+889.1708175764943 5840.583984375 4.149445533752441 9.0
+889.1912520503101 5845.84765625 4.150182723999023 9.0
+889.2116865238859 5848.13232421875 4.148034572601318 9.0
+889.2321208972353 5836.1943359375 4.147368431091309 9.0
+889.2525554703534 5846.62109375 4.148773670196533 9.0
+889.2729899432306 5838.23974609375 4.145625591278076 9.0
+889.2934243161144 5852.08642578125 4.150236129760742 9.0
+889.3138588887668 5853.27880859375 4.150493144989014 9.0
+889.3342933611784 5847.71435546875 4.1495585441589355 9.0
+889.3547277333637 5841.43017578125 4.149166107177734 9.0
+889.3751623053176 5845.8095703125 4.146820545196533 9.0
+889.3955967772636 5842.83349609375 4.148049354553223 9.0
+889.4160311489832 5853.32861328125 4.150177001953125 9.0
+889.4364657204715 5844.38525390625 4.148514747619629 9.0
+889.4773347629744 5846.25439453125 4.14931058883667 9.0
+889.4977691337626 5846.67822265625 4.149496078491211 9.0
+889.5182036045444 5849.0546875 4.149506568908691 9.0
+889.5386381751014 5853.57958984375 4.149528503417969 9.0
+889.5590725456568 5845.2119140625 4.148911952972412 9.0
+889.5999415858314 5843.443359375 4.149622440338135 9.0
+889.6203760556818 5850.79248046875 4.1500067710876465 9.0
+889.640810425306 5841.5830078125 4.146144866943359 9.0
+889.6612449946988 5842.1552734375 4.1484880447387695 9.0
+889.7021138330092 5844.248046875 4.149294853210449 9.0
+889.7225484019364 5852.4921875 4.149630546569824 9.0
+889.7429828708555 5849.01904296875 4.148765563964844 9.0
+889.763417439317 5851.8232421875 4.149437427520752 9.0
+889.783851807777 5851.82421875 4.149545192718506 9.0
+889.804286275772 5845.7802734375 4.149227619171143 9.0
+889.8247208437606 5845.18359375 4.148669719696045 9.0
+889.8451552115221 5842.15283203125 4.1488237380981445 9.0
+889.8655895792836 5845.38037109375 4.148670673370361 9.0
+889.9268929809332 5839.86181640625 4.148830890655518 9.0
+889.9677620145885 5839.5849609375 4.148961067199707 9.0
+889.9881965809473 5849.51904296875 4.148375511169434 9.0
+890.0086309473118 5846.234375 4.149153709411621 9.0
+890.0290654134442 5863.26513671875 4.151230812072754 9.0
+890.0494999793373 5850.0009765625 4.149082660675049 9.0
+890.0699343452361 5840.32177734375 4.148231029510498 9.0
+890.09036881067 5835.1875 4.148051738739014 9.0
+890.1108033760975 5843.9423828125 4.148913860321045 9.0
+890.1312378412986 5839.591796875 4.149041175842285 9.0
+890.1516722062661 5834.4404296875 4.148726463317871 9.0
+890.1721067712278 5840.603515625 4.149209022521973 9.0
+890.1925412357305 5837.5185546875 4.148518085479736 9.0
+890.2129756002323 5834.88134765625 4.148122787475586 9.0
+890.2334101644956 5836.10302734375 4.148566722869873 9.0
+890.2742791923374 5833.7802734375 4.14790678024292 9.0
+890.2947135561335 5849.755859375 4.149361610412598 9.0
+890.3151480197048 5839.62109375 4.148102283477783 9.0
+890.335582583044 5832.0087890625 4.147896766662598 9.0
+890.3560169461416 5842.71435546875 4.148740768432617 9.0
+890.3764514090144 5843.60595703125 4.148105621337891 9.0
+890.396885971888 5836.9580078125 4.14815092086792 9.0
+890.4173203342871 5839.29833984375 4.148239612579346 9.0
+890.4377547966942 5840.8525390625 4.147871494293213 9.0
+890.4581893588693 5845.0869140625 4.1486053466796875 9.0
+890.4786237210355 5838.23046875 4.147738933563232 9.0
+890.4990581827442 5840.42919921875 4.148207664489746 9.0
+890.5194926444528 5848.02685546875 4.14926815032959 9.0
+890.5399271059214 5836.18701171875 4.147708415985107 9.0
+890.5603616671651 5838.74169921875 4.148438930511475 9.0
+890.5807960281745 5841.67529296875 4.148175239562988 9.0
+890.6012304889446 5835.8955078125 4.148072719573975 9.0
+890.6216650497227 5838.88232421875 4.148036003112793 9.0
+890.6420995102671 5831.892578125 4.147508144378662 9.0
+890.6625338705708 5839.15673828125 4.148179531097412 9.0
+890.6829684306504 5831.71630859375 4.147398948669434 9.0
+890.7034028904964 5840.8955078125 4.148654460906982 9.0
+890.7238372503343 5835.7705078125 4.148232460021973 9.0
+890.7647062690958 5835.0185546875 4.147237300872803 9.0
+890.7851406282352 5820.96044921875 4.147368907928467 9.0
+890.8055751873835 5828.66064453125 4.146831512451172 9.0
+890.8260096460654 5828.7666015625 4.147842884063721 9.0
+890.8668785629561 5828.21142578125 4.147943019866943 9.0
+890.8873130211723 5847.4677734375 4.14984130859375 9.0
+890.907747579382 5837.14501953125 4.1483893394470215 9.0
+890.9281819371317 5836.19873046875 4.148205280303955 9.0
+890.9486163948823 5839.9482421875 4.1483845710754395 9.0
+890.9690509521606 5842.41943359375 4.148926258087158 9.0
+890.9894853094447 5837.2978515625 4.148221969604492 9.0
+891.0099197664968 5837.3935546875 4.147924423217773 9.0
+891.0303543235423 5837.1171875 4.147445201873779 9.0
+891.0507886801279 5839.0986328125 4.148573875427246 9.0
+891.071223136707 5840.50927734375 4.148216724395752 9.0
+891.0916576928284 5836.75634765625 4.147858142852783 9.0
+891.1120921489492 5834.298828125 4.1480231285095215 9.0
+891.1325266050626 5837.01220703125 4.14838981628418 9.0
+891.1529610607176 5831.3310546875 4.147330284118652 9.0
+891.1938299715548 5829.98291015625 4.147643566131592 9.0
+891.2142644267442 5831.73095703125 4.146713733673096 9.0
+891.2346988817008 5833.0546875 4.147487640380859 9.0
+891.2551333364172 5837.2294921875 4.147756099700928 9.0
+891.2755677911409 5834.4921875 4.147485256195068 9.0
+891.2960021453982 5842.9384765625 4.148721694946289 9.0
+891.3164366996498 5836.1611328125 4.147005558013916 9.0
+891.3573057074682 5839.92041015625 4.147858619689941 9.0
+891.418609067674 5833.47119140625 4.147492408752441 9.0
+891.4390434207598 5825.39697265625 4.146785259246826 9.0
+891.4594778736209 5830.97705078125 4.1473388671875 9.0
+891.4799124262499 5834.65966796875 4.147519111633301 9.0
+891.5003467786373 5831.29443359375 4.147151947021484 9.0
+891.5412157831961 5838.041015625 4.147794723510742 9.0
+891.561650134885 5830.6455078125 4.1469502449035645 9.0
+891.5820845865819 5836.28662109375 4.147224426269531 9.0
+891.6025191382796 5835.0927734375 4.147561073303223 9.0
+891.6229535895036 5831.29150390625 4.146975994110107 9.0
+891.643388040502 5830.533203125 4.146694183349609 9.0
+891.6638224915005 5834.375 4.147458553314209 9.0
+891.6842569422588 5828.78857421875 4.146917819976807 9.0
+891.7046913927916 5827.69873046875 4.1468939781188965 9.0
+891.7251258430915 5839.74658203125 4.147660732269287 9.0
+891.7455602931514 5830.60009765625 4.147083282470703 9.0
+891.7659947432185 5831.95556640625 4.146476745605469 9.0
+891.7864291930528 5825.0 4.145284652709961 9.0
+891.8068636424141 5832.94287109375 4.145776748657227 9.0
+891.8477325411513 5838.92236328125 4.14729642868042 9.0
+891.868166990047 5834.54296875 4.146731853485107 9.0
+891.8886014387172 5831.212890625 4.145798683166504 9.0
+891.9499047840218 5836.41357421875 4.14570951461792 9.0
+891.9703392319934 5831.47900390625 4.144956111907959 9.0
+891.9907737797257 5845.697265625 4.147237777709961 9.0
+892.0112081274638 5826.37939453125 4.145901203155518 9.0
+892.0316425747369 5832.40380859375 4.1454901695251465 9.0
+892.0520771220035 5829.11474609375 4.146401882171631 9.0
+892.0725114690431 5833.5458984375 4.145813941955566 9.0
+892.0929459158506 5843.84619140625 4.147180557250977 9.0
+892.1133804624187 5833.32080078125 4.145109176635742 9.0
+892.1338148089926 5834.505859375 4.1451849937438965 9.0
+892.1542492551016 5841.4775390625 4.145897388458252 9.0
+892.1746838012041 5835.3486328125 4.146102428436279 9.0
+892.1951182470802 5827.24365234375 4.1451921463012695 9.0
+892.2155526927236 5831.58056640625 4.145971298217773 9.0
+892.2359871381268 5830.302734375 4.146235942840576 9.0
+892.2564215835373 5833.447265625 4.1460065841674805 9.0
+892.2768561284756 5829.77734375 4.145723819732666 9.0
+892.2972904734197 5841.857421875 4.146510124206543 9.0
+892.3177249181317 5844.38232421875 4.1464338302612305 9.0
+892.3381594626044 5847.06787109375 4.146704196929932 9.0
+892.35859380685 5841.85693359375 4.146338939666748 9.0
+892.3790282508635 5828.67626953125 4.145015239715576 9.0
+892.3994627948705 5836.3212890625 4.145384788513184 9.0
+892.4198971384176 5827.53857421875 4.145056247711182 9.0
+892.4607660252805 5846.9072265625 4.147000312805176 9.0
+892.4812004683554 5844.4033203125 4.146604537963867 9.0
+892.5016350112055 5841.3701171875 4.146046161651611 9.0
+892.5425037964305 5833.24169921875 4.143514633178711 9.0
+892.562938338815 5847.92138671875 4.146152973175049 9.0
+892.6038071228759 5841.732421875 4.14628267288208 9.0
+892.6242416645619 5848.146484375 4.146373748779297 9.0
+892.6446760060062 5836.5107421875 4.14465856552124 9.0
+892.6651104472257 5843.09765625 4.144896030426025 9.0
+892.685544988446 5849.3515625 4.146833419799805 9.0
+892.7059794294255 5837.1044921875 4.145371437072754 9.0
+892.7264137701786 5840.2353515625 4.146320819854736 9.0
+892.7468483107004 5835.841796875 4.145038604736328 9.0
+892.7672827509814 5839.2490234375 4.145655155181885 9.0
+892.7877171910368 5834.28857421875 4.14458703994751 9.0
+892.8081516310922 5838.26123046875 4.145076274871826 9.0
+892.8285860706746 5840.3095703125 4.145366191864014 9.0
+892.8490206102651 5835.97119140625 4.144466400146484 9.0
+892.8898893887381 5836.78466796875 4.145118713378906 9.0
+892.9103239276301 5836.16796875 4.145816326141357 9.0
+892.9307582662877 5831.60302734375 4.144753456115723 9.0
+892.9511927049389 5838.83203125 4.144649982452393 9.0
+892.9716272433652 5836.87060546875 4.145251274108887 9.0
+892.9920615813244 5838.56982421875 4.1460957527160645 9.0
+893.0124961192778 5839.10205078125 4.1453752517700195 9.0
+893.0329305570049 5834.66552734375 4.1440534591674805 9.0
+893.0533648944984 5829.7578125 4.143625259399414 9.0
+893.0737994319861 5829.14453125 4.144315242767334 9.0
+893.0942338690147 5829.65673828125 4.144151210784912 9.0
+893.1146683060433 5830.87060546875 4.145354747772217 9.0
+893.1351027428318 5830.666015625 4.145186424255371 9.0
+893.1555371793947 5837.412109375 4.14422082901001 9.0
+893.1759716157248 5826.58447265625 4.144333362579346 9.0
+893.1964060518148 5827.3134765625 4.144510746002197 9.0
+893.2168404876793 5834.83984375 4.144079685211182 9.0
+893.237274823543 5839.11083984375 4.146076202392578 9.0
+893.2577093589352 5825.04736328125 4.144228458404541 9.0
+893.278143794334 5837.39599609375 4.145658016204834 9.0
+893.2985782295 5837.94482421875 4.146278381347656 9.0
+893.3394470991261 5829.6142578125 4.1451191902160645 9.0
+893.3598816335871 5832.75634765625 4.1449713706970215 9.0
+893.3803159680538 5836.8984375 4.145013332366943 9.0
+893.4007504020556 5834.18701171875 4.144646167755127 9.0
+893.4211849360581 5834.98974609375 4.145012855529785 9.0
+893.4416192698191 5835.77783203125 4.145426273345947 9.0
+893.4620537033552 5835.91845703125 4.145771026611328 9.0
+893.482488236652 5839.25048828125 4.145303249359131 9.0
+893.5029225697217 5832.0439453125 4.144497871398926 9.0
+893.5233570025594 5835.8388671875 4.145017623901367 9.0
+893.5437915353905 5828.44482421875 4.144115447998047 9.0
+893.5642258679945 5836.82861328125 4.145163059234619 9.0
+893.5846604001345 5833.02490234375 4.143988132476807 9.0
+893.6050948322663 5841.1416015625 4.14484977722168 9.0
+893.6255291641719 5843.0908203125 4.145362854003906 9.0
+893.6868325587202 5831.05712890625 4.144642353057861 9.0
+893.707266989928 5833.509765625 4.144321918487549 9.0
+893.7481358514051 5834.42578125 4.144657611846924 9.0
+893.7685702819144 5841.35595703125 4.145723819732666 9.0
+893.7890047121837 5839.36572265625 4.144714832305908 9.0
+893.8094391422273 5838.12939453125 4.143503665924072 9.0
+893.829873572271 5835.9482421875 4.143662452697754 9.0
+893.8503080018418 5840.84130859375 4.143357753753662 9.0
+893.8707425314205 5831.7470703125 4.143229007720947 9.0
+893.891176860765 5833.185546875 4.143790245056152 9.0
+893.9116112896372 5834.95458984375 4.142934322357178 9.0
+893.9320458185175 5841.80908203125 4.1431355476379395 9.0
+893.9524801471634 5846.9013671875 4.144885063171387 9.0
+893.9729145758029 5840.0126953125 4.143146514892578 9.0
+893.9933491039847 5842.04541015625 4.143561363220215 9.0
+894.0137834319321 5837.37841796875 4.142750263214111 9.0
+894.034217859873 5834.78076171875 4.142909049987793 9.0
+894.0750867150709 5826.77734375 4.141323566436768 9.0
+894.0955211420805 5845.1533203125 4.1434149742126465 9.0
+894.1363899961143 5841.42041015625 4.144376754760742 9.0
+894.156824522659 5830.92138671875 4.143492698669434 9.0
+894.1772589492102 5836.62646484375 4.144237041473389 9.0
+894.1976933752958 5831.259765625 4.143537998199463 9.0
+894.2181278013741 5829.921875 4.144196510314941 9.0
+894.2385622272268 5839.0205078125 4.144250869750977 9.0
+894.2589966528467 5835.5576171875 4.1431474685668945 9.0
+894.2998655033807 5843.041015625 4.142863750457764 9.0
+894.3202999283021 5853.4072265625 4.144448757171631 9.0
+894.3407344529842 5842.6474609375 4.142967224121094 9.0
+894.361168777672 5836.45849609375 4.143123149871826 9.0
+894.3816032021277 5836.70654296875 4.144201755523682 9.0
+894.4020377261113 5840.54736328125 4.145143032073975 9.0
+894.4224720501006 5837.5166015625 4.14456033706665 9.0
+894.4429065738514 5834.017578125 4.143517971038818 9.0
+894.4633409973758 5841.8671875 4.143014430999756 9.0
+894.4837753208994 5842.74462890625 4.144372940063477 9.0
+894.504209843959 5835.80712890625 4.142868995666504 9.0
+894.5246441667769 5846.76513671875 4.145247459411621 9.0
+894.5450785896028 5835.630859375 4.144010543823242 9.0
+894.5655131121894 5844.740234375 4.145850658416748 9.0
+894.5859474345489 5838.73193359375 4.145503044128418 9.0
+894.6063818564435 5833.44873046875 4.14422082901001 9.0
+894.6268163783388 5825.68115234375 4.144113063812256 9.0
+894.6472507002254 5830.48974609375 4.143728256225586 9.0
+894.6676851216544 5839.34814453125 4.144437789916992 9.0
+894.688119642844 5838.236328125 4.143697261810303 9.0
+894.7085540640401 5833.6640625 4.143446445465088 9.0
+894.7289884847705 5851.802734375 4.145835876464844 9.0
+894.749422905501 5834.822265625 4.1443023681640625 9.0
+894.7698573259913 5839.4326171875 4.143557071685791 9.0
+894.7902917462561 5831.8583984375 4.141868591308594 9.0
+894.8311605860799 5834.83154296875 4.143531799316406 9.0
+894.8515950056462 5838.64208984375 4.144060134887695 9.0
+894.8720294252125 5842.50927734375 4.1449360847473145 9.0
+894.9128983634073 5840.4033203125 4.143621921539307 9.0
+894.9333326820342 5842.814453125 4.1448187828063965 9.0
+894.9537671006692 5844.27197265625 4.144735336303711 9.0
+894.9742016190721 5837.1513671875 4.1437883377075195 9.0
+894.9946359372407 5835.4404296875 4.143155097961426 9.0
+895.0150704551706 5842.466796875 4.1443257331848145 9.0
+895.0355048728743 5844.50537109375 4.142711639404297 9.0
+895.0559391905699 5844.67529296875 4.143211841583252 9.0
+895.0968081250467 5842.3330078125 4.139677047729492 9.0
+895.1172424418182 5851.5322265625 4.143091678619385 9.0
+895.137676958584 5844.3095703125 4.1440205574035645 9.0
+895.1581113751236 5840.0888671875 4.13920259475708 9.0
+895.1785456914222 5838.08935546875 4.139013767242432 9.0
+895.1989802074968 5849.45751953125 4.140507221221924 9.0
+895.219414523337 5841.51708984375 4.140437602996826 9.0
+895.2398490389387 5842.83349609375 4.140102863311768 9.0
+895.2602834545469 5836.87060546875 4.14025354385376 9.0
+895.2807178696894 5834.0263671875 4.139698505401611 9.0
+895.3011522848246 5839.1826171875 4.140775680541992 9.0
+895.3215866997343 5845.5078125 4.141420364379883 9.0
+895.3420211141784 5846.3125 4.141809463500977 9.0
+895.3624556286159 5838.70849609375 4.139598846435547 9.0
+895.3828899428263 5844.24951171875 4.1410112380981445 9.0
+895.4033243568047 5838.03125 4.140181541442871 9.0
+895.4237588705437 5846.93505859375 4.141411781311035 9.0
+895.4441931842885 5838.6904296875 4.1401472091674805 9.0
+895.4646275975683 5837.34912109375 4.140743732452393 9.0
+895.4850621106089 5846.46240234375 4.140923500061035 9.0
+895.5054964236551 5848.62255859375 4.141561031341553 9.0
+895.5259309364701 5837.61083984375 4.139892578125 9.0
+895.5463653488114 5852.0 4.1399760246276855 9.0
+895.5667996611592 5853.55322265625 4.1417131423950195 9.0
+895.5872341732756 5848.7138671875 4.1401495933532715 9.0
+895.6076685851513 5843.12548828125 4.139710426330566 9.0
+895.6281028968006 5845.48876953125 4.1404290199279785 9.0
+895.6485374084514 5841.19140625 4.14082670211792 9.0
+895.6689718196285 5848.14990234375 4.141352653503418 9.0
+895.6894061305793 5843.81640625 4.1406569480896 9.0
+895.7098406415316 5847.25439453125 4.141040802001953 9.0
+895.7302750522431 5841.32470703125 4.140416145324707 9.0
+895.7507094624962 5847.1865234375 4.141253471374512 9.0
+895.7711438727492 5842.4189453125 4.141330242156982 9.0
+895.7915782827622 5845.39208984375 4.1408843994140625 9.0
+895.8324471021042 5855.4619140625 4.141839504241943 9.0
+895.8528815114187 5846.60400390625 4.142116546630859 9.0
+895.8733159207404 5847.2373046875 4.140903949737549 9.0
+895.9141847382125 5853.81005859375 4.142171859741211 9.0
+895.9346192468365 5841.16015625 4.140649318695068 9.0
+895.9550535552262 5851.5654296875 4.140607833862305 9.0
+895.9754879631437 5854.22509765625 4.141382217407227 9.0
+896.0367911862122 5840.3955078125 4.140437126159668 9.0
+896.0572256934392 5851.19580078125 4.140408039093018 9.0
+896.0776600004319 5850.19970703125 4.141800880432129 9.0
+896.098094507186 5845.83740234375 4.141526222229004 9.0
+896.1185289139466 5839.56787109375 4.141300678253174 9.0
+896.1389632202336 5851.611328125 4.142520904541016 9.0
+896.1593977265293 5843.43310546875 4.141287803649902 9.0
+896.1798321323586 5850.4716796875 4.141124248504639 9.0
+896.220700943777 5850.2685546875 4.140461444854736 9.0
+896.2411353489078 5853.26220703125 4.140860080718994 9.0
+896.2615697540314 5855.0419921875 4.141617774963379 9.0
+896.2820041589293 5851.8994140625 4.141513824462891 9.0
+896.3024385638273 5851.65869140625 4.140088081359863 9.0
+896.3228730682531 5858.669921875 4.140959739685059 9.0
+896.3433074724526 5853.4345703125 4.140532970428467 9.0
+896.3637417764185 5850.599609375 4.140902519226074 9.0
+896.3841762803786 5856.49365234375 4.1416015625 9.0
+896.4046106838796 5859.43017578125 4.141421318054199 9.0
+896.4250449873798 5864.41748046875 4.1417317390441895 9.0
+896.4454794904086 5856.70751953125 4.140753746032715 9.0
+896.4659137934432 5846.9560546875 4.140763282775879 9.0
+896.4863481962457 5852.51708984375 4.141966819763184 9.0
+896.5272170011449 5845.21484375 4.141695022583008 9.0
+896.5476514032489 5851.99853515625 4.142031192779541 9.0
+896.5680859051135 5852.05712890625 4.142723083496094 9.0
+896.5885202067511 5855.62255859375 4.142776966094971 9.0
+896.6089547083902 5855.181640625 4.142572402954102 9.0
+896.6293891095556 5856.28515625 4.142873764038086 9.0
+896.6498234107275 5857.7744140625 4.1415181159973145 9.0
+896.6702579114353 5861.08544921875 4.1419572830200195 9.0
+896.6906923121351 5850.85498046875 4.140640735626221 9.0
+896.7111266123757 5852.79443359375 4.140960216522217 9.0
+896.7315611126178 5848.5771484375 4.141086101531982 9.0
+896.751995512619 5852.69384765625 4.142585754394531 9.0
+896.7928643119376 5853.99462890625 4.142411231994629 9.0
+896.8132987112403 5854.169921875 4.143224239349365 9.0
+896.8337331103176 5857.67138671875 4.142219066619873 9.0
+896.8541675091619 5860.46875 4.144001007080078 9.0
+896.874601907999 5850.57275390625 4.142210006713867 9.0
+896.8950364063785 5854.63720703125 4.1428656578063965 9.0
+896.9154708045244 5859.658203125 4.142903804779053 9.0
+896.9359051026622 5854.638671875 4.1427483558654785 9.0
+896.956339600576 5849.4931640625 4.141903400421143 9.0
+896.9767739980161 5860.25732421875 4.142922401428223 9.0
+896.9972082954628 5863.40576171875 4.1429924964904785 9.0
+897.0176427926781 5858.6396484375 4.142317771911621 9.0
+897.0380771896598 5872.43701171875 4.144413471221924 9.0
+897.0585114864007 5862.77294921875 4.143404483795166 9.0
+897.0789459829175 5857.39501953125 4.14300537109375 9.0
+897.0993803791935 5858.7470703125 4.142335414886475 9.0
+897.1198146752431 5850.83642578125 4.142216205596924 9.0
+897.1402491710614 5852.9599609375 4.142769813537598 9.0
+897.1606835666462 5862.34716796875 4.143510341644287 9.0
+897.1811179622237 5858.4404296875 4.142455101013184 9.0
+897.2015523573427 5859.50341796875 4.14277982711792 9.0
+897.2219866522282 5867.2099609375 4.1439642906188965 9.0
+897.242421147108 5863.89892578125 4.143571376800537 9.0
+897.2628555417614 5863.470703125 4.142960071563721 9.0
+897.2832899359491 5863.4658203125 4.14337158203125 9.0
+897.3037243301296 5856.990234375 4.143432140350342 9.0
+897.3241587240846 5861.5498046875 4.1422038078308105 9.0
+897.3445931177994 5855.06640625 4.142248630523682 9.0
+897.3650275112886 5862.45849609375 4.143073081970215 9.0
+897.3854619045451 5865.37890625 4.144103050231934 9.0
+897.4058962975687 5866.92529296875 4.143382549285889 9.0
+897.426330790353 5866.6103515625 4.144021987915039 9.0
+897.4467650829101 5852.064453125 4.141395568847656 9.0
+897.4671995752287 5858.89453125 4.14243221282959 9.0
+897.4876339675538 5863.86865234375 4.143528461456299 9.0
+897.5080682594125 5862.7021484375 4.142574310302734 9.0
+897.5489371426593 5859.68408203125 4.142766952514648 9.0
+897.5693714340523 5861.8291015625 4.143033504486084 9.0
+897.5898059249739 5853.2119140625 4.142833709716797 9.0
+897.610240315902 5860.47607421875 4.143007755279541 9.0
+897.6306746065966 5859.13134765625 4.143373012542725 9.0
+897.6511090970525 5865.4677734375 4.143767356872559 9.0
+897.6715434870493 5868.02197265625 4.143606185913086 9.0
+897.6919779770469 5867.43701171875 4.14456033706665 9.0
+897.7124122668029 5869.5712890625 4.1431355476379395 9.0
+897.7328466565668 5861.677734375 4.142986297607422 9.0
+897.7532810458652 5859.60546875 4.142827987670898 9.0
+897.7737154349234 5865.990234375 4.143433570861816 9.0
+897.794149823756 5867.1025390625 4.142816066741943 9.0
+897.8145842123558 5856.8837890625 4.141106128692627 9.0
+897.8350186009484 5879.49365234375 4.144049644470215 9.0
+897.8963217648779 5868.06396484375 4.144102573394775 9.0
+897.9167561525464 5874.57568359375 4.14437198638916 9.0
+897.9371905397493 5862.14892578125 4.1431965827941895 9.0
+897.9576249269448 5864.64794921875 4.143163204193115 9.0
+897.9780594139156 5858.67578125 4.14287805557251 9.0
+897.99849380042 5872.365234375 4.143324851989746 9.0
+898.0189280869163 5871.11279296875 4.142778396606445 9.0
+898.0393625731886 5870.2041015625 4.142793655395508 9.0
+898.0802312450251 5865.39453125 4.1424994468688965 9.0
+898.1006657305988 5860.02783203125 4.142345428466797 9.0
+898.121100115939 5866.2744140625 4.143768787384033 9.0
+898.1415344010384 5865.87939453125 4.1436614990234375 9.0
+898.1619688859137 5868.7373046875 4.143167018890381 9.0
+898.1824032707882 5863.83349609375 4.143138408660889 9.0
+898.202837555189 5869.46875 4.14383602142334 9.0
+898.2845751909554 5868.2978515625 4.143128871917725 9.0
+898.3254440574383 5872.85107421875 4.143800258636475 9.0
+898.3458785404509 5878.9111328125 4.144316673278809 9.0
+898.3663129229899 5874.70361328125 4.143767833709717 9.0
+898.3867474055369 5871.89013671875 4.143893241882324 9.0
+898.4071817878503 5863.75927734375 4.143129348754883 9.0
+898.4684849331534 5869.734375 4.143332004547119 9.0
+898.4889192145274 5877.44482421875 4.144294261932373 9.0
+898.5297880765938 5874.73193359375 4.143891334533691 9.0
+898.5502225575037 5875.5810546875 4.144052982330322 9.0
+898.5706568379537 5868.052734375 4.142999172210693 9.0
+898.5910911181709 5868.20166015625 4.143456935882568 9.0
+898.6319599779017 5873.91455078125 4.144196510314941 9.0
+898.6523942576532 5876.05859375 4.143677711486816 9.0
+898.6728287369333 5876.85791015625 4.143324375152588 9.0
+898.6932631159871 5875.68017578125 4.1426472663879395 9.0
+898.7136973950401 5880.9853515625 4.143889904022217 9.0
+898.7341318736217 5879.025390625 4.143890380859375 9.0
+898.7545662522098 5889.4306640625 4.145377159118652 9.0
+898.7750005303315 5871.32666015625 4.143233776092529 9.0
+898.7954350084474 5871.01806640625 4.143477916717529 9.0
+898.815869386337 5867.373046875 4.1431193351745605 9.0
+898.8363038637544 5870.8720703125 4.14319372177124 9.0
+898.8567381411776 5871.50927734375 4.143701076507568 9.0
+898.8771725183688 5872.43359375 4.143445014953613 9.0
+898.8976069953205 5886.046875 4.144384860992432 9.0
+898.918041372046 5867.712890625 4.142675399780273 9.0
+898.938475648305 5882.89599609375 4.144027233123779 9.0
+898.9589101245583 5881.08544921875 4.143937587738037 9.0
+898.9793445005853 5883.31494140625 4.144157886505127 9.0
+898.9997787763787 5881.1943359375 4.144400596618652 9.0
+899.0202132519335 5876.865234375 4.143033504486084 9.0
+899.0406476272619 5881.0546875 4.143013954162598 9.0
+899.0610819025896 5881.11962890625 4.143413066864014 9.0
+899.081516377446 5887.70361328125 4.143678665161133 9.0
+899.1019507520759 5882.36669921875 4.143367290496826 9.0
+899.1223852264739 5878.26171875 4.14362096786499 9.0
+899.1428195006301 5878.95654296875 4.143551826477051 9.0
+899.1632538747945 5872.07373046875 4.143409252166748 9.0
+899.1836883484939 5869.5048828125 4.143044948577881 9.0
+899.2041226219517 5869.38427734375 4.143601417541504 9.0
+899.2245569954175 5868.505859375 4.143528938293457 9.0
+899.2449913684177 5860.98779296875 4.142651081085205 9.0
+899.2654257411778 5872.33935546875 4.144128322601318 9.0
+899.2858601139451 5866.96533203125 4.143337726593018 9.0
+899.3062944862468 5872.87646484375 4.143405437469482 9.0
+899.3267288585412 5867.48193359375 4.142674922943115 9.0
+899.3471632303772 5868.9814453125 4.1424241065979 9.0
+899.3675976022132 5867.908203125 4.142140865325928 9.0
+899.3880319738091 5878.59326171875 4.143651485443115 9.0
+899.4084664449474 5876.58642578125 4.143581867218018 9.0
+899.4289008160849 5873.4794921875 4.143372058868408 9.0
+899.4493350869816 5866.26806640625 4.142535209655762 9.0
+899.4697695574214 5870.7421875 4.143045425415039 9.0
+899.4902039278604 5871.22509765625 4.14317512512207 9.0
+899.5106381980586 5876.75244140625 4.143459796905518 9.0
+899.5310726680327 5879.42822265625 4.1436991691589355 9.0
+899.5719413072729 5878.126953125 4.142674922943115 9.0
+899.5923757763157 5867.04150390625 4.1425347328186035 9.0
+899.6128101453578 5865.91015625 4.142336368560791 9.0
+899.633244414159 5861.4951171875 4.142213821411133 9.0
+899.6536788827361 5867.755859375 4.1429219245910645 9.0
+899.6741132510797 5863.7685546875 4.142333507537842 9.0
+899.6945477191839 5870.640625 4.142910480499268 9.0
+899.7354163549389 5868.89697265625 4.1422600746154785 9.0
+899.7558508223447 5869.95703125 4.1418070793151855 9.0
+899.7762850895233 5869.3505859375 4.141996383666992 9.0
+899.7967194564699 5872.9453125 4.142588138580322 9.0
+899.8171539231771 5867.93603515625 4.141693592071533 9.0
+899.8375881896573 5868.568359375 4.142228126525879 9.0
+899.8988913879293 5874.8154296875 4.142268180847168 9.0
+899.9601943841044 5866.29150390625 4.141679286956787 9.0
+900.0010632138001 5865.7158203125 4.141128063201904 9.0
+900.0214974781848 5874.8310546875 4.141959190368652 9.0
+900.0419319423381 5867.49658203125 4.141237258911133 9.0
+900.0623663064835 5867.6591796875 4.141209602355957 9.0
+900.0828005701696 5873.14208984375 4.14180850982666 9.0
+900.1032350338501 5871.9140625 4.141715049743652 9.0
+900.1236693970714 5869.73974609375 4.1416707038879395 9.0
+900.1441036602919 5861.4345703125 4.141969680786133 9.0
+900.1645381230483 5867.3251953125 4.141747951507568 9.0
+900.1849724857966 5851.53662109375 4.139998435974121 9.0
+900.2054069480873 5861.1552734375 4.141361713409424 9.0
+900.2258412103693 5855.53564453125 4.14076042175293 9.0
+900.2462755721936 5862.59130859375 4.141111373901367 9.0
+900.2667100340186 5863.17578125 4.141163349151611 9.0
+900.2871442956093 5857.1259765625 4.139953136444092 9.0
+900.3075786567279 5863.79150390625 4.141139507293701 9.0
+900.3280131178544 5862.9052734375 4.14064359664917 9.0
+900.3484473785065 5856.0966796875 4.140515327453613 9.0
+900.3688817391667 5855.2275390625 4.139819145202637 9.0
+900.3893161995948 5859.62841796875 4.140430927276611 9.0
+900.4097504595557 5854.3251953125 4.14024543762207 9.0
+900.43018481951 5856.00341796875 4.1398773193359375 9.0
+900.4710536387283 5848.65478515625 4.139174461364746 9.0
+900.4914879977587 5862.3388671875 4.140275001525879 9.0
+900.511922356789 5865.49658203125 4.14072322845459 9.0
+900.5323567155792 5856.18115234375 4.1393842697143555 9.0
+900.5527910741439 5856.43896484375 4.139803886413574 9.0
+900.5732254322429 5850.357421875 4.139115333557129 9.0
+900.5936597903346 5861.1982421875 4.139692783355713 9.0
+900.6140941482008 5858.04541015625 4.1400628089904785 9.0
+900.6345285058342 5854.078125 4.139474391937256 9.0
+900.6549627632339 5862.20068359375 4.140415191650391 9.0
+900.6753972201623 5857.16064453125 4.1393723487854 9.0
+900.6958315770971 5860.203125 4.139770030975342 9.0
+900.7162658337911 5854.2109375 4.139094352722168 9.0
+900.7367002902611 5853.759765625 4.138854026794434 9.0
+900.7571346464974 5859.84912109375 4.139389514923096 9.0
+900.7775691024945 5860.6953125 4.13962459564209 9.0
+900.7980033582644 5850.3017578125 4.138232707977295 9.0
+900.8184377135694 5854.43994140625 4.138916492462158 9.0
+900.838872168868 5838.3056640625 4.136978626251221 9.0
+900.8797407787788 5851.49169921875 4.138576984405518 9.0
+900.9001752333788 5852.63525390625 4.138041019439697 9.0
+900.9206094877518 5843.224609375 4.1376953125 9.0
+900.9410438418927 5846.66796875 4.137449741363525 9.0
+900.9614782957942 5853.45556640625 4.138037204742432 9.0
+900.9819126494695 5856.87939453125 4.138038158416748 9.0
+901.0023469026783 5846.78125 4.137002944946289 9.0
+901.0227813558813 5851.06103515625 4.136948585510254 9.0
+901.043215708858 5844.77587890625 4.136776924133301 9.0
+901.0636500615947 5848.15673828125 4.136595726013184 9.0
+901.0840844141057 5851.9892578125 4.137278079986572 9.0
+901.1249532184229 5850.25 4.136735439300537 9.0
+901.1453874702347 5853.15625 4.137192726135254 9.0
+901.1658218218145 5840.8505859375 4.136110305786133 9.0
+901.1862562731549 5855.1943359375 4.137054920196533 9.0
+901.2271248751495 5840.9658203125 4.135720729827881 9.0
+901.2475593255585 5843.59228515625 4.136014461517334 9.0
+901.2679935759734 5846.1669921875 4.136568069458008 9.0
+901.2884279261561 5840.22802734375 4.135565280914307 9.0
+901.3088622760988 5846.88720703125 4.135819435119629 9.0
+901.3292966258159 5837.11669921875 4.135595798492432 9.0
+901.349731075301 5841.70849609375 4.135934829711914 9.0
+901.3701653245516 5836.5126953125 4.135750770568848 9.0
+901.390599673563 5845.90380859375 4.136488437652588 9.0
+901.4110341223495 5837.07177734375 4.135521411895752 9.0
+901.4314683708944 5833.416015625 4.13529634475708 9.0
+901.4723371670698 5840.86572265625 4.135777473449707 9.0
+901.492771514917 5831.45263671875 4.134833812713623 9.0
+901.5132057625378 5834.5966796875 4.134805679321289 9.0
+901.5336402099274 5830.62109375 4.134751319885254 9.0
+901.5540745570761 5836.45947265625 4.134525775909424 9.0
+901.5745088039985 5834.3671875 4.134512424468994 9.0
+901.6153775969069 5832.79150390625 4.134612083435059 9.0
+901.6358120431323 5837.72900390625 4.134437561035156 9.0
+901.6562462891234 5840.1181640625 4.134912967681885 9.0
+901.6766806348751 5827.841796875 4.133602142333984 9.0
+901.697115080402 5835.81884765625 4.1341657638549805 9.0
+901.7175493256946 5829.5810546875 4.133618354797363 9.0
+901.737983670515 5831.27392578125 4.134105682373047 9.0
+901.7584181153434 5840.93896484375 4.13450813293457 9.0
+901.7788523599374 5843.60302734375 4.135330677032471 9.0
+901.7992867042922 5836.572265625 4.134348392486572 9.0
+901.8197211481893 5827.9404296875 4.132938385009766 9.0
+901.8401553920849 5838.01025390625 4.134562969207764 9.0
+901.8605897357411 5828.86181640625 4.133481025695801 9.0
+901.8810241791725 5826.97119140625 4.13314151763916 9.0
+901.9014584221368 5835.1953125 4.133544445037842 9.0
+901.9218928650953 5827.29248046875 4.132386207580566 9.0
+901.9423271078267 5834.8115234375 4.133256912231445 9.0
+901.962761550094 5829.67236328125 4.132328033447266 9.0
+901.9831958923533 5834.25732421875 4.133020401000977 9.0
+902.003630234387 5833.1484375 4.133323669433594 9.0
+902.0240644759542 5833.0048828125 4.133149147033691 9.0
+902.0444989175157 5828.19384765625 4.132779598236084 9.0
+902.0649332586181 5831.9130859375 4.1326680183410645 9.0
+902.0853674997197 5836.67431640625 4.133542537689209 9.0
+902.1058019405828 5840.083984375 4.133609771728516 9.0
+902.1262362809866 5821.96728515625 4.131380558013916 9.0
+902.1466705213898 5826.62060546875 4.132577419281006 9.0
+902.1671049613215 5823.4052734375 4.130970001220703 9.0
+902.1875393012597 5830.75341796875 4.132888317108154 9.0
+902.207973740733 5824.8232421875 4.132585525512695 9.0
+902.2284079801975 5832.318359375 4.13292932510376 9.0
+902.2488423192044 5820.34912109375 4.131392478942871 9.0
+902.2692767582048 5832.1650390625 4.132141590118408 9.0
+902.2897109967453 5836.48974609375 4.132340908050537 9.0
+902.3101453350537 5832.52587890625 4.131985664367676 9.0
+902.3305797733628 5825.236328125 4.13065767288208 9.0
+902.3510140111975 5829.41455078125 4.132043838500977 9.0
+902.3714483488075 5829.27734375 4.131627082824707 9.0
+902.4123170235544 5821.09521484375 4.130890846252441 9.0
+902.4327514604665 5824.86279296875 4.131197929382324 9.0
+902.453185797378 5826.10498046875 4.130721569061279 9.0
+902.4940544700294 5829.27294921875 4.130729675292969 9.0
+902.5144888060022 5836.07373046875 4.1316046714782715 9.0
+902.5349231417495 5829.298828125 4.130712032318115 9.0
+902.5553574774967 5827.3037109375 4.1303324699401855 9.0
+902.5757918127783 5815.115234375 4.129177570343018 9.0
+902.5962261478198 5824.4501953125 4.1293439865112305 9.0
+902.6370948172116 5834.30712890625 4.130256652832031 9.0
+902.6575291515619 5819.35498046875 4.12883186340332 9.0
+902.6779634856794 5831.01904296875 4.130338191986084 9.0
+902.698397819564 5821.0849609375 4.129229545593262 9.0
+902.7188322532093 5814.0458984375 4.128427982330322 9.0
+902.7392664866275 5820.3076171875 4.128759384155273 9.0
+902.7597008198063 5826.94677734375 4.1296610832214355 9.0
+902.7801352527604 5827.2236328125 4.129482746124268 9.0
+902.8005694854801 5821.4306640625 4.128877639770508 9.0
+902.8210038177349 5819.970703125 4.128620624542236 9.0
+902.8414382499832 5810.0185546875 4.127939701080322 9.0
+902.8618724820044 5813.95068359375 4.127767086029053 9.0
+902.8823068137863 5826.87451171875 4.129570484161377 9.0
+902.9027412451105 5824.61865234375 4.128230094909668 9.0
+902.9231754764332 5819.037109375 4.128063678741455 9.0
+902.9436098075239 5825.51416015625 4.128258228302002 9.0
+902.9640442381424 5832.44287109375 4.129125595092773 9.0
+902.9844785687674 5819.09228515625 4.128158092498779 9.0
+903.0049128991523 5821.6044921875 4.1282639503479 9.0
+903.0457815590053 5824.26416015625 4.128314971923828 9.0
+903.0662158884588 5820.62939453125 4.127532482147217 9.0
+903.1070845469148 5814.6103515625 4.126554012298584 9.0
+903.1275189756707 5820.62109375 4.127397060394287 9.0
+903.1479532044323 5819.15185546875 4.127563953399658 9.0
+903.168387532729 5815.32958984375 4.126833915710449 9.0
+903.1888219607863 5819.20849609375 4.127621173858643 9.0
+903.2092561888494 5819.3095703125 4.12783145904541 9.0
+903.2296905164476 5817.64697265625 4.128135681152344 9.0
+903.2501249438064 5820.31689453125 4.1278581619262695 9.0
+903.2705591709382 5814.80810546875 4.12692403793335 9.0
+903.2909935978387 5819.50634765625 4.127202987670898 9.0
+903.3114279244983 5820.923828125 4.127127647399902 9.0
+903.3318621509316 5821.34716796875 4.12681770324707 9.0
+903.3522965771335 5822.8359375 4.126453876495361 9.0
+903.3727308030939 5821.251953125 4.126217842102051 9.0
+903.3931651288294 5823.1640625 4.126488208770752 9.0
+903.4135995543329 5815.8193359375 4.12556266784668 9.0
+903.4340337795948 5836.4677734375 4.126929759979248 9.0
+903.4544681046318 5819.90625 4.1261887550354 9.0
+903.4749025294295 5819.38037109375 4.124704837799072 9.0
+903.4953367540002 5819.88623046875 4.125503063201904 9.0
+903.5362055022124 5817.7626953125 4.125767230987549 9.0
+903.556639826078 5825.59228515625 4.126492500305176 9.0
+903.5975084728852 5821.42578125 4.126133441925049 9.0
+903.6179427958268 5823.623046875 4.125039577484131 9.0
+903.6383771187684 5817.9423828125 4.125488758087158 9.0
+903.6588114412443 5818.888671875 4.124790191650391 9.0
+903.679245763713 5821.416015625 4.124969005584717 9.0
+903.699680185724 5816.68896484375 4.124982833862305 9.0
+903.7201144074934 5812.39404296875 4.123860836029053 9.0
+903.7405487292708 5810.97900390625 4.123969554901123 9.0
+903.7609831505833 5821.35009765625 4.124286651611328 9.0
+903.7814173716615 5822.84033203125 4.124403953552246 9.0
+903.8018516925003 5820.24609375 4.125539779663086 9.0
+903.8222861131144 5810.998046875 4.123820781707764 9.0
+903.8631547536352 5811.705078125 4.124183654785156 9.0
+903.88358907355 5822.974609375 4.123399257659912 9.0
+903.9040232932311 5826.73388671875 4.124969482421875 9.0
+903.9244577126738 5829.89111328125 4.124783992767334 9.0
+903.94489203189 5826.8603515625 4.124253749847412 9.0
+903.9653263508662 5827.56982421875 4.124608993530273 9.0
+903.9857606696169 5831.4541015625 4.124679088592529 9.0
+904.0061948879011 5827.7333984375 4.124279499053955 9.0
+904.0266293061795 5832.73876953125 4.125977516174316 9.0
+904.0470636242317 5820.59033203125 4.123894214630127 9.0
+904.0674979418181 5822.73876953125 4.123839378356934 9.0
+904.0879321593966 5823.9755859375 4.124898433685303 9.0
+904.1083665765182 5814.74755859375 4.123273849487305 9.0
+904.128800893639 5820.26953125 4.124179840087891 9.0
+904.1492352102869 5829.6513671875 4.124579906463623 9.0
+904.1696695267092 5824.1904296875 4.123741626739502 9.0
+904.1901038431315 5829.103515625 4.123937129974365 9.0
+904.2105382590817 5831.93017578125 4.124223232269287 9.0
+904.2309724748047 5829.3330078125 4.123320579528809 9.0
+904.2514067902957 5823.72509765625 4.1230974197387695 9.0
+904.2718412055474 5825.28466796875 4.122363567352295 9.0
+904.3127097353645 5830.23193359375 4.123278617858887 9.0
+904.3331441499176 5829.77783203125 4.124034404754639 9.0
+904.3535783642437 5840.35009765625 4.124382019042969 9.0
+904.3740126783377 5832.0263671875 4.123154640197754 9.0
+904.3944470921924 5832.49365234375 4.123984336853027 9.0
+904.41488130582 5827.84619140625 4.121768474578857 9.0
+904.4353157189835 5837.15380859375 4.123989105224609 9.0
+904.4761842448352 5833.462890625 4.123290061950684 9.0
+904.5170529697571 5824.33203125 4.122908115386963 9.0
+904.5374872819884 5830.69677734375 4.122740268707275 9.0
+904.5783559052798 5837.26708984375 4.12284517288208 9.0
+904.5987902168126 5836.587890625 4.122380256652832 9.0
+904.6600931493085 5834.5986328125 4.122237682342529 9.0
+904.6805275596707 5832.6044921875 4.122135639190674 9.0
+904.7009617698059 5831.4384765625 4.12257194519043 9.0
+904.7213961797097 5839.27392578125 4.122175693511963 9.0
+904.7622646988093 5840.47314453125 4.1226630210876465 9.0
+904.7826991077818 5834.2431640625 4.122710704803467 9.0
+904.8031333167528 5839.57373046875 4.123006820678711 9.0
+904.8235676254844 5836.53662109375 4.121890544891357 9.0
+904.8440020337584 5833.38330078125 4.121752738952637 9.0
+904.8644362420309 5849.24169921875 4.1249589920043945 9.0
+904.8848705498312 5842.4990234375 4.123100757598877 9.0
+904.9053049576396 5841.396484375 4.122658729553223 9.0
+904.9257391649808 5847.8056640625 4.1230998039245605 9.0
+904.9461734720826 5833.35498046875 4.121610641479492 9.0
+904.9666078789596 5840.9560546875 4.121856689453125 9.0
+904.9870420858351 5835.57080078125 4.120639801025391 9.0
+905.0074764922392 5845.48876953125 4.121120929718018 9.0
+905.027910798417 5840.8642578125 4.121163368225098 9.0
+905.0483451043547 5844.55322265625 4.121781826019287 9.0
+905.068779409834 5851.30078125 4.1217498779296875 9.0
+905.0892137153132 5840.7685546875 4.121327877044678 9.0
+905.1096480205597 5849.59765625 4.1223835945129395 9.0
+905.130082325566 5848.19091796875 4.122127056121826 9.0
+905.150516630114 5851.51123046875 4.12198543548584 9.0
+905.1913853387377 5847.78662109375 4.121969699859619 9.0
+905.2118195428193 5843.55419921875 4.121702194213867 9.0
+905.2322538464359 5840.7939453125 4.120302677154541 9.0
+905.252688250046 5843.6259765625 4.121304512023926 9.0
+905.2731224531963 5838.318359375 4.120189189910889 9.0
+905.2935568561079 5843.1337890625 4.12172269821167 9.0
+905.3139911587932 5845.712890625 4.12109899520874 9.0
+905.3344253612449 5847.4775390625 4.120069980621338 9.0
+905.3548597634581 5854.23974609375 4.121942520141602 9.0
+905.3752939654441 5854.95166015625 4.12116003036499 9.0
+905.3957282671981 5858.22021484375 4.12227725982666 9.0
+905.4365968697675 5852.455078125 4.121291160583496 9.0
+905.457031170823 5848.07763671875 4.120551586151123 9.0
+905.4774655716392 5854.93017578125 4.121452331542969 9.0
+905.4978997719954 5855.8212890625 4.120553493499756 9.0
+905.5387684722373 5862.615234375 4.121237754821777 9.0
+905.5592027718958 5858.04345703125 4.119906902313232 9.0
+905.5796370713215 5856.4404296875 4.11980676651001 9.0
+905.6000713707399 5860.44287109375 4.11984920501709 9.0
+905.6205056696999 5854.82763671875 4.11994743347168 9.0
+905.6409399684271 5869.318359375 4.121586799621582 9.0
+905.6613742669142 5866.24609375 4.119980335235596 9.0
+905.6818085649429 5862.916015625 4.119813919067383 9.0
+905.7022429629724 5855.408203125 4.119110107421875 9.0
+905.7226771607602 5855.3623046875 4.119117259979248 9.0
+905.7431114583233 5863.63427734375 4.119894027709961 9.0
+905.7635458554214 5867.2041015625 4.1199517250061035 9.0
+905.7839800525107 5867.841796875 4.119955539703369 9.0
+905.8044143491425 5862.43798828125 4.119598388671875 9.0
+905.824848745775 5863.95458984375 4.118742942810059 9.0
+905.845282941933 5870.349609375 4.119640827178955 9.0
+905.865717337867 5867.27099609375 4.119102478027344 9.0
+905.8861516335674 5868.67822265625 4.119019031524658 9.0
+905.9065858290269 5864.173828125 4.119871616363525 9.0
+905.9270202242624 5861.61572265625 4.119407653808594 9.0
diff --git a/homework/LiamNolan/06/rf.tab b/homework/LiamNolan/06/rf.tab
new file mode 100644
index 0000000..554607b
--- /dev/null
+++ b/homework/LiamNolan/06/rf.tab
@@ -0,0 +1,6 @@
+n oobs dered_petro_u dered_petro_g dered_petro_r dered_petro_i dered_petro_z petroMagErr_u petroMagErr_g petroMagErr_r petroMagErr_i petroMagErr_z v_disp sersicN_r petroR90_r
+5 -0.26315576373513805 0.07850880716227099 0.16317194533581061 0.04328597394653179 0.06469054659619668 0.06767549894947246 0.037088648446245716 0.045539878411629785 0.042184328084766874 0.04538809587146906 0.047173068823630426 0.176400877607964 0.06503399428909025 0.12385833647492119
+20 0.5073718880281453 0.08114609609025708 0.1638303715658782 0.06864909389462252 0.05068868179380014 0.06243924463419983 0.04059814606265155 0.03640073119466591 0.04309167087507875 0.04600385762071169 0.04190748361104963 0.19020235692006515 0.06298694133599501 0.1120553244010246
+50 0.5542366790353059 0.09724840335453043 0.1453592264297669 0.07095177445354876 0.04966725856954125 0.06055701944592181 0.041058061958804584 0.0347179718817852 0.04390075868629619 0.043731378656094555 0.04318057518985966 0.1972752615449709 0.060686873394430775 0.11166543643444903
+200 0.576749808174896 0.10387504390827297 0.14413414060857746 0.06955706184568981 0.052451812704902796 0.05356268879081298 0.04037524325680484 0.034677072299028416 0.04462061608615312 0.04343011235214412 0.04255175868658041 0.19081590923222794 0.060739375751551646 0.1192091644772536
+500 0.5811907983718865 0.10895914651818367 0.14356473854157148 0.06903409384194749 0.0581657155897573 0.05246898026156763 0.03988831297645746 0.03554298904932226 0.04476476368809584 0.04319821625565442 0.04254604486064355 0.19184689926117257 0.059466687977676146 0.1105534111779502
diff --git a/homework/LiamNolan/08_final/asas_data.dat b/homework/LiamNolan/08_final/asas_data.dat
new file mode 100644
index 0000000..491a54a
--- /dev/null
+++ b/homework/LiamNolan/08_final/asas_data.dat
@@ -0,0 +1,1488 @@
+# The All Sky Automated Survey Data
+# gp@astrouw.edu.pl
+#
+# ################ DESCRIPTION ###############
+# The ASAS Photometric Catalog is maintained separately for each
+# observed field, so for some stars independent 'datasets' of
+# measurements are available. Their mean magnitudes may slightly differ.
+#
+# In each 'dataset' (starting with #dataset=0,1,2,...):
+# 'desig' is ASAS designation (they may differ (by 1) at the last
+# digit of the RA & DEC fields
+# 'cra', 'cdec' are initial Catalog coordinates
+# 'ndata' is number of points in each dataset
+# 'cmag_*', 'cmer_*' are reference magnitude & dispersion for each aperture
+# 'nskip_*' is number of data points skipped when calculating 'cmag' & 'cmer'
+# 'ra', 'dec', 'mag', 'mer' are coordinates, magnitude and dispersion
+# calculated directly from the data
+#
+# Each data row consists of the following fields:
+# - HJD-2450000
+# - magnitudes (one for each aperture)
+# - frame errors describing average photometric quality of the frame (for each aperture)
+# - frame number
+# - grade :
+# A - best data, no 29.999 (not measured) indication
+# B - mean data, no 29.999 (not measured) indication
+# C - A and B with 29.999 (not measured) indication
+# D - worst data, probably useless
+#
+# ######### LIGHT CURVE BEGINS NEXT LINE ###########
+#ndata= 227
+#dataset= 1 ; 1 F0700-64_043
+#desig= 065307-5935.7
+#cra= 6.885405 06:53:07.5
+#cdec= -59.595626 -59:35:44.3
+#class= 0
+#cmag_0= 11.981
+#cmer_0= 0.274
+#nskip_0= 1
+#cmag_1= 11.978
+#cmer_1= 0.274
+#nskip_1= 1
+#cmag_2= 11.973
+#cmer_2= 0.267
+#nskip_2= 1
+#cmag_3= 11.973
+#cmer_3= 0.268
+#nskip_3= 1
+#cmag_4= 11.983
+#cmer_4= 0.271
+#nskip_4= 4
+#ra= 6.885404 06:53:07.5
+#dec= -59.595600 -59:35:44.2
+# HJD MAG_1 MAG_0 MAG_2 MAG_3 MAG_4 MER_1 MER_0 MER_2 MER_3 MER_4 GRADE FRAME
+ 1869.74854 12.260 12.271 12.226 12.184 12.190 0.030 0.058 0.027 0.031 0.037 A 292
+ 1875.76359 11.497 11.548 11.495 11.507 11.523 0.031 0.069 0.028 0.032 0.041 B 1221
+ 1877.76186 12.222 12.248 12.222 12.246 12.284 0.029 0.050 0.025 0.029 0.033 A 1539
+ 1879.75361 12.023 12.049 12.048 12.054 12.049 0.026 0.037 0.024 0.027 0.032 A 1851
+ 1881.72783 11.561 11.549 11.553 11.542 11.538 0.029 0.045 0.025 0.027 0.032 A 2154
+ 1884.70932 11.637 11.669 11.661 11.676 11.666 0.030 0.045 0.026 0.028 0.034 A 2295
+ 1885.71965 12.034 12.073 12.038 12.064 12.092 0.030 0.040 0.024 0.027 0.031 A 2459
+ 1887.71443 11.745 11.802 11.720 11.715 11.717 0.032 0.051 0.027 0.030 0.036 A 2776
+ 1888.71132 12.174 12.163 12.162 12.181 12.157 0.030 0.052 0.027 0.030 0.035 A 2935
+ 1902.67449 12.111 12.111 12.113 12.101 12.096 0.030 0.040 0.023 0.026 0.030 A 3525
+ 1903.69102 12.297 12.282 12.278 12.283 12.289 0.030 0.051 0.025 0.028 0.034 A 3692
+ 1904.67398 11.778 11.836 11.765 11.770 11.790 0.028 0.046 0.025 0.028 0.033 A 3844
+ 1905.68298 12.198 12.164 12.181 12.162 12.165 0.029 0.043 0.024 0.027 0.033 A 4010
+ 1906.67407 11.878 11.920 11.875 11.862 11.861 0.029 0.042 0.024 0.027 0.031 A 4168
+ 1907.68106 11.901 11.939 11.885 11.874 11.878 0.031 0.039 0.024 0.026 0.030 A 4331
+ 1908.67334 12.269 12.281 12.240 12.251 12.266 0.031 0.043 0.024 0.027 0.031 A 4489
+ 1913.65004 11.998 11.978 12.014 12.027 12.026 0.027 0.035 0.024 0.026 0.030 A 4616
+ 1914.66611 12.303 12.264 12.273 12.240 12.249 0.028 0.038 0.025 0.028 0.032 A 4782
+ 1915.66562 11.595 11.649 11.600 11.580 11.580 0.031 0.047 0.026 0.029 0.033 A 4940
+ 1919.65379 12.080 12.103 12.060 12.050 12.039 0.032 0.044 0.027 0.030 0.035 A 5310
+ 1920.65806 12.095 12.079 12.093 12.094 12.085 0.029 0.041 0.026 0.028 0.033 A 5472
+ 1921.65130 11.844 11.795 11.827 11.819 11.809 0.032 0.040 0.026 0.028 0.032 A 5628
+ 1922.65065 12.186 12.207 12.161 12.174 12.170 0.034 0.042 0.025 0.026 0.030 A 5779
+ 1923.64607 11.665 11.683 11.696 11.705 11.738 0.032 0.044 0.026 0.028 0.033 A 5942
+ 1924.64563 11.898 11.939 11.876 11.880 11.890 0.034 0.040 0.032 0.035 0.040 A 6111
+ 1925.65095 12.159 12.199 12.177 12.165 12.173 0.047 0.056 0.044 0.046 0.050 B 6282
+ 1926.64059 11.408 11.407 11.415 11.404 11.409 0.029 0.035 0.024 0.027 0.030 A 6448
+ 1928.65143 12.227 12.246 12.214 12.215 12.204 0.029 0.037 0.024 0.026 0.031 A 6777
+ 1929.64208 11.562 11.568 11.541 11.535 11.529 0.030 0.037 0.024 0.026 0.031 A 6928
+ 1930.64015 12.068 12.066 12.078 12.068 12.105 0.030 0.035 0.023 0.025 0.029 A 7094
+ 1931.63516 12.248 12.282 12.201 12.168 12.182 0.038 0.041 0.032 0.034 0.038 A 7261
+ 1933.63171 12.114 12.123 12.128 12.119 12.115 0.035 0.041 0.025 0.026 0.030 A 7589
+ 1934.62435 12.362 12.338 12.401 12.442 12.471 0.031 0.040 0.025 0.027 0.031 A 7749
+ 1936.60618 12.166 12.211 12.174 12.198 12.226 0.033 0.037 0.025 0.025 0.030 A 8012
+ 1938.60104 11.777 11.789 11.793 11.815 11.850 0.035 0.040 0.025 0.026 0.029 A 8250
+ 1940.60875 11.597 11.588 11.627 11.631 11.655 0.034 0.037 0.025 0.026 0.029 A 8498
+ 1945.59775 12.251 12.216 12.215 12.251 12.308 0.039 0.048 0.028 0.028 0.032 A 8668
+ 1946.61786 11.598 11.610 11.636 11.679 11.698 0.034 0.040 0.027 0.029 0.033 A 8793
+ 1948.56968 12.274 12.280 12.262 12.226 12.230 0.034 0.042 0.027 0.028 0.033 A 9027
+ 1950.56300 12.159 12.164 12.135 12.096 12.088 0.050 0.062 0.034 0.028 0.030 B 9333
+ 1953.58602 12.183 12.224 12.177 12.179 12.163 0.038 0.042 0.028 0.029 0.031 A 9649
+ 1958.57201 11.961 12.015 11.943 11.926 11.941 0.039 0.044 0.031 0.032 0.031 A 10174
+ 1961.55750 12.017 12.058 12.029 12.059 12.030 0.040 0.044 0.032 0.035 0.031 A 10444
+ 1963.55889 11.606 11.545 11.607 11.634 11.590 0.037 0.043 0.030 0.035 0.032 A 10778
+ 1965.54996 12.305 12.274 12.323 12.358 12.389 0.038 0.041 0.028 0.031 0.030 A 11139
+ 1967.54470 12.153 12.142 12.201 12.211 12.214 0.038 0.044 0.031 0.035 0.032 A 11489
+ 1978.55777 12.047 12.020 12.088 12.105 12.121 0.045 0.049 0.038 0.043 0.038 B 12022
+ 1980.58244 11.802 11.815 11.792 11.780 11.776 0.041 0.048 0.036 0.042 0.038 A 12351
+ 1982.53695 12.284 12.265 12.281 12.305 12.281 0.037 0.042 0.032 0.038 0.034 A 12704
+ 1985.51378 12.233 12.264 12.214 12.242 12.219 0.044 0.052 0.038 0.045 0.043 A 13106
+ 1996.51747 12.237 12.240 12.207 12.266 12.305 0.050 0.060 0.042 0.050 0.050 B 13792
+ 1998.52158 12.293 12.241 12.326 12.367 12.362 0.052 0.061 0.045 0.048 0.049 B 14196
+ 2011.48408 11.637 11.645 11.643 11.624 11.669 0.056 0.065 0.046 0.051 0.052 D 15514
+ 2026.50317 12.151 12.137 12.156 12.178 12.196 0.034 0.037 0.031 0.032 0.033 A 17350
+ 2031.49106 11.857 11.872 11.851 11.850 11.866 0.031 0.039 0.029 0.030 0.034 A 17960
+ 2033.51647 11.459 11.454 11.468 11.475 11.509 0.032 0.055 0.028 0.030 0.037 A 18404
+ 2143.88560 12.220 12.270 12.215 12.196 12.150 0.034 0.061 0.031 0.034 0.040 A 30908
+ 2443.44891 11.744 11.733 11.712 11.732 11.755 0.037 0.046 0.029 0.030 0.033 A 8592
+ 2553.81424 11.888 11.997 11.854 11.855 11.878 0.057 0.064 0.050 0.050 0.051 D 21400
+ 2556.83394 11.394 11.421 11.398 11.395 11.421 0.050 0.061 0.041 0.045 0.046 B 21776
+ 2560.79500 12.064 12.070 12.052 12.049 12.045 0.037 0.048 0.029 0.030 0.033 A 22474
+ 2621.75501 11.515 11.566 11.521 11.517 11.532 0.035 0.034 0.032 0.034 0.036 A 29851
+ 2623.70948 12.289 12.283 12.245 12.258 12.239 0.034 0.033 0.028 0.032 0.033 A 30163
+ 2625.69731 12.168 12.185 12.191 12.204 12.283 0.037 0.035 0.034 0.037 0.039 A 30440
+ 2628.68287 12.205 12.141 12.247 12.214 12.140 0.047 0.044 0.044 0.049 0.051 B 30741
+ 2631.80892 12.270 12.273 12.240 12.236 12.264 0.035 0.040 0.038 0.039 0.046 A 31653
+ 2635.66487 11.594 11.550 11.601 11.597 11.597 0.032 0.034 0.029 0.031 0.034 A 32239
+ 2637.67800 12.264 12.337 12.265 12.260 12.290 0.031 0.034 0.028 0.028 0.030 A 32536
+ 2639.67805 12.097 12.123 12.100 12.110 12.146 0.033 0.037 0.030 0.035 0.035 A 32844
+ 2641.68757 11.723 11.711 11.726 11.737 11.755 0.035 0.034 0.030 0.034 0.035 A 33131
+ 2643.69257 12.297 12.297 12.285 12.288 12.318 0.026 0.034 0.023 0.025 0.030 A 33444
+ 2645.68128 12.131 12.162 12.105 12.122 12.152 0.035 0.034 0.031 0.034 0.035 A 33737
+ 2647.66640 11.881 11.947 11.897 11.886 11.902 0.053 0.051 0.054 0.061 0.070 D 34027
+ 2650.63603 11.923 11.915 11.920 11.919 11.972 0.035 0.033 0.030 0.032 0.033 A 34280
+ 2652.66060 11.538 11.474 11.518 11.498 11.471 0.036 0.034 0.029 0.033 0.035 A 34596
+ 2654.65275 12.388 12.266 12.410 12.416 12.434 0.039 0.040 0.039 0.034 0.034 A 34902
+ 2657.68611 12.347 12.306 12.341 12.344 12.344 0.037 0.037 0.036 0.038 0.039 A 35447
+ 2659.69790 12.103 12.131 12.102 12.090 12.090 0.033 0.036 0.032 0.033 0.037 A 35794
+ 2663.69156 11.440 11.433 11.455 11.456 11.454 0.040 0.036 0.037 0.036 0.036 A 36472
+ 2667.68393 12.067 12.121 12.058 12.045 12.052 0.036 0.039 0.035 0.034 0.035 A 37124
+ 2669.67337 11.624 11.590 11.611 11.589 11.576 0.036 0.036 0.034 0.035 0.037 A 37446
+ 2671.67251 12.218 12.242 12.210 12.207 12.243 0.032 0.038 0.031 0.032 0.034 A 37775
+ 2673.66706 12.194 12.165 12.166 12.135 12.147 0.033 0.035 0.033 0.033 0.035 A 38110
+ 2675.65485 11.785 11.843 11.790 11.811 11.818 0.033 0.036 0.032 0.032 0.033 A 38464
+ 2677.63666 11.902 11.904 11.877 11.865 11.858 0.030 0.034 0.029 0.032 0.035 A 38803
+ 2678.80775 12.170 12.145 12.137 12.111 12.103 0.031 0.033 0.026 0.027 0.031 A 39048
+ 2680.64860 11.468 11.451 11.463 11.464 11.471 0.027 0.034 0.024 0.025 0.029 A 39310
+ 2683.68859 11.589 11.605 11.605 11.601 11.615 0.028 0.034 0.025 0.027 0.030 A 39837
+ 2685.64871 12.245 12.196 12.251 12.272 12.355 0.034 0.046 0.028 0.028 0.032 A 40182
+ 2686.79027 12.044 12.091 12.002 11.969 11.958 0.031 0.046 0.030 0.033 0.038 A 40425
+ 2688.68705 11.872 11.898 11.884 11.898 11.948 0.027 0.034 0.026 0.029 0.033 A 40746
+ 2690.68137 12.187 12.236 12.171 12.132 12.152 0.031 0.039 0.027 0.028 0.033 A 41112
+ 2691.78629 11.580 11.584 11.582 11.612 11.595 0.035 0.042 0.035 0.038 0.043 A 41345
+ 2694.52567 12.238 12.259 12.220 12.202 12.229 0.038 0.042 0.034 0.039 0.040 A 41721
+ 2696.55440 99.999 99.999 99.999 99.999 99.999 0.037 0.041 0.034 0.038 0.040 C 42065
+ 2698.54869 11.917 11.895 11.910 11.931 11.929 0.038 0.044 0.036 0.041 0.042 A 42471
+ 2700.55352 11.504 11.443 11.506 11.495 11.482 0.039 0.042 0.038 0.045 0.047 A 42860
+ 2702.54537 12.260 12.243 12.248 12.251 12.252 0.039 0.040 0.032 0.039 0.042 A 43238
+ 2706.52551 11.604 11.620 11.639 11.651 11.663 0.037 0.045 0.035 0.039 0.039 A 43983
+ 2709.70206 12.042 12.001 12.046 12.057 12.095 0.035 0.038 0.037 0.036 0.038 A 44600
+ 2711.62534 11.442 11.453 11.460 11.459 11.491 0.029 0.041 0.026 0.027 0.032 A 44940
+ 2713.62591 12.221 12.245 12.199 12.191 12.190 0.028 0.032 0.025 0.028 0.032 A 45314
+ 2715.63803 12.169 12.177 12.160 12.144 12.116 0.030 0.036 0.027 0.031 0.037 A 45694
+ 2719.54705 12.260 12.263 12.228 12.227 12.274 0.028 0.032 0.024 0.026 0.029 A 46060
+ 2720.68942 11.904 11.871 11.895 11.881 11.900 0.029 0.042 0.028 0.032 0.038 A 46316
+ 2722.61496 11.699 11.645 11.686 11.703 11.706 0.027 0.040 0.025 0.026 0.031 A 46672
+ 2724.61297 12.263 12.283 12.245 12.229 12.253 0.026 0.034 0.023 0.025 0.028 A 47053
+ 2726.61139 12.038 12.033 12.051 12.045 12.067 0.028 0.035 0.025 0.028 0.032 A 47452
+ 2728.60271 11.526 11.540 99.999 99.999 99.999 0.028 0.045 0.026 0.028 0.032 C 47843
+ 2730.59873 12.265 12.244 12.260 12.253 12.266 0.028 0.039 0.026 0.028 0.032 A 48250
+ 2733.64522 12.002 11.967 11.984 11.981 12.005 0.027 0.035 0.025 0.027 0.032 A 48624
+ 2735.64101 12.220 12.221 12.215 12.227 12.264 0.026 0.031 0.025 0.027 0.031 A 49028
+ 2737.62823 11.915 11.876 11.898 11.887 11.884 0.028 0.041 0.025 0.028 0.034 A 49419
+ 2739.62083 11.460 11.445 11.463 11.463 11.464 0.028 0.036 0.027 0.030 0.035 A 49751
+ 2741.58830 12.284 12.282 12.268 12.237 12.228 0.028 0.039 0.025 0.028 0.033 A 50131
+ 2743.59593 12.065 12.066 12.092 12.092 12.093 0.029 0.042 0.027 0.031 0.035 A 50536
+ 2745.60863 11.729 11.660 11.746 11.777 11.835 0.032 0.037 0.032 0.038 0.044 A 50918
+ 2750.57344 12.195 12.193 12.202 12.194 12.198 0.031 0.041 0.027 0.028 0.031 A 51607
+ 2752.54983 12.151 12.116 12.147 12.154 12.182 0.031 0.040 0.029 0.027 0.030 A 51987
+ 2755.54551 12.280 12.249 12.277 12.283 12.312 0.029 0.035 0.027 0.027 0.030 A 52420
+ 2757.54241 12.012 11.992 11.988 11.966 11.974 0.028 0.032 0.024 0.026 0.030 A 52835
+ 2759.56985 11.633 11.573 11.650 11.677 11.731 0.037 0.044 0.039 0.046 0.055 B 53190
+ 2761.54572 12.266 12.234 12.265 12.260 12.262 0.028 0.034 0.024 0.026 0.031 A 53591
+ 2763.54221 12.113 12.159 12.106 12.113 12.130 0.028 0.040 0.026 0.028 0.031 A 53985
+ 2766.53222 12.138 12.154 12.118 12.095 12.068 0.028 0.041 0.026 0.029 0.033 A 54480
+ 2770.54736 11.531 11.539 11.530 11.538 11.541 0.027 0.034 0.025 0.029 0.032 A 54818
+ 2776.48895 11.461 11.430 11.444 11.422 11.414 0.026 0.037 0.025 0.028 0.032 A 55245
+ 2783.49841 12.200 12.222 12.195 12.185 12.189 0.029 0.037 0.025 0.027 0.031 A 55876
+ 2785.50248 11.863 11.856 11.883 11.887 11.920 0.028 0.033 0.025 0.026 0.031 A 56299
+ 2787.50234 11.514 11.535 11.503 11.505 11.489 0.028 0.034 0.026 0.028 0.031 A 56737
+ 2791.48576 11.983 12.007 11.942 11.898 11.925 0.036 0.042 0.035 0.038 0.042 A 57487
+ 2794.47533 12.082 12.066 12.057 12.035 12.003 0.029 0.039 0.026 0.029 0.034 A 57998
+ 2797.47511 12.097 12.138 12.078 12.058 12.024 0.034 0.039 0.034 0.040 0.046 A 58556
+ 2811.45530 12.151 12.162 12.108 12.097 12.103 0.028 0.034 0.025 0.027 0.031 A 59879
+ 2876.89030 11.885 11.853 11.869 11.843 11.862 0.031 0.036 0.028 0.030 0.033 A 68862
+ 2884.86208 11.488 11.525 11.506 11.521 11.522 0.031 0.034 0.028 0.029 0.032 A 69913
+ 2893.84247 11.754 11.827 11.685 11.640 11.613 0.035 0.039 0.032 0.034 0.038 A 70963
+ 2902.87560 12.172 12.119 12.157 12.153 12.146 0.050 0.051 0.049 0.056 0.065 D 72614
+ 2906.82809 12.270 12.221 12.268 12.283 12.298 0.033 0.036 0.030 0.031 0.032 A 73254
+ 2910.83552 11.913 11.967 11.880 11.846 11.834 0.032 0.032 0.030 0.032 0.033 A 73809
+ 2912.84791 11.495 11.497 11.503 11.504 11.488 0.032 0.034 0.030 0.032 0.034 A 74189
+ 2916.78895 12.000 11.978 12.005 12.009 11.976 0.034 0.035 0.030 0.033 0.034 A 74643
+ 2918.86584 11.750 11.731 11.750 11.773 11.829 0.042 0.041 0.047 0.060 0.074 D 74984
+ 2922.77343 12.099 12.100 12.072 12.119 12.180 0.034 0.039 0.035 0.039 0.044 A 75328
+ 2924.83265 11.835 11.868 11.880 11.907 11.901 0.033 0.035 0.031 0.034 0.038 A 75711
+ 2927.78670 11.901 11.911 11.903 11.900 11.927 0.028 0.036 0.024 0.027 0.030 A 76068
+ 2929.80373 11.501 11.514 11.479 11.446 11.507 0.035 0.038 0.033 0.038 0.045 A 76432
+ 2932.81940 11.697 11.641 11.686 11.686 11.675 0.030 0.034 0.029 0.032 0.036 A 76973
+ 2935.79061 11.664 11.682 11.657 11.654 11.639 0.030 0.035 0.029 0.033 0.037 A 77501
+ 2939.86386 12.302 12.305 12.295 12.305 12.369 0.038 0.037 0.035 0.038 0.041 A 77913
+ 2943.80784 11.480 11.498 11.476 11.483 11.494 0.026 0.033 0.024 0.026 0.030 A 78437
+ 2946.74917 11.479 11.476 11.491 11.508 11.518 0.034 0.036 0.033 0.034 0.036 A 78876
+ 2948.81944 12.260 12.281 12.249 12.255 12.298 0.035 0.040 0.036 0.040 0.042 A 79188
+ 2951.80725 12.209 12.187 12.221 12.250 12.289 0.033 0.036 0.029 0.035 0.043 A 79632
+ 2954.78286 11.768 11.726 11.763 11.780 11.785 0.037 0.040 0.034 0.037 0.041 A 80000
+ 2957.76376 11.505 11.524 11.549 11.560 11.613 0.034 0.039 0.030 0.032 0.036 A 80427
+ 2960.76947 11.502 11.470 11.519 11.539 11.557 0.040 0.045 0.039 0.047 0.059 D 80832
+ 2963.76496 11.672 11.668 11.693 11.706 11.733 0.059 0.083 0.051 0.051 0.051 D 81250
+ 2965.81884 12.011 11.924 11.980 11.983 12.004 0.037 0.039 0.038 0.044 0.047 A 81558
+ 2968.75009 12.189 12.210 12.203 12.211 12.225 0.031 0.036 0.030 0.035 0.045 A 81951
+ 2971.73795 11.764 11.797 11.785 11.783 11.809 0.029 0.031 0.025 0.026 0.029 A 82286
+ 2974.73819 11.476 11.516 11.478 11.475 11.458 0.033 0.042 0.031 0.033 0.036 A 82614
+ 2976.74442 12.238 12.268 12.188 12.169 12.184 0.037 0.042 0.036 0.042 0.054 B 82896
+ 2978.75061 12.075 12.068 12.057 12.059 12.083 0.030 0.037 0.026 0.028 0.029 A 83173
+ 2982.76294 12.116 12.114 12.107 12.116 12.069 0.030 0.034 0.029 0.035 0.042 A 83698
+ 2985.70179 12.240 12.178 12.156 12.036 11.949 0.032 0.032 0.034 0.039 0.042 A 84062
+ 2987.75578 12.258 12.245 12.225 12.207 12.198 0.028 0.036 0.025 0.028 0.031 A 84351
+ 2989.78900 12.062 12.067 12.069 12.062 12.081 0.027 0.032 0.024 0.027 0.030 A 84581
+ 2992.68292 11.853 11.884 11.818 11.812 11.839 0.036 0.040 0.039 0.041 0.045 A 84937
+ 2994.74807 11.664 11.684 11.665 11.669 11.672 0.053 0.059 0.043 0.040 0.038 B 85226
+ 2996.73939 12.278 12.314 12.281 12.260 12.285 0.028 0.034 0.023 0.026 0.029 A 85485
+ 2998.74671 12.365 12.391 12.306 12.316 12.304 0.031 0.034 0.027 0.032 0.040 A 85763
+ 3001.72832 12.213 12.194 12.185 12.148 12.117 0.040 0.037 0.041 0.043 0.044 B 86023
+ 3007.72048 12.445 12.455 12.404 12.377 99.999 0.032 0.036 0.030 0.035 0.044 C 86755
+ 3011.77679 11.822 11.880 11.803 11.821 11.853 0.029 0.038 0.028 0.030 0.033 A 87301
+ 3019.66918 11.643 11.624 11.637 11.644 11.604 0.031 0.037 0.028 0.032 0.034 A 88153
+ 3023.67551 12.011 12.051 11.964 11.923 11.906 0.039 0.044 0.034 0.035 0.037 A 88311
+ 3028.65503 11.681 11.664 11.679 11.694 11.722 0.028 0.032 0.023 0.026 0.031 A 88565
+ 3030.69837 11.915 11.851 11.915 11.921 11.927 0.027 0.032 0.024 0.026 0.030 A 88751
+ 3032.72040 12.295 12.232 12.310 12.321 12.404 0.041 0.039 0.036 0.039 0.040 A 88934
+ 3034.74390 12.006 12.013 12.000 12.019 12.070 0.044 0.050 0.045 0.048 0.051 B 89170
+ 3036.82047 11.855 11.797 11.875 11.903 11.919 0.032 0.042 0.028 0.031 0.036 A 89423
+ 3040.82539 12.235 12.228 12.248 12.277 12.256 0.031 0.036 0.030 0.033 0.037 A 89618
+ 3043.67852 12.168 12.164 12.163 12.182 12.150 0.029 0.036 0.027 0.032 0.038 A 89942
+ 3045.72419 11.941 11.934 11.927 11.916 11.914 0.029 0.037 0.027 0.029 0.032 A 90225
+ 3048.68976 11.946 11.958 11.926 11.899 11.906 0.029 0.038 0.028 0.032 0.036 A 90616
+ 3051.63089 11.982 12.004 12.006 12.025 12.029 0.029 0.037 0.025 0.028 0.031 A 90992
+ 3053.68542 11.559 11.600 11.566 11.558 11.534 0.028 0.037 0.025 0.028 0.032 A 91284
+ 3055.74905 11.996 12.006 11.986 11.973 11.923 0.034 0.042 0.030 0.035 0.040 A 91583
+ 3058.57779 12.313 12.350 12.291 12.270 12.298 0.030 0.033 0.026 0.030 0.033 A 91930
+ 3060.64277 12.212 12.224 12.174 12.178 12.173 0.027 0.032 0.025 0.027 0.030 A 92211
+ 3064.70782 11.633 11.607 11.635 11.650 11.706 0.040 0.041 0.044 0.054 0.067 D 92774
+ 3067.69401 11.645 11.665 11.635 11.646 11.671 0.028 0.032 0.026 0.029 0.033 A 93066
+ 3069.70749 12.399 12.362 12.455 12.517 12.608 0.033 0.039 0.033 0.039 0.047 A 93364
+ 3071.72612 12.187 12.230 12.255 12.339 12.353 0.031 0.037 0.029 0.035 0.042 A 93658
+ 3074.63207 12.253 12.253 12.241 12.262 12.301 0.029 0.035 0.026 0.029 0.033 A 93986
+ 3076.65899 11.834 11.850 11.826 11.847 11.906 0.027 0.031 0.026 0.028 0.033 A 94275
+ 3078.66097 11.536 11.584 11.528 11.513 11.519 0.029 0.035 0.027 0.030 0.035 A 94578
+ 3080.67476 12.187 12.139 12.179 12.180 12.165 0.063 0.065 0.065 0.069 0.075 D 94871
+ 3082.70873 12.161 12.210 12.070 11.993 11.943 0.040 0.043 0.042 0.047 0.055 B 95177
+ 3086.70078 12.032 12.048 12.031 12.048 12.084 0.028 0.033 0.026 0.031 0.036 A 95476
+ 3089.53634 12.285 12.310 12.247 12.218 12.252 0.032 0.035 0.028 0.032 0.037 A 95878
+ 3091.54343 12.169 12.185 12.157 12.148 12.148 0.029 0.034 0.029 0.034 0.039 A 96194
+ 3097.57052 12.277 12.249 12.270 12.261 12.252 0.028 0.033 0.027 0.029 0.032 A 96786
+ 3099.59309 11.937 11.979 11.956 11.982 11.970 0.031 0.036 0.029 0.031 0.036 A 97110
+ 3101.59873 11.525 11.562 11.504 11.491 11.502 0.030 0.034 0.028 0.031 0.037 A 97416
+ 3103.60551 12.249 12.233 12.233 12.212 12.213 0.030 0.034 0.026 0.028 0.032 A 97734
+ 3105.60277 12.117 12.181 12.092 12.062 12.058 0.031 0.038 0.030 0.035 0.042 A 98051
+ 3107.60309 11.839 11.807 11.815 11.835 11.831 0.029 0.034 0.024 0.028 0.032 A 98368
+ 3109.60825 11.425 11.500 11.413 11.390 11.391 0.037 0.040 0.027 0.029 0.032 A 98680
+ 3111.60609 12.213 12.261 12.199 12.183 12.219 0.028 0.032 0.025 0.028 0.032 A 98992
+ 3113.62632 12.096 12.101 12.122 12.145 12.169 0.029 0.036 0.025 0.028 0.033 A 99320
+ 3121.58774 11.790 11.803 11.807 11.817 11.827 0.027 0.032 0.025 0.028 0.031 A 100070
+ 3123.59565 11.562 11.523 11.554 11.516 11.509 0.046 0.049 0.045 0.048 0.052 B 100363
+ 3126.53160 11.744 11.773 11.751 11.772 11.802 0.028 0.035 0.026 0.029 0.033 A 100843
+ 3128.56191 12.241 12.259 12.237 12.238 12.253 0.031 0.034 0.028 0.032 0.037 A 101170
+ 3130.57283 12.138 12.103 12.092 12.068 12.124 0.029 0.035 0.030 0.034 0.039 A 101465
+ 3132.57971 11.677 11.651 11.701 11.737 11.765 0.028 0.036 0.027 0.030 0.035 A 101799
+ 3144.54922 12.082 12.088 12.045 12.010 12.018 0.027 0.033 0.025 0.029 0.034 A 103243
+ 3154.48670 12.259 12.257 12.262 12.248 12.254 0.028 0.037 0.026 0.029 0.032 A 103887
+ 3158.48218 11.867 11.889 11.850 11.859 11.858 0.035 0.037 0.034 0.038 0.044 A 104350
+ 3162.47866 12.236 12.257 12.226 12.227 12.240 0.028 0.036 0.024 0.027 0.032 A 104790
+ 3165.47342 12.402 12.402 12.417 12.462 12.614 0.029 0.034 0.027 0.031 0.036 A 105312
+ 3169.45935 11.788 11.788 11.775 11.760 11.745 0.027 0.034 0.025 0.028 0.032 A 105867
+ 3175.46504 11.933 11.916 11.927 11.964 11.959 0.028 0.032 0.024 0.027 0.031 A 106529
+ 3373.79949 12.028 12.029 12.026 12.024 12.037 0.051 0.058 0.052 0.057 0.063 D 125384
+ 3382.68433 12.127 12.157 12.102 12.102 12.089 0.042 0.059 0.041 0.046 0.050 B 125644
+#ndata= 477
+#dataset= 2 ; 1 F0624-56_068
+#desig= 065307-5935.7
+#cra= 6.885405 06:53:07.5
+#cdec= -59.595626 -59:35:44.3
+#class= 0
+#cmag_0= 11.982
+#cmer_0= 0.290
+#nskip_0= 0
+#cmag_1= 12.018
+#cmer_1= 0.260
+#nskip_1= 0
+#cmag_2= 12.042
+#cmer_2= 0.259
+#nskip_2= 2
+#cmag_3= 12.056
+#cmer_3= 0.264
+#nskip_3= 2
+#cmag_4= 12.083
+#cmer_4= 0.268
+#nskip_4= 3
+#ra= 6.885376 06:53:07.4
+#dec= -59.595571 -59:35:44.1
+# HJD MAG_0 MAG_1 MAG_2 MAG_3 MAG_4 MER_0 MER_1 MER_2 MER_3 MER_4 GRADE FRAME
+ 1868.74122 12.160 12.124 12.107 12.093 12.086 0.370 0.282 0.244 0.221 0.219 D 125
+ 1869.73135 12.335 12.305 12.294 12.285 12.302 0.306 0.224 0.187 0.169 0.180 D 284
+ 1870.73466 11.540 11.594 11.593 11.586 11.596 0.354 0.265 0.232 0.232 0.227 D 433
+ 1871.75997 10.868 10.508 10.419 10.379 10.359 0.272 0.231 0.205 0.198 0.204 D 574
+ 1872.74161 12.145 12.178 12.164 12.126 12.129 0.350 0.271 0.232 0.235 0.236 D 727
+ 1873.73636 11.938 11.855 11.827 11.806 11.816 0.384 0.279 0.248 0.232 0.238 D 887
+ 1874.73961 12.507 12.636 12.614 12.602 12.637 0.341 0.263 0.228 0.217 0.222 D 1050
+ 1875.72552 11.736 11.794 11.790 11.774 11.785 0.334 0.253 0.220 0.224 0.210 D 1204
+ 1876.72442 11.938 11.919 11.905 11.908 11.934 0.288 0.220 0.183 0.170 0.183 D 1365
+ 1877.72747 12.174 12.255 12.266 12.272 12.280 0.198 0.153 0.136 0.134 0.131 B 1525
+ 1878.72644 11.460 11.473 11.460 11.458 11.492 0.215 0.165 0.143 0.130 0.140 D 1683
+ 1879.71766 11.964 11.948 11.963 11.956 11.958 0.174 0.140 0.122 0.124 0.129 B 1835
+ 1880.71166 12.272 12.277 12.265 12.259 12.257 0.194 0.153 0.135 0.128 0.139 B 1988
+ 1881.70621 11.433 11.471 11.464 11.445 11.452 0.209 0.170 0.142 0.141 0.143 B 2144
+ 1885.70256 12.032 12.005 12.025 12.031 12.038 0.109 0.085 0.086 0.085 0.085 B 2451
+ 1886.70392 12.301 12.256 12.293 12.317 12.326 0.234 0.186 0.150 0.133 0.130 D 2613
+ 1887.69485 11.501 11.649 11.686 11.692 11.694 0.258 0.200 0.159 0.142 0.141 D 2767
+ 1888.69424 12.148 12.094 12.125 12.164 12.193 0.237 0.178 0.157 0.151 0.151 D 2927
+ 1889.69087 12.274 12.279 12.292 12.293 12.349 0.195 0.154 0.125 0.118 0.118 B 3087
+ 1899.67036 11.997 11.953 11.965 11.969 11.979 0.213 0.184 0.150 0.131 0.130 B 3208
+ 1900.67964 12.232 12.209 12.212 12.204 12.231 0.157 0.138 0.113 0.102 0.108 B 3370
+ 1905.66573 29.999 29.999 29.999 29.999 29.999 0.170 0.147 0.125 0.118 0.128 C 4002
+ 1918.62897 11.666 11.633 11.650 11.646 11.640 0.141 0.119 0.110 0.113 0.107 B 5139
+ 1954.56262 12.156 12.183 12.195 12.213 12.195 0.053 0.046 0.033 0.032 0.028 A 9819
+ 1994.50093 11.512 11.522 11.512 11.516 11.554 0.096 0.079 0.054 0.054 0.054 A 13390
+ 2000.52848 11.816 11.804 11.820 11.807 11.849 0.093 0.106 0.076 0.067 0.070 B 14606
+ 2008.48979 11.477 11.532 11.549 11.560 11.565 0.088 0.094 0.065 0.054 0.046 B 15107
+ 2136.88560 11.912 11.860 11.856 11.835 11.837 0.262 0.198 0.179 0.162 0.175 D 29750
+ 2156.87468 12.087 12.025 12.004 11.997 12.007 0.163 0.123 0.120 0.112 0.126 B 31752
+ 2166.87472 11.745 11.743 11.715 11.692 11.698 0.135 0.104 0.089 0.091 0.099 B 32014
+ 2168.82339 12.189 12.181 12.177 12.174 12.183 0.159 0.128 0.107 0.099 0.108 B 32346
+ 2171.81413 12.268 12.276 12.293 12.291 12.332 0.122 0.091 0.073 0.065 0.077 B 32680
+ 2172.87027 11.579 11.611 11.600 11.596 11.605 0.114 0.086 0.066 0.060 0.067 B 32889
+ 2183.80472 11.992 11.930 11.910 11.904 11.898 0.108 0.088 0.079 0.073 0.079 B 33962
+ 2184.80645 11.937 11.942 11.922 11.934 11.935 0.096 0.079 0.062 0.053 0.055 A 34153
+ 2185.82927 12.254 12.243 12.231 12.228 12.257 0.086 0.077 0.056 0.046 0.043 A 34351
+ 2189.82093 11.574 11.589 11.574 11.563 11.574 0.081 0.065 0.049 0.044 0.036 A 34838
+ 2190.83547 12.092 12.094 12.086 12.065 12.073 0.087 0.069 0.048 0.046 0.050 A 35026
+ 2192.76375 11.531 11.562 11.557 11.569 11.576 0.137 0.110 0.086 0.082 0.091 B 35346
+ 2193.87615 12.199 12.196 12.189 12.174 12.157 0.109 0.091 0.068 0.059 0.079 B 35574
+ 2195.76229 11.563 11.624 11.624 11.565 11.498 0.101 0.095 0.090 0.089 0.089 B 35882
+ 2197.77414 12.289 12.273 12.279 12.227 12.195 0.109 0.093 0.082 0.076 0.077 B 36196
+ 2199.75287 12.125 12.104 12.113 12.098 12.102 0.101 0.079 0.065 0.058 0.081 B 36547
+ 2201.75699 11.867 11.869 11.849 11.854 11.864 0.067 0.052 0.040 0.034 0.039 A 36796
+ 2202.88152 12.273 12.269 12.266 12.236 12.237 0.061 0.050 0.036 0.031 0.036 A 37015
+ 2208.73214 12.271 12.266 12.215 12.178 12.138 0.095 0.069 0.050 0.041 0.043 A 37720
+ 2213.75674 12.230 12.261 12.255 12.245 12.223 0.071 0.057 0.039 0.035 0.035 A 38140
+ 2214.76858 11.883 11.850 11.848 11.880 11.915 0.070 0.050 0.037 0.035 0.038 A 38294
+ 2215.81641 11.976 12.064 12.004 12.034 12.068 0.048 0.048 0.030 0.029 0.025 A 38483
+ 2217.81657 11.564 11.541 11.544 11.521 11.541 0.071 0.062 0.046 0.044 0.039 A 38817
+ 2222.77779 12.224 12.296 12.353 12.339 12.406 0.045 0.047 0.028 0.036 0.028 A 39246
+ 2224.75757 12.156 12.150 12.145 12.155 12.151 0.058 0.048 0.032 0.030 0.021 A 39401
+ 2225.79591 12.205 12.156 12.201 12.219 12.264 0.083 0.067 0.051 0.046 0.042 A 39579
+ 2226.76156 11.843 11.838 11.836 11.852 11.853 0.048 0.043 0.028 0.029 0.021 A 39717
+ 2227.79161 12.068 12.083 12.110 12.114 12.211 0.046 0.043 0.029 0.035 0.027 A 39883
+ 2228.75397 12.078 12.065 12.091 12.073 12.063 0.048 0.045 0.030 0.030 0.024 A 40032
+ 2229.77100 11.929 11.918 11.919 11.911 11.949 0.047 0.039 0.026 0.033 0.030 A 40202
+ 2232.74720 11.962 11.951 11.932 11.911 11.890 0.056 0.053 0.036 0.036 0.033 A 40523
+ 2233.75051 12.196 12.194 12.200 12.184 12.198 0.051 0.051 0.037 0.040 0.032 A 40681
+ 2234.75091 11.543 11.516 11.520 11.546 11.544 0.043 0.041 0.026 0.027 0.021 A 40839
+ 2237.74303 11.617 11.583 11.574 11.572 11.580 0.045 0.040 0.028 0.032 0.032 A 41310
+ 2239.71957 12.386 12.346 12.326 12.278 12.304 0.041 0.042 0.030 0.035 0.029 A 41459
+ 2242.71660 12.215 12.160 12.231 12.265 12.280 0.051 0.056 0.041 0.043 0.034 A 41936
+ 2243.71219 11.783 11.815 11.828 11.859 11.847 0.045 0.045 0.035 0.035 0.031 A 42090
+ 2244.74524 12.266 12.236 12.220 12.220 12.259 0.051 0.049 0.034 0.039 0.033 A 42225
+ 2247.71207 12.265 12.286 12.361 12.445 12.424 0.056 0.053 0.035 0.047 0.040 A 42365
+ 2249.71085 12.059 12.006 12.032 12.075 12.067 0.058 0.055 0.041 0.037 0.036 A 42727
+ 2250.70958 12.202 12.196 12.216 12.201 12.251 0.052 0.044 0.033 0.036 0.033 A 42887
+ 2251.70587 11.478 11.499 11.484 11.457 11.480 0.052 0.047 0.032 0.039 0.043 A 43047
+ 2252.70036 11.993 12.021 12.027 12.038 12.077 0.054 0.050 0.035 0.037 0.035 A 43207
+ 2253.69735 12.346 12.358 12.357 12.370 12.393 0.065 0.054 0.040 0.043 0.040 A 43367
+ 2254.69814 11.576 11.577 11.571 11.581 11.562 0.052 0.047 0.037 0.042 0.038 A 43496
+ 2256.69332 12.239 12.271 12.292 12.288 12.314 0.060 0.059 0.048 0.050 0.046 A 43812
+ 2257.69440 11.696 11.729 11.722 11.699 11.668 0.074 0.065 0.061 0.060 0.056 A 43974
+ 2258.69113 12.193 12.248 12.261 12.275 12.259 0.069 0.060 0.051 0.056 0.053 A 44133
+ 2260.68326 11.839 11.797 11.784 11.754 11.746 0.063 0.063 0.050 0.053 0.049 A 44259
+ 2261.68112 12.313 12.100 12.058 12.064 12.192 0.218 0.206 0.195 0.193 0.191 D 44419
+ 2262.68011 11.936 11.908 11.830 11.860 11.876 0.074 0.070 0.057 0.061 0.053 A 44563
+ 2263.67611 11.858 11.925 11.982 11.979 11.996 0.074 0.070 0.059 0.067 0.064 B 44724
+ 2269.67405 11.918 11.992 12.039 12.082 12.081 0.090 0.090 0.076 0.081 0.077 B 45255
+ 2270.68140 12.139 12.203 12.281 12.392 12.402 0.090 0.078 0.068 0.074 0.061 B 45423
+ 2271.66079 11.690 11.647 11.616 11.612 11.657 0.102 0.093 0.078 0.078 0.074 B 45575
+ 2486.93614 11.720 11.768 11.794 11.853 11.945 0.060 0.053 0.045 0.043 0.036 A 13455
+ 2497.89949 11.615 11.568 11.556 11.561 11.524 0.049 0.049 0.034 0.034 0.025 A 15340
+ 2499.89448 12.206 12.220 12.248 12.292 12.300 0.045 0.045 0.032 0.031 0.024 A 15760
+ 2502.88506 12.284 12.294 12.255 12.271 12.266 0.048 0.049 0.039 0.036 0.024 A 16331
+ 2519.87436 12.200 12.228 12.246 12.265 12.260 0.044 0.041 0.024 0.022 0.020 A 18101
+ 2521.86945 12.236 12.226 12.243 12.248 12.291 0.044 0.045 0.042 0.047 0.049 A 18497
+ 2539.79453 12.028 12.124 12.214 12.254 12.324 0.053 0.051 0.038 0.042 0.041 A 19588
+ 2545.77538 11.460 11.449 11.421 11.420 11.421 0.079 0.062 0.041 0.037 0.034 A 20232
+ 2550.89975 11.496 11.558 11.529 11.526 11.580 0.056 0.057 0.044 0.054 0.048 A 20888
+ 2552.82349 12.146 12.143 12.178 12.210 12.289 0.034 0.036 0.023 0.019 0.019 A 21224
+ 2554.80780 12.121 12.087 12.095 12.088 12.110 0.090 0.079 0.064 0.078 0.082 B 21582
+ 2557.76674 11.938 11.911 11.912 11.931 11.980 0.046 0.046 0.033 0.027 0.021 A 21925
+ 2559.78489 11.409 11.412 11.446 11.471 11.486 0.050 0.043 0.028 0.027 0.025 A 22292
+ 2561.78813 12.284 12.333 12.333 12.351 12.382 0.037 0.042 0.048 0.038 0.034 A 22620
+ 2563.77343 12.185 12.142 12.086 12.058 12.078 0.043 0.037 0.027 0.025 0.025 A 22973
+ 2565.78111 11.657 11.680 11.689 11.690 11.746 0.084 0.070 0.046 0.037 0.037 A 23334
+ 2578.75557 12.308 12.296 12.303 12.334 12.336 0.037 0.042 0.028 0.027 0.025 A 24997
+ 2623.68066 12.240 12.270 12.287 12.281 12.284 0.033 0.040 0.028 0.030 0.024 A 30150
+ 2625.66846 12.016 12.056 12.035 12.019 12.055 0.025 0.038 0.029 0.026 0.021 A 30427
+ 2628.66314 12.092 12.049 12.028 12.027 12.059 0.042 0.040 0.034 0.029 0.045 A 30732
+ 2643.61292 12.289 12.270 12.266 12.225 12.176 0.031 0.035 0.029 0.029 0.026 A 33410
+ 2647.63973 11.840 11.792 11.832 11.855 11.843 0.050 0.056 0.048 0.045 0.042 A 34015
+ 2650.61610 11.780 11.826 11.828 11.843 11.877 0.023 0.033 0.024 0.021 0.018 A 34271
+ 2791.46624 29.999 29.999 29.999 29.999 29.999 0.036 0.040 0.031 0.030 0.028 C 57479
+ 2833.94017 11.498 11.467 11.455 11.431 11.437 0.031 0.037 0.023 0.027 0.020 A 63241
+ 2854.91533 12.037 12.074 12.097 12.109 12.111 0.029 0.033 0.020 0.018 0.017 A 66000
+ 2858.93523 12.063 12.086 12.079 12.078 12.092 0.056 0.049 0.028 0.025 0.029 A 66449
+ 2861.90381 11.886 11.869 11.830 11.812 11.863 0.051 0.048 0.032 0.034 0.026 A 67075
+ 2867.90422 11.534 11.573 11.568 11.549 11.538 0.028 0.033 0.022 0.018 0.021 A 67876
+ 2884.84367 11.476 11.491 11.499 11.489 11.486 0.051 0.038 0.029 0.030 0.028 A 69905
+ 2912.83227 11.521 11.494 11.497 11.498 11.497 0.057 0.094 0.143 0.185 0.172 D 74182
+ 2918.85133 29.999 29.999 29.999 29.999 29.999 0.027 0.029 0.020 0.020 0.026 C 74978
+ 2922.75481 11.971 12.008 11.965 11.921 11.902 0.054 0.049 0.033 0.030 0.031 A 75320
+ 2924.81955 11.936 11.890 11.903 11.902 11.931 0.026 0.040 0.032 0.029 0.027 A 75705
+ 2927.77821 11.792 11.797 11.824 11.858 11.894 0.025 0.036 0.026 0.025 0.021 A 76064
+ 2932.81057 11.620 11.675 11.687 11.701 11.707 0.027 0.035 0.028 0.029 0.023 A 76969
+ 2950.73938 12.028 12.000 12.014 12.051 12.070 0.024 0.029 0.020 0.017 0.016 A 79486
+ 3355.66556 12.266 12.224 12.217 12.205 12.218 0.064 0.039 0.025 0.026 0.028 A 124372
+ 3383.73278 12.201 12.161 12.111 12.074 12.066 0.050 0.034 0.027 0.027 0.029 A 125790
+ 3385.81553 12.202 12.236 12.199 12.173 12.162 0.062 0.052 0.043 0.040 0.040 A 126096
+ 3388.57308 12.118 12.184 12.163 12.156 12.167 0.040 0.034 0.022 0.020 0.021 A 126425
+ 3390.62417 11.751 11.773 11.771 11.757 11.729 0.074 0.058 0.046 0.044 0.044 A 126717
+ 3392.71059 11.561 11.553 11.580 11.623 11.617 0.142 0.138 0.133 0.133 0.138 B 126964
+ 3395.70661 11.636 11.655 11.643 11.617 11.596 0.050 0.034 0.025 0.027 0.025 A 127282
+ 3397.75916 11.957 11.943 11.957 11.984 12.018 0.033 0.030 0.019 0.017 0.017 A 127544
+ 3399.82135 12.344 12.347 12.364 12.356 12.447 0.053 0.045 0.032 0.030 0.029 A 127825
+ 3405.55568 12.236 12.154 12.166 12.183 12.226 0.074 0.052 0.034 0.026 0.025 A 128533
+ 3409.58916 11.709 11.663 11.627 11.604 11.643 0.093 0.049 0.031 0.032 0.032 A 129170
+ 3411.63904 12.255 12.273 12.262 12.246 12.257 0.033 0.031 0.022 0.023 0.026 A 129482
+ 3413.68632 12.204 12.202 12.171 12.146 12.150 0.048 0.041 0.025 0.025 0.021 A 129798
+ 3415.69961 11.873 11.931 11.941 11.957 11.953 0.055 0.034 0.023 0.025 0.027 A 130130
+ 3417.68838 11.795 11.759 11.739 11.752 11.820 0.085 0.043 0.037 0.038 0.042 A 130438
+ 3419.67456 12.149 12.187 12.212 12.245 12.261 0.060 0.041 0.027 0.025 0.022 A 130751
+ 3421.69994 12.063 12.049 12.055 12.081 12.159 0.059 0.045 0.033 0.031 0.030 A 131067
+ 3423.67859 11.573 11.542 11.527 11.555 11.585 0.055 0.050 0.042 0.042 0.041 A 131391
+ 3425.70558 12.238 12.231 12.233 12.262 12.329 0.043 0.038 0.033 0.029 0.032 A 131700
+ 3427.73488 12.117 12.090 12.050 12.039 12.051 0.043 0.032 0.021 0.028 0.032 A 132027
+ 3431.68520 11.751 11.710 11.679 11.653 11.661 0.076 0.046 0.036 0.033 0.033 A 132377
+ 3433.70749 12.244 12.263 12.233 12.234 12.311 0.058 0.043 0.033 0.032 0.031 A 132708
+ 3436.70589 12.268 12.298 12.284 12.324 12.363 0.030 0.029 0.019 0.017 0.015 A 133011
+ 3439.68704 12.283 12.252 12.226 12.230 12.238 0.051 0.038 0.027 0.029 0.022 A 133346
+ 3443.52147 11.425 11.472 11.455 11.453 11.455 0.187 0.087 0.039 0.032 0.028 B 133704
+ 3445.55342 12.346 12.368 12.344 12.332 12.369 0.047 0.036 0.025 0.025 0.026 A 134071
+ 3447.56741 12.173 12.142 12.132 12.146 12.165 0.060 0.056 0.031 0.027 0.031 A 134713
+ 3449.59086 11.771 11.768 11.762 11.752 11.758 0.054 0.046 0.035 0.033 0.042 A 135050
+ 3453.65537 12.353 12.406 12.469 12.542 12.620 0.060 0.049 0.033 0.033 0.031 A 135652
+ 3455.64577 12.134 12.083 12.098 12.104 12.083 0.037 0.034 0.024 0.019 0.016 A 136008
+ 3457.65380 11.648 11.661 11.649 11.630 11.617 0.054 0.040 0.025 0.031 0.032 A 136363
+ 3459.64813 12.172 12.184 12.160 12.129 12.125 0.038 0.040 0.028 0.026 0.026 A 136719
+ 3462.52786 12.310 12.303 12.291 12.253 12.199 0.036 0.032 0.021 0.021 0.025 A 137131
+ 3464.59793 12.202 12.253 12.256 12.243 12.258 0.051 0.047 0.031 0.027 0.023 A 137478
+ 3466.61028 11.951 11.962 11.944 11.940 11.951 0.043 0.038 0.025 0.022 0.026 A 137820
+ 3469.60725 12.076 12.062 12.088 12.137 12.178 0.052 0.036 0.026 0.023 0.023 A 138239
+ 3471.61883 11.629 11.611 11.624 11.641 11.663 0.045 0.032 0.022 0.020 0.021 A 138567
+ 3473.61660 12.311 12.371 12.336 12.341 12.401 0.038 0.034 0.020 0.018 0.018 A 138871
+ 3476.53680 12.289 12.352 12.340 12.347 12.333 0.057 0.049 0.035 0.030 0.023 A 139342
+ 3478.56072 12.115 12.140 12.147 12.128 12.169 0.046 0.034 0.026 0.024 0.026 A 139695
+ 3480.58299 11.933 11.942 11.936 11.929 11.938 0.049 0.037 0.028 0.027 0.034 A 139984
+ 3483.52115 11.844 11.836 11.797 11.760 11.751 0.056 0.044 0.038 0.040 0.047 A 140456
+ 3489.53477 12.072 12.096 12.064 12.051 12.074 0.055 0.038 0.026 0.028 0.030 A 140916
+ 3491.55049 11.646 11.684 11.663 11.647 11.650 0.059 0.041 0.025 0.028 0.035 A 141280
+ 3495.54958 12.229 12.193 12.253 12.320 12.320 0.060 0.038 0.024 0.027 0.030 A 141607
+ 3499.52170 11.563 11.560 11.555 11.574 11.610 0.040 0.033 0.024 0.028 0.030 A 142080
+ 3501.52949 12.409 12.358 12.341 12.328 12.336 0.040 0.032 0.024 0.022 0.028 A 142416
+ 3503.53872 12.117 12.094 12.092 12.092 12.101 0.053 0.038 0.028 0.031 0.034 A 142775
+ 3509.49629 12.209 12.261 12.246 12.257 12.260 0.045 0.041 0.028 0.030 0.040 A 143378
+ 3513.47035 12.083 12.091 12.091 12.113 12.157 0.040 0.034 0.019 0.016 0.021 A 143969
+ 3517.47131 11.955 11.978 12.010 12.041 12.080 0.054 0.041 0.028 0.022 0.019 A 144283
+ 3521.47163 12.160 12.202 12.239 12.293 12.312 0.108 0.079 0.073 0.070 0.070 B 144785
+ 3526.45950 12.165 12.151 12.147 12.134 12.136 0.036 0.029 0.022 0.022 0.024 A 145618
+ 3529.46034 12.156 12.152 12.180 12.200 12.197 0.117 0.071 0.057 0.063 0.058 B 146134
+ 3563.94176 11.939 12.029 12.020 11.986 11.962 0.053 0.044 0.029 0.031 0.032 A 150188
+ 3575.94017 12.362 12.351 12.393 12.443 12.465 0.042 0.039 0.025 0.021 0.022 A 151576
+ 3590.92807 11.543 11.534 11.544 11.555 11.566 0.068 0.044 0.030 0.029 0.028 A 154110
+ 3601.91507 12.179 12.195 12.119 12.045 11.991 0.053 0.038 0.026 0.025 0.025 A 155649
+ 3619.85543 11.854 11.863 11.847 11.842 11.857 0.054 0.039 0.027 0.025 0.026 A 157502
+ 3622.89026 11.952 11.948 11.905 11.892 11.938 0.041 0.031 0.020 0.019 0.019 A 157990
+ 3626.87071 12.243 12.259 12.268 12.253 12.228 0.039 0.036 0.023 0.019 0.018 A 158395
+ 3630.84560 11.621 11.616 11.585 11.581 11.609 0.044 0.035 0.022 0.020 0.018 A 158859
+ 3634.85695 12.219 12.176 12.176 12.181 12.179 0.052 0.036 0.022 0.021 0.023 A 159451
+ 3638.88014 11.485 11.431 11.444 11.434 11.455 0.054 0.043 0.027 0.022 0.021 A 159860
+ 3641.87009 11.579 11.593 11.606 11.607 11.618 0.045 0.038 0.024 0.020 0.019 A 160253
+ 3646.87581 12.263 12.276 12.296 12.311 12.362 0.047 0.042 0.026 0.020 0.017 A 160838
+ 3650.80710 11.743 11.772 11.763 11.761 11.781 0.046 0.035 0.023 0.020 0.020 A 161370
+ 3653.83942 11.924 11.954 11.942 11.924 11.943 0.057 0.036 0.028 0.028 0.032 A 161809
+ 3659.82737 12.112 12.060 12.072 12.092 12.096 0.045 0.036 0.022 0.019 0.019 A 162693
+ 3662.86826 12.290 12.290 12.299 12.297 12.343 0.035 0.030 0.021 0.019 0.019 A 163145
+ 3665.83156 12.206 12.259 12.233 12.237 12.239 0.071 0.036 0.026 0.023 0.025 A 163569
+ 3669.81570 11.375 11.431 11.402 11.400 11.392 0.038 0.036 0.021 0.017 0.016 A 164034
+ 3672.80299 11.452 11.463 11.446 11.452 11.470 0.043 0.033 0.020 0.016 0.015 A 164455
+ 3675.79020 11.447 11.530 11.513 11.499 11.496 0.052 0.037 0.023 0.019 0.018 A 164881
+ 3680.80439 12.140 12.184 12.157 12.138 12.124 0.042 0.033 0.021 0.019 0.016 A 165405
+ 3703.73848 11.424 11.451 11.424 11.404 11.412 0.048 0.037 0.025 0.023 0.024 A 168463
+ 3706.71442 11.424 11.413 11.422 11.412 11.414 0.054 0.044 0.036 0.031 0.032 A 168867
+ 3711.75652 12.098 12.165 12.126 12.113 12.141 0.036 0.032 0.021 0.017 0.018 A 169304
+ 3713.73421 12.216 12.220 12.212 12.200 12.212 0.069 0.050 0.033 0.028 0.033 A 169582
+ 3716.68366 12.159 12.162 12.134 12.118 12.118 0.045 0.036 0.026 0.023 0.022 A 169961
+ 3718.74890 12.012 12.002 12.002 12.018 12.029 0.043 0.034 0.026 0.024 0.026 A 170238
+ 3721.65317 11.951 12.030 12.002 12.034 12.072 0.048 0.034 0.024 0.023 0.025 A 170575
+ 3724.69621 12.164 12.189 12.161 12.122 12.092 0.061 0.040 0.031 0.030 0.032 A 170894
+ 3726.78853 12.129 12.076 12.068 12.091 12.131 0.035 0.031 0.023 0.021 0.026 A 171186
+ 3730.65594 12.257 12.314 12.362 12.422 12.508 0.088 0.056 0.038 0.033 0.036 A 171557
+ 3733.69445 12.348 12.306 12.306 12.294 12.271 0.044 0.033 0.020 0.019 0.021 A 171955
+ 3736.68239 12.365 12.385 12.391 12.382 12.357 0.065 0.041 0.027 0.021 0.025 A 172366
+ 3743.77011 12.005 12.032 99.999 99.999 99.999 0.043 0.034 0.027 0.025 0.029 C 173324
+ 3746.66830 11.851 11.804 11.830 11.847 11.866 0.049 0.037 0.026 0.025 0.023 A 173685
+ 3748.76207 11.488 11.521 11.494 11.500 11.490 0.041 0.035 0.025 0.025 0.027 A 173996
+ 3751.65014 11.612 11.539 11.492 11.474 11.440 0.040 0.032 0.026 0.023 0.023 A 174382
+ 3753.73287 12.334 12.278 12.272 12.264 12.322 0.041 0.029 0.024 0.026 0.026 A 174681
+ 3755.78342 12.253 12.230 12.187 12.155 12.161 0.044 0.029 0.021 0.020 0.020 A 174969
+ 3758.61925 12.121 12.148 12.099 12.079 12.069 0.049 0.035 0.025 0.025 0.027 A 175336
+ 3760.68145 11.847 11.842 11.828 11.807 11.822 0.050 0.035 0.024 0.023 0.029 A 175636
+ 3762.77733 11.547 11.578 11.584 11.607 11.611 0.068 0.048 0.035 0.030 0.033 A 175919
+ 3765.61437 11.610 11.566 11.580 11.593 11.626 0.048 0.040 0.025 0.027 0.028 A 176287
+ 3767.70678 12.239 12.171 12.166 12.190 12.194 0.056 0.038 0.029 0.028 0.030 A 176593
+ 3770.57931 12.420 12.431 12.393 12.312 12.300 0.056 0.048 0.036 0.036 0.042 A 176952
+ 3772.65724 12.179 12.147 12.129 12.111 12.132 0.080 0.065 0.039 0.032 0.027 A 177219
+ 3774.72909 11.996 12.019 12.050 12.099 12.161 0.057 0.041 0.026 0.025 0.028 A 177536
+ 3776.75798 11.586 11.547 11.547 11.567 11.589 0.060 0.041 0.030 0.028 0.030 A 177834
+ 3779.57896 12.098 12.141 12.138 12.191 12.240 0.053 0.043 0.031 0.025 0.023 A 178232
+ 3787.54467 12.317 12.348 12.303 12.287 12.271 0.070 0.049 0.032 0.029 0.031 A 178808
+ 3789.60651 12.222 12.236 12.214 12.210 12.249 0.051 0.049 0.038 0.031 0.034 A 179102
+ 3791.64549 11.882 11.912 11.903 11.888 11.893 0.042 0.035 0.026 0.027 0.029 A 179404
+ 3793.68757 11.471 11.463 11.470 11.453 11.475 0.064 0.045 0.028 0.025 0.023 A 179709
+ 3796.57013 11.686 11.715 11.654 11.648 11.657 0.062 0.036 0.027 0.024 0.028 A 180097
+ 3798.61888 12.356 12.353 12.340 12.367 12.409 0.058 0.051 0.037 0.036 0.035 A 180393
+ 3800.61921 12.113 12.105 12.107 12.083 12.067 0.045 0.037 0.026 0.027 0.023 A 180666
+ 3803.59959 12.098 12.065 12.047 12.003 12.009 0.049 0.032 0.022 0.020 0.021 A 181014
+ 3805.62068 11.805 11.754 11.790 11.850 11.889 0.071 0.042 0.029 0.031 0.039 A 181310
+ 3808.63793 11.921 11.902 11.852 11.839 11.840 0.044 0.032 0.026 0.028 0.025 A 181660
+ 3810.64216 11.403 11.469 11.467 11.475 11.483 0.042 0.033 0.021 0.020 0.020 A 181983
+ 3812.64848 12.259 12.235 12.256 12.275 12.351 0.043 0.036 0.027 0.022 0.028 A 182306
+ 3814.64451 12.028 12.118 12.154 12.166 12.148 0.035 0.029 0.022 0.026 0.028 A 182620
+ 3816.67806 11.834 11.815 11.824 11.829 11.851 0.045 0.035 0.027 0.023 0.028 A 182946
+ 3819.53628 11.565 11.542 11.526 11.507 11.493 0.106 0.088 0.061 0.053 0.042 A 183382
+ 3821.59140 12.091 12.115 12.127 12.153 12.186 0.054 0.034 0.026 0.025 0.028 A 183723
+ 3825.63531 12.111 12.079 12.062 12.080 99.999 0.041 0.033 0.025 0.024 0.025 C 184400
+ 3828.51362 11.888 11.812 11.807 11.794 11.838 0.043 0.036 0.028 0.023 0.022 A 184868
+ 3830.57786 11.572 11.588 11.577 11.565 11.590 0.038 0.030 0.022 0.021 0.024 A 185223
+ 3832.58896 12.268 12.273 12.274 12.285 12.304 0.075 0.045 0.027 0.026 0.031 A 185582
+ 3834.58705 12.161 12.150 12.144 12.144 12.131 0.060 0.049 0.029 0.022 0.025 A 185926
+ 3836.60431 11.869 11.844 11.878 11.916 11.971 0.032 0.032 0.020 0.020 0.021 A 186273
+ 3847.54905 11.585 11.600 11.618 11.642 11.700 0.049 0.043 0.027 0.024 0.024 A 186737
+ 3850.50471 11.608 11.606 11.582 11.556 11.564 0.039 0.039 0.028 0.028 0.029 A 187214
+ 3852.51874 12.312 12.298 12.290 12.300 12.332 0.048 0.033 0.023 0.022 0.028 A 187565
+ 3854.52700 12.280 12.271 12.276 12.322 12.396 0.041 0.033 0.029 0.026 0.026 A 187933
+ 3857.53993 29.999 29.999 29.999 29.999 29.999 0.096 0.094 0.092 0.093 0.093 C 188338
+ 3860.49717 99.999 99.999 99.999 99.999 99.999 0.054 0.035 0.023 0.024 0.028 C 188787
+ 3862.50063 12.168 12.124 12.130 12.149 12.192 0.044 0.032 0.025 0.024 0.025 A 189153
+ 3864.52916 11.600 11.602 11.600 11.595 11.589 0.047 0.036 0.030 0.027 0.030 A 189498
+ 3867.51818 11.655 11.667 11.662 11.634 11.620 0.051 0.035 0.027 0.031 0.030 A 189985
+ 3869.53528 11.713 11.712 11.679 11.670 11.668 0.060 0.043 0.027 0.029 0.030 A 190334
+ 3872.48266 11.799 11.856 11.875 11.875 11.872 0.030 0.027 0.020 0.019 0.024 A 190876
+ 3876.48446 12.041 12.028 12.016 12.002 12.017 0.034 0.030 0.021 0.020 0.025 A 191289
+ 3880.47469 12.318 12.354 12.362 12.370 12.372 0.039 0.039 0.031 0.050 0.051 A 191754
+ 3883.46548 12.327 12.339 12.352 12.389 12.380 0.043 0.041 0.028 0.030 0.036 A 192203
+ 3887.46930 11.941 11.888 11.877 11.861 11.905 0.070 0.047 0.037 0.036 0.036 A 192600
+ 3890.47756 11.962 11.952 11.945 11.957 11.983 0.040 0.032 0.022 0.022 0.024 A 193123
+ 3893.46626 12.138 12.144 12.152 12.145 12.158 0.064 0.045 0.034 0.035 0.039 A 193657
+ 3898.45252 11.746 11.739 11.681 11.634 11.625 0.063 0.039 0.026 0.032 0.033 A 194296
+ 4090.68519 11.783 11.741 11.743 11.747 11.785 0.092 0.075 0.057 0.049 0.041 A 209268
+ 4103.71453 12.264 12.291 12.287 12.304 12.346 0.060 0.036 0.023 0.022 0.020 A 210618
+ 4105.80064 12.241 12.157 12.135 12.131 12.147 0.072 0.037 0.026 0.024 0.022 A 210876
+ 4126.61396 12.324 12.333 12.332 12.313 12.280 0.054 0.039 0.022 0.018 0.019 A 211656
+ 4128.62795 12.131 12.145 12.125 12.079 12.117 0.060 0.053 0.034 0.026 0.022 A 211928
+ 4130.64627 11.608 11.586 11.603 11.602 11.599 0.073 0.049 0.036 0.031 0.029 A 212193
+ 4132.64028 12.324 12.324 99.999 99.999 99.999 0.092 0.060 0.040 0.035 0.031 C 212446
+ 4134.66152 12.265 12.127 11.989 11.884 11.845 0.111 0.064 0.049 0.044 0.040 A 212736
+ 4136.68160 12.038 11.991 11.953 11.925 11.936 0.059 0.039 0.029 0.024 0.023 A 212997
+ 4140.67741 12.318 12.289 12.267 12.253 12.204 0.077 0.051 0.033 0.024 0.023 A 213593
+ 4142.70520 12.141 12.173 12.146 12.155 12.181 0.110 0.067 0.044 0.037 0.033 A 213873
+ 4144.73037 11.796 11.861 11.857 11.865 11.889 0.106 0.100 0.088 0.032 0.028 B 214170
+ 4147.59894 11.630 11.630 11.622 11.625 11.643 0.061 0.048 0.030 0.024 0.021 A 214551
+ 4150.67098 11.897 11.873 11.865 11.842 11.841 0.046 0.032 0.023 0.021 0.020 A 214825
+ 4152.68479 11.426 11.471 11.474 11.472 11.471 0.039 0.028 0.019 0.018 0.015 A 215136
+ 4154.70030 12.319 12.324 12.318 12.323 12.331 0.052 0.048 0.024 0.019 0.017 A 215437
+ 4156.69985 12.145 12.146 12.107 12.088 12.072 0.073 0.061 0.043 0.037 0.032 A 215734
+ 4158.73003 11.806 11.778 11.739 11.711 11.722 0.062 0.051 0.037 0.031 0.028 A 216022
+ 4160.70961 12.024 12.024 12.048 12.072 12.097 0.093 0.058 0.043 0.042 0.041 A 216328
+ 4162.71817 12.312 12.358 12.321 12.253 12.234 0.069 0.038 0.028 0.026 0.025 A 216654
+ 4165.58384 12.349 12.323 12.259 12.181 12.160 0.120 0.075 0.045 0.040 0.044 B 217023
+ 4168.61744 12.307 12.290 12.284 12.309 12.323 0.062 0.053 0.036 0.033 0.033 A 217450
+ 4173.59501 12.086 12.046 12.070 12.101 12.124 0.064 0.044 0.030 0.027 0.025 A 218058
+ 4175.59818 11.586 11.589 11.639 11.672 11.666 0.073 0.052 0.036 0.030 0.028 A 218368
+ 4181.56976 11.904 11.955 11.930 11.941 11.973 0.039 0.034 0.021 0.018 0.017 A 219088
+ 4183.57753 11.780 11.780 11.791 11.817 11.834 0.085 0.057 0.039 0.029 0.029 A 219387
+ 4185.57865 12.167 12.214 12.184 12.179 12.200 0.072 0.059 0.042 0.032 0.028 A 219673
+ 4189.57989 11.487 11.498 11.474 11.465 11.482 0.034 0.035 0.021 0.017 0.015 A 220076
+ 4191.58873 12.241 12.220 12.192 12.176 12.200 0.046 0.040 0.033 0.031 0.029 A 220392
+ 4193.59473 12.121 12.212 12.184 12.192 12.270 0.063 0.047 0.032 0.029 0.024 A 220719
+ 4196.61055 12.279 12.240 12.220 12.202 12.281 0.043 0.042 0.027 0.022 0.020 A 221038
+ 4199.58233 12.340 12.321 12.307 12.251 12.225 0.074 0.061 0.043 0.040 0.038 A 221367
+ 4202.54726 12.249 12.188 12.210 12.215 12.231 0.081 0.076 0.066 0.064 0.064 B 221618
+ 4205.52129 12.333 12.336 12.260 12.262 12.285 0.067 0.045 0.037 0.038 0.039 A 222071
+ 4213.54301 12.276 12.283 12.260 12.259 12.302 0.090 0.049 0.034 0.030 0.030 A 222552
+ 4227.47784 12.162 12.187 12.158 12.154 12.161 0.049 0.043 0.027 0.023 0.022 A 223101
+ 4229.50427 11.789 11.884 11.879 11.857 11.860 0.054 0.043 0.027 0.020 0.019 A 223468
+ 4231.50866 11.658 11.628 11.618 11.637 11.669 0.069 0.051 0.029 0.022 0.020 A 223828
+ 4233.51637 12.325 12.281 12.290 12.280 12.293 0.038 0.037 0.024 0.021 0.019 A 224176
+ 4235.51932 12.031 12.024 12.012 12.002 12.012 0.051 0.039 0.028 0.023 0.022 A 224545
+ 4246.48341 11.853 11.854 11.870 11.881 11.891 0.036 0.033 0.022 0.018 0.016 A 226166
+ 4253.47811 12.316 12.315 12.330 12.389 12.468 0.050 0.045 0.030 0.024 0.023 A 226791
+ 4258.45439 12.231 12.263 12.270 12.275 12.253 0.043 0.035 0.021 0.017 0.016 A 227456
+ 4399.87032 12.023 11.989 11.974 11.949 11.924 0.039 0.036 0.024 0.020 0.018 A 244910
+ 4418.81796 11.422 11.375 11.410 11.416 11.424 0.044 0.035 0.022 0.017 0.016 A 246361
+ 4421.78968 11.501 11.444 11.472 11.502 11.535 0.054 0.038 0.024 0.019 0.017 A 246592
+ 4424.83746 11.766 11.780 11.721 11.694 11.689 0.043 0.037 0.025 0.020 0.017 A 246847
+ 4427.82010 11.839 11.841 11.837 11.822 11.777 0.038 0.033 0.020 0.018 0.016 A 247115
+ 4432.78325 11.445 11.450 11.463 11.462 11.462 0.043 0.034 0.021 0.017 0.015 A 247716
+ 4435.71511 11.709 11.727 11.741 11.757 11.783 0.054 0.038 0.023 0.019 0.017 A 248056
+ 4440.79901 12.193 12.333 12.376 12.389 12.386 0.040 0.034 0.021 0.018 0.017 A 248715
+ 4443.74865 12.350 12.416 12.384 12.356 12.346 0.285 0.063 0.055 0.040 0.040 D 249014
+ 4456.72990 12.226 12.188 12.179 12.190 12.231 0.044 0.033 0.023 0.020 0.018 A 250480
+ 4459.64788 12.039 12.081 12.045 12.016 12.040 0.054 0.046 0.031 0.025 0.020 A 250812
+ 4461.73693 11.869 11.871 11.861 11.865 11.906 0.043 0.034 0.023 0.019 0.017 A 251068
+ 4464.63670 11.744 11.786 11.747 11.738 11.749 0.043 0.036 0.024 0.021 0.019 A 251414
+ 4466.73668 11.407 11.411 11.445 11.469 11.485 0.072 0.060 0.030 0.028 0.026 A 251676
+ 4469.65767 11.488 11.427 11.431 11.431 11.471 0.041 0.035 0.020 0.018 0.015 A 251987
+ 4472.73489 11.617 11.605 11.583 11.586 11.611 0.075 0.058 0.040 0.026 0.024 A 252259
+ 4475.62870 11.600 11.572 11.576 11.591 11.609 0.053 0.036 0.024 0.022 0.020 A 252590
+ 4478.63819 11.768 11.699 11.704 11.697 11.655 0.042 0.042 0.028 0.020 0.017 A 252878
+ 4480.74830 11.470 11.463 11.587 11.795 11.838 0.081 0.060 0.051 0.049 0.048 A 253170
+ 4484.63700 11.933 11.922 11.914 11.906 11.875 0.042 0.036 0.023 0.022 0.020 A 253477
+ 4486.69874 11.562 11.513 11.486 11.452 11.430 0.048 0.035 0.024 0.020 0.018 A 253729
+ 4488.74372 12.335 12.340 12.377 12.417 12.366 0.036 0.035 0.023 0.019 0.017 A 253978
+ 4491.58775 12.410 12.407 12.399 12.367 12.381 0.050 0.038 0.029 0.027 0.030 A 254260
+ 4493.64331 12.195 12.168 12.157 12.155 12.178 0.055 0.044 0.028 0.022 0.020 A 254526
+ 4499.63398 12.291 12.243 12.247 12.244 12.254 0.064 0.038 0.026 0.023 0.023 A 255026
+ 4501.73982 12.244 12.201 12.207 12.248 12.242 0.050 0.035 0.022 0.020 0.019 A 255316
+ 4504.63599 12.111 12.171 12.118 12.111 12.182 0.052 0.041 0.024 0.021 0.018 A 255702
+ 4506.71835 11.906 11.890 11.896 11.886 11.883 0.093 0.043 0.028 0.025 0.023 A 256019
+ 4509.59579 11.632 11.684 11.640 11.616 11.581 0.057 0.042 0.029 0.025 0.024 A 256409
+ 4511.61781 12.177 12.209 12.151 12.137 12.164 0.050 0.040 0.026 0.022 0.021 A 256678
+ 4516.70262 12.228 12.264 12.233 12.154 12.012 0.039 0.035 0.024 0.022 0.020 A 257143
+ 4518.75051 12.235 12.168 12.144 12.081 12.021 0.052 0.039 0.024 0.021 0.019 A 257450
+ 4521.56991 12.058 12.063 12.082 12.064 12.048 0.052 0.043 0.030 0.025 0.029 A 257820
+ 4523.58936 11.542 11.573 11.494 11.428 11.410 0.043 0.037 0.025 0.022 0.019 A 258136
+ 4525.61929 12.325 12.299 12.305 12.332 12.413 0.043 0.036 0.025 0.021 0.018 A 258430
+ 4527.63927 12.347 12.392 12.390 12.388 12.448 0.080 0.060 0.049 0.046 0.046 A 258734
+ 4529.69558 12.136 12.147 12.146 12.135 12.089 0.054 0.039 0.025 0.023 0.021 A 259056
+ 4532.61120 12.046 12.006 11.971 11.948 11.951 0.040 0.033 0.021 0.018 0.017 A 259478
+ 4535.69589 12.241 12.157 12.195 12.262 12.369 0.035 0.037 0.026 0.022 0.020 A 259790
+ 4538.56183 12.187 12.165 12.159 12.145 12.161 0.066 0.053 0.034 0.027 0.021 A 260201
+ 4540.57783 11.772 11.743 11.704 11.667 11.668 0.048 0.042 0.030 0.024 0.022 A 260489
+ 4542.59154 12.055 12.021 12.040 12.043 12.065 0.039 0.037 0.024 0.020 0.018 A 260812
+ 4546.61683 11.957 11.976 11.979 11.980 11.986 0.045 0.035 0.025 0.022 0.023 A 261430
+ 4548.61192 11.514 11.481 11.484 11.490 11.539 0.052 0.044 0.030 0.023 0.022 A 261766
+ 4551.59732 11.597 11.584 11.600 11.587 11.576 0.052 0.037 0.025 0.023 0.019 A 262084
+ 4555.62848 12.277 12.274 12.282 12.318 12.382 0.037 0.036 0.021 0.018 0.015 A 262698
+ 4557.63476 11.882 11.870 11.866 11.850 11.787 0.047 0.039 0.026 0.022 0.020 A 263026
+ 4560.54288 11.852 11.855 11.838 11.815 11.803 0.039 0.033 0.024 0.020 0.018 A 263492
+ 4562.56750 11.439 11.431 11.438 11.447 11.453 0.050 0.044 0.032 0.025 0.021 A 263840
+ 4564.61928 12.281 12.315 12.292 12.278 12.275 0.036 0.035 0.025 0.022 0.019 A 264190
+ 4566.62958 12.225 12.229 12.253 12.261 12.208 0.049 0.037 0.025 0.022 0.022 A 264527
+ 4569.51655 11.912 11.937 11.948 11.948 11.935 0.062 0.058 0.052 0.051 0.049 A 264960
+ 4571.54034 11.680 11.696 11.673 11.633 11.618 0.039 0.035 0.023 0.019 0.018 A 265304
+ 4573.57646 11.736 11.727 11.713 11.729 11.761 0.046 0.037 0.028 0.023 0.022 A 265663
+ 4576.50220 12.094 12.148 12.168 12.163 12.148 0.050 0.041 0.029 0.023 0.021 A 266107
+ 4580.50388 12.011 12.043 12.040 12.036 12.057 0.073 0.055 0.034 0.029 0.030 A 266516
+ 4583.54730 12.137 12.147 12.132 12.051 12.001 0.060 0.058 0.052 0.050 0.049 A 266754
+ 4587.56721 12.136 12.104 12.109 12.152 12.250 0.040 0.036 0.027 0.024 0.021 A 267231
+ 4590.48048 12.533 12.486 12.455 12.425 12.434 0.040 0.033 0.023 0.020 0.017 A 267729
+ 4592.54276 12.322 12.330 12.360 12.384 12.384 0.037 0.031 0.021 0.019 0.018 A 268098
+ 4595.48459 12.210 12.282 12.274 12.317 12.409 0.039 0.034 0.023 0.019 0.016 A 268618
+ 4597.49760 12.012 11.995 11.942 11.880 11.836 0.036 0.038 0.024 0.022 0.020 A 268981
+ 4600.50947 12.156 12.097 12.082 12.054 12.100 0.046 0.035 0.026 0.022 0.019 A 269344
+ 4603.51415 12.203 12.261 12.270 12.208 12.141 0.073 0.069 0.048 0.031 0.030 A 269845
+ 4608.46027 11.818 11.817 11.797 11.782 11.771 0.064 0.046 0.029 0.024 0.021 A 270264
+ 4616.47972 11.638 11.618 11.599 11.582 11.580 0.043 0.042 0.027 0.024 0.021 A 271121
+ 4622.45582 11.885 11.860 11.868 11.902 11.956 0.050 0.041 0.030 0.026 0.024 A 271818
+ 4693.91028 11.755 11.712 11.718 11.715 11.759 0.060 0.053 0.041 0.036 0.036 A 282101
+ 4717.85877 12.601 12.685 12.690 12.671 12.647 0.073 0.066 0.056 0.054 0.053 A 284956
+ 4744.82686 11.876 11.858 11.840 11.831 11.828 0.058 0.042 0.029 0.026 0.025 A 288026
+ 4766.84006 11.543 11.544 11.582 11.591 11.624 0.057 0.039 0.024 0.020 0.017 A 290939
+ 4772.79284 11.678 11.706 11.698 11.692 11.717 0.037 0.031 0.021 0.017 0.016 A 291764
+ 4815.67400 11.986 11.973 11.981 11.984 11.992 0.041 0.035 0.025 0.024 0.021 A 296813
+ 4818.72672 12.059 12.091 12.051 12.002 11.970 0.057 0.039 0.026 0.022 0.020 A 297119
+ 4821.65918 12.095 12.083 12.019 11.979 12.003 0.045 0.033 0.024 0.022 0.020 A 297485
+ 4823.77994 12.048 12.025 11.988 11.956 11.967 0.034 0.029 0.020 0.019 0.017 A 297790
+ 4826.72946 11.984 12.022 12.014 12.010 12.015 0.048 0.039 0.025 0.021 0.018 A 298139
+ 4829.66785 11.988 11.960 11.957 11.964 12.033 0.040 0.033 0.021 0.018 0.016 A 298524
+ 4832.64870 12.155 12.170 12.213 12.244 12.206 0.074 0.065 0.062 0.063 0.063 B 298881
+ 4834.78830 11.923 11.883 11.902 11.902 11.899 0.091 0.061 0.046 0.041 0.039 A 299191
+ 4837.63600 11.648 11.677 11.634 11.608 11.635 0.054 0.038 0.026 0.022 0.021 A 299512
+ 4839.70252 11.630 11.626 11.668 11.713 11.793 0.064 0.046 0.034 0.030 0.027 A 299801
+ 4844.68809 12.240 12.212 12.212 12.273 12.326 0.062 0.047 0.031 0.025 0.021 A 300351
+ 4847.66337 12.229 12.319 12.320 12.317 12.299 0.048 0.044 0.032 0.021 0.019 A 300685
+ 4849.76076 12.169 12.169 12.106 12.013 11.964 0.058 0.040 0.026 0.023 0.020 A 300969
+ 4852.63880 12.186 12.155 12.131 12.086 12.075 0.049 0.048 0.035 0.030 0.025 A 301311
+ 4855.65102 12.193 12.177 12.121 12.085 12.040 0.062 0.052 0.032 0.023 0.020 A 301566
+ 4857.75201 12.086 12.085 12.087 12.123 12.134 0.075 0.044 0.033 0.031 0.029 A 301848
+ 4861.61400 12.592 12.607 12.722 12.851 12.736 0.073 0.044 0.031 0.026 0.023 A 302162
+ 4863.67096 12.107 12.078 12.046 12.002 12.072 0.054 0.041 0.029 0.026 0.026 A 302455
+ 4865.78041 11.970 12.018 11.980 11.903 11.904 0.080 0.046 0.035 0.033 0.031 A 302709
+ 4868.64982 11.836 11.818 11.797 11.804 11.836 0.064 0.048 0.035 0.029 0.024 A 303003
+ 4870.74552 11.516 11.543 11.522 11.508 11.521 0.052 0.037 0.023 0.019 0.017 A 303283
+ 4873.64009 11.429 11.425 11.507 11.603 11.641 0.055 0.060 0.031 0.028 0.028 A 303651
+ 4876.62324 11.417 11.393 11.378 11.352 11.344 0.089 0.057 0.039 0.032 0.029 A 303969
+ 4881.62178 12.266 12.211 12.227 12.249 12.268 0.046 0.038 0.023 0.021 0.019 A 304548
+ 4883.75658 12.263 12.286 12.277 12.270 12.300 0.062 0.042 0.028 0.026 0.024 A 304833
+ 4894.63014 12.214 12.172 12.170 12.198 12.227 0.060 0.050 0.045 0.056 0.054 A 306087
+ 4898.64138 12.278 12.199 12.100 12.153 12.237 0.079 0.072 0.080 0.096 0.115 B 306351
+ 4902.64439 11.975 11.993 11.979 12.003 12.023 0.092 0.063 0.058 0.064 0.069 B 306917
+ 4905.64531 12.069 12.053 12.039 12.014 12.041 0.091 0.057 0.053 0.061 0.067 B 307360
+ 4914.52387 12.074 12.184 12.192 12.246 12.333 0.073 0.052 0.045 0.052 0.058 A 308092
+ 4919.54831 11.877 11.887 11.891 11.925 11.956 0.054 0.048 0.044 0.049 0.052 A 308849
+ 4924.49422 11.449 11.504 11.452 11.437 11.455 0.048 0.047 0.044 0.052 0.057 A 309239
+ 4928.49580 12.201 12.222 12.273 12.328 12.383 0.054 0.053 0.054 0.063 0.074 B 309528
+ 4931.54912 12.268 12.209 12.281 12.348 12.476 0.051 0.054 0.056 0.065 0.073 B 309893
+ 4933.59417 11.933 11.881 11.820 11.717 11.660 0.056 0.056 0.059 0.070 0.082 B 310227
+ 4935.61524 11.410 11.399 11.380 11.366 11.318 0.065 0.058 0.062 0.074 0.084 B 310552
+ 4938.55558 11.510 11.542 11.535 11.548 11.569 0.090 0.054 0.058 0.061 0.068 B 310975
+ 4941.55195 11.688 11.719 11.753 11.826 11.987 0.061 0.057 0.057 0.065 0.074 B 311439
+ 4946.57599 11.933 11.895 11.876 11.860 11.838 0.059 0.053 0.052 0.060 0.070 B 312202
+ 4949.49751 12.204 12.134 12.025 11.946 11.982 0.059 0.054 0.054 0.064 0.072 B 312683
+ 4954.50110 12.278 12.295 12.279 12.237 12.152 0.052 0.048 0.044 0.050 0.057 A 313465
+ 4959.54287 12.147 12.171 12.172 12.117 12.140 0.055 0.053 0.053 0.063 0.074 B 313761
+ 4962.52632 12.176 12.164 12.179 12.206 12.177 0.044 0.045 0.043 0.049 0.056 A 314092
+ 4965.50311 12.157 12.132 12.106 12.108 12.166 0.059 0.056 0.055 0.060 0.066 B 314485
+ 4968.50105 12.252 12.319 12.301 12.220 12.350 0.061 0.057 0.062 0.075 0.086 B 314972
+ 4972.50539 11.770 11.785 11.798 11.796 11.737 0.052 0.052 0.052 0.061 0.069 B 315411
+ 4985.45322 12.199 12.280 12.168 12.070 12.103 0.064 0.065 0.067 0.081 0.093 B 316387
+ 4988.46147 12.144 12.058 11.992 11.901 11.900 0.056 0.051 0.047 0.056 0.063 B 316902
+ 5042.92542 12.339 12.387 12.343 12.338 12.358 0.050 0.051 0.047 0.052 0.055 A 322652
+ 5134.87061 11.986 11.984 11.974 11.940 11.900 0.055 0.055 0.054 0.064 0.074 B 331904
+ 5160.75874 12.223 12.256 12.182 12.098 12.077 0.081 0.070 0.069 0.078 0.087 B 334049
+ 5166.74107 12.253 12.306 12.301 12.257 12.278 0.055 0.050 0.047 0.054 0.062 A 334713
+#dataset= 2 ; 2 F0624-56_068
+#desig= 065305-5936.0
+#cra= 6.884729 06:53:05.0
+#cdec= -59.600648 -59:36:02.3
+#class= 0
+#cmag_0= 12.681
+#cmer_0= 0.443
+#nskip_0= 0
+#cmag_1= 12.442
+#cmer_1= 0.220
+#nskip_1= 0
+#cmag_2= 12.355
+#cmer_2= 0.236
+#nskip_2= 0
+#cmag_3= 12.342
+#cmer_3= 0.239
+#nskip_3= 0
+#cmag_4= 12.375
+#cmer_4= 0.234
+#nskip_4= 0
+#ra= 6.884746 06:53:05.1
+#dec= -59.600277 -59:36:01.0
+# HJD MAG_0 MAG_1 MAG_2 MAG_3 MAG_4 MER_0 MER_1 MER_2 MER_3 MER_4 GRADE FRAME
+ 2070.44787 29.999 29.999 29.999 29.999 29.999 0.069 0.063 0.062 0.062 0.060 C 22446
+ 2205.72204 29.999 29.999 29.999 29.999 29.999 0.175 0.168 0.159 0.159 0.158 C 37380
+ 2278.65247 12.270 12.306 12.280 12.348 12.421 0.105 0.103 0.099 0.082 0.070 B 46603
+ 2280.64877 12.896 12.618 12.612 12.684 12.753 0.135 0.122 0.101 0.092 0.082 B 46926
+ 2638.77914 29.999 29.999 29.999 29.999 29.999 0.072 0.056 0.044 0.043 0.041 C 32732
+ 2893.83092 29.999 29.999 29.999 29.999 29.999 0.065 0.055 0.035 0.030 0.027 C 70958
+ 2970.68245 29.999 29.999 29.999 29.999 29.999 0.027 0.029 0.017 0.016 0.015 C 82143
+ 2977.70918 29.999 29.999 29.999 29.999 29.999 0.032 0.042 0.029 0.035 0.043 C 83015
+ 4438.69847 29.999 29.999 29.999 29.999 29.999 0.043 0.036 0.023 0.020 0.017 C 248426
+ 4506.71835 12.879 12.405 12.174 11.994 11.953 0.093 0.043 0.028 0.025 0.023 A 256019
+#dataset= 2 ; 3 F0624-56_068
+#desig= 065305-5935.8
+#cra= 6.884801 06:53:05.3
+#cdec= -59.596341 -59:35:46.8
+#class= 0
+#cmag_0= 12.238
+#cmer_0= 0.244
+#nskip_0= 0
+#cmag_1= 12.384
+#cmer_1= 0.211
+#nskip_1= 0
+#cmag_2= 12.417
+#cmer_2= 0.188
+#nskip_2= 0
+#cmag_3= 12.436
+#cmer_3= 0.185
+#nskip_3= 0
+#cmag_4= 12.479
+#cmer_4= 0.250
+#nskip_4= 0
+#ra= 6.884801 06:53:05.3
+#dec= -59.596341 -59:35:46.8
+# HJD MAG_0 MAG_1 MAG_2 MAG_3 MAG_4 MER_0 MER_1 MER_2 MER_3 MER_4 GRADE FRAME
+ 1906.65645 29.999 29.999 29.999 29.999 29.999 0.100 0.084 0.071 0.072 0.082 C 4161
+ 1926.62314 29.999 29.999 29.999 29.999 29.999 0.172 0.148 0.105 0.099 0.100 C 6440
+ 1996.53080 29.999 29.999 29.999 29.999 29.999 0.056 0.055 0.047 0.048 0.043 C 13798
+ 1998.53014 12.117 12.175 12.232 12.252 12.231 0.089 0.093 0.083 0.080 0.074 B 14200
+ 2236.73928 12.458 12.453 12.429 12.452 12.410 0.049 0.043 0.029 0.031 0.026 A 41149
+ 2240.72521 11.778 11.748 11.755 11.798 11.752 0.065 0.058 0.045 0.045 0.034 A 41619
+ 2241.72860 12.220 12.163 12.142 12.137 12.118 0.043 0.038 0.025 0.027 0.023 A 41780
+ 2265.67747 11.568 11.562 11.552 11.549 11.536 0.077 0.075 0.080 0.079 0.068 B 44995
+ 2273.65361 12.490 12.595 12.606 12.636 12.730 0.108 0.111 0.099 0.086 0.077 B 45867
+ 2275.65390 12.713 12.668 12.606 12.622 12.776 0.121 0.130 0.107 0.089 0.085 B 46172
+ 2495.91269 29.999 29.999 29.999 29.999 29.999 0.052 0.053 0.044 0.046 0.043 C 14922
+ 2621.73534 29.999 29.999 29.999 29.999 29.999 0.052 0.049 0.032 0.038 0.046 C 29842
+ 2652.63374 29.999 29.999 29.999 29.999 29.999 0.037 0.043 0.037 0.028 0.026 C 34584
+ 2839.94077 29.999 29.999 29.999 29.999 29.999 0.131 0.123 0.120 0.118 0.117 C 64238
+ 2902.83864 29.999 29.999 29.999 29.999 29.999 0.102 0.107 0.102 0.099 0.098 C 72598
+ 2906.80336 29.999 29.999 29.999 29.999 29.999 0.038 0.041 0.027 0.026 0.027 C 73247
+#dataset= 2 ; 4 F0624-56_068
+#desig= 065309-5935.4
+#cra= 6.885907 06:53:09.3
+#cdec= -59.589815 -59:35:23.3
+#class= 0
+#cmag_0= 12.100
+#cmer_0= 0.227
+#nskip_0= 1
+#cmag_1= 12.039
+#cmer_1= 0.095
+#nskip_1= 0
+#cmag_2= 12.039
+#cmer_2= 0.095
+#nskip_2= 0
+#cmag_3= 12.045
+#cmer_3= 0.095
+#nskip_3= 0
+#cmag_4= 12.086
+#cmer_4= 0.099
+#nskip_4= 0
+#ra= 6.885907 06:53:09.3
+#dec= -59.589815 -59:35:23.3
+# HJD MAG_0 MAG_1 MAG_2 MAG_3 MAG_4 MER_0 MER_1 MER_2 MER_3 MER_4 GRADE FRAME
+ 1902.65732 29.999 29.999 29.999 29.999 29.999 0.179 0.134 0.110 0.110 0.118 C 3517
+ 1908.65606 29.999 29.999 29.999 29.999 29.999 0.179 0.149 0.120 0.122 0.128 C 4481
+ 2011.51570 29.999 29.999 29.999 29.999 29.999 0.103 0.104 0.068 0.059 0.066 C 15528
+ 2177.82535 29.999 29.999 29.999 29.999 29.999 0.255 0.250 0.243 0.247 0.247 D 33510
+ 2221.70829 29.999 29.999 29.999 29.999 29.999 0.158 0.155 0.157 0.157 0.156 C 39060
+ 2236.73928 12.506 12.528 12.516 12.531 12.485 0.049 0.043 0.029 0.031 0.026 A 41149
+ 2264.67676 12.187 12.221 12.214 12.247 12.264 0.076 0.072 0.052 0.064 0.059 A 44838
+ 2266.67015 12.116 12.089 12.050 12.045 12.085 0.066 0.074 0.062 0.068 0.058 A 45153
+ 2272.66547 12.580 12.287 12.177 12.166 12.237 0.094 0.097 0.098 0.081 0.071 B 45734
+ 2278.65247 12.604 12.392 12.367 12.414 12.399 0.105 0.103 0.099 0.082 0.070 B 46603
+ 2279.65098 11.839 11.940 11.985 12.048 12.052 0.170 0.158 0.133 0.107 0.091 B 46768
+ 2291.62324 11.792 11.988 12.028 12.033 12.087 0.152 0.138 0.105 0.096 0.082 B 47866
+ 2721.60515 29.999 29.999 29.999 29.999 29.999 0.136 0.102 0.075 0.060 0.062 C 46470
+ 2910.81967 29.999 29.999 29.999 29.999 29.999 0.038 0.041 0.030 0.027 0.025 C 73802
+ 2961.73795 29.999 29.999 29.999 29.999 29.999 0.058 0.058 0.036 0.030 0.025 C 80959
+ 3700.80137 29.999 29.999 29.999 29.999 29.999 0.031 0.035 0.023 0.021 0.021 C 168097
+ 4178.68096 29.999 29.999 29.999 29.999 29.999 0.069 0.056 0.041 0.032 0.026 C 218708
+ 4238.51134 29.999 29.999 29.999 29.999 29.999 0.077 0.060 0.049 0.040 0.041 C 224970
+ 4249.47142 29.999 29.999 29.999 29.999 29.999 0.279 0.268 0.258 0.253 0.244 D 226564
+ 4514.67243 29.999 29.999 29.999 29.999 29.999 0.367 0.370 0.371 0.371 0.362 D 256912
+ 4553.63975 29.999 29.999 29.999 29.999 29.999 0.119 0.121 0.116 0.114 0.113 C 262395
+ 4611.46643 29.999 29.999 29.999 29.999 29.999 0.368 0.373 0.364 0.354 0.357 D 270710
+#ndata= 590
+#dataset= 3 ; 1 F0712-56_069
+#desig= 065309-5936.0
+#cra= 6.885941 06:53:09.4
+#cdec= -59.600624 -59:36:02.2
+#class= 0
+#cmag_0= 12.600
+#cmer_0= 0.079
+#nskip_0= 0
+#cmag_1= 12.407
+#cmer_1= 0.008
+#nskip_1= 0
+#cmag_2= 12.041
+#cmer_2= 0.033
+#nskip_2= 0
+#cmag_3= 11.809
+#cmer_3= 0.037
+#nskip_3= 0
+#cmag_4= 11.662
+#cmer_4= 0.021
+#nskip_4= 0
+#ra= 6.885941 06:53:09.4
+#dec= -59.600624 -59:36:02.2
+# HJD MAG_0 MAG_1 MAG_2 MAG_3 MAG_4 MER_0 MER_1 MER_2 MER_3 MER_4 GRADE FRAME
+ 2652.66822 12.692 12.412 12.022 11.770 11.629 0.032 0.036 0.032 0.036 0.038 A 34599
+ 2669.69477 29.999 29.999 29.999 29.999 29.999 0.032 0.035 0.030 0.032 0.035 C 37455
+ 2677.65814 29.999 29.999 29.999 29.999 29.999 0.032 0.036 0.031 0.034 0.037 C 38812
+ 2685.65166 29.999 29.999 29.999 29.999 29.999 0.040 0.036 0.032 0.033 0.036 C 40183
+ 2699.70184 29.999 29.999 29.999 29.999 29.999 0.037 0.034 0.032 0.034 0.039 C 42729
+ 2703.69567 29.999 29.999 29.999 29.999 29.999 0.032 0.033 0.030 0.032 0.036 C 43493
+ 2751.62091 29.999 29.999 29.999 29.999 29.999 0.031 0.034 0.030 0.032 0.037 C 51822
+ 2759.47549 29.999 29.999 29.999 29.999 29.999 0.034 0.037 0.032 0.035 0.038 C 53150
+ 2929.81164 12.498 12.400 12.028 11.805 11.666 0.034 0.042 0.036 0.039 0.041 A 76435
+ 2946.75925 12.609 12.410 12.073 11.855 11.693 0.033 0.037 0.035 0.036 0.038 A 78879
+ 2975.71648 29.999 29.999 29.999 29.999 29.999 0.033 0.035 0.031 0.034 0.038 C 82748
+ 2981.76276 29.999 29.999 29.999 29.999 29.999 0.034 0.039 0.034 0.039 0.043 C 83561
+ 3415.74638 29.999 29.999 29.999 29.999 29.999 0.055 0.040 0.034 0.037 0.043 C 130147
+ 3422.58150 29.999 29.999 29.999 29.999 29.999 0.084 0.093 0.111 0.132 0.151 D 131189
+ 3517.48831 29.999 29.999 29.999 29.999 29.999 0.111 0.054 0.049 0.054 0.059 D 144289
+#dataset= 3 ; 2 F0712-56_069
+#desig= 065307-5935.7
+#cra= 6.885405 06:53:07.5
+#cdec= -59.595626 -59:35:44.3
+#class= 0
+#cmag_0= 11.974
+#cmer_0= 0.305
+#nskip_0= 0
+#cmag_1= 11.980
+#cmer_1= 0.301
+#nskip_1= 0
+#cmag_2= 12.032
+#cmer_2= 0.280
+#nskip_2= 1
+#cmag_3= 12.034
+#cmer_3= 0.278
+#nskip_3= 2
+#cmag_4= 12.053
+#cmer_4= 0.285
+#nskip_4= 2
+#ra= 6.885400 06:53:07.4
+#dec= -59.595607 -59:35:44.2
+# HJD MAG_0 MAG_1 MAG_2 MAG_3 MAG_4 MER_0 MER_1 MER_2 MER_3 MER_4 GRADE FRAME
+ 1868.76113 12.146 12.131 12.144 12.165 12.193 0.065 0.038 0.034 0.038 0.046 A 134
+ 1869.75808 12.364 12.314 12.288 12.256 12.247 0.068 0.040 0.036 0.042 0.049 A 296
+ 1870.77105 11.734 11.755 11.768 11.787 11.820 0.067 0.040 0.037 0.041 0.048 A 449
+ 1871.78921 12.152 12.176 12.181 12.163 12.176 0.069 0.041 0.038 0.042 0.049 A 587
+ 1873.69273 11.736 11.719 11.718 11.717 11.710 0.067 0.039 0.036 0.041 0.047 A 868
+ 1874.75732 12.137 12.152 12.159 12.166 12.168 0.082 0.044 0.039 0.045 0.053 D 1058
+ 1875.76634 11.416 11.421 11.428 11.431 11.447 0.067 0.040 0.035 0.039 0.046 A 1222
+ 1876.78848 11.943 11.975 11.973 11.972 12.015 0.050 0.037 0.033 0.037 0.044 A 1393
+ 1877.77137 12.259 12.220 12.171 12.144 12.120 0.047 0.038 0.033 0.036 0.042 A 1543
+ 1878.74859 11.485 11.492 11.489 11.486 11.505 0.046 0.035 0.031 0.034 0.040 A 1693
+ 1879.76315 12.016 12.008 11.994 11.973 11.967 0.048 0.038 0.034 0.037 0.043 A 1855
+ 1880.74789 12.333 12.272 12.243 12.216 12.224 0.057 0.035 0.031 0.037 0.044 A 2003
+ 1881.74444 11.572 11.565 11.577 11.586 11.609 0.044 0.036 0.031 0.034 0.040 A 2161
+ 1884.71676 11.743 11.684 11.670 11.652 11.648 0.047 0.039 0.033 0.035 0.041 A 2298
+ 1885.72479 12.210 12.180 12.198 12.188 12.159 0.041 0.038 0.031 0.033 0.039 A 2461
+ 1886.72615 12.342 12.332 12.282 12.244 12.281 0.044 0.039 0.031 0.034 0.039 A 2623
+ 1887.71959 11.740 11.768 11.766 11.767 11.787 0.050 0.038 0.032 0.036 0.041 A 2778
+ 1888.71647 12.191 12.238 12.238 12.209 12.161 0.052 0.038 0.033 0.037 0.043 A 2937
+ 1889.72017 11.889 11.924 11.940 11.947 11.999 0.050 0.036 0.031 0.035 0.041 A 3100
+ 1899.69727 12.083 12.081 12.079 12.079 12.099 0.041 0.036 0.029 0.031 0.037 A 3220
+ 1900.70655 12.333 12.316 12.321 12.330 12.338 0.041 0.036 0.029 0.032 0.038 A 3381
+ 1902.68199 12.033 12.120 12.125 12.122 12.109 0.045 0.039 0.031 0.033 0.038 A 3528
+ 1903.70567 12.146 12.179 12.199 12.195 12.209 0.049 0.039 0.033 0.035 0.040 A 3698
+ 1905.69273 12.143 12.157 12.164 12.182 12.193 0.047 0.038 0.032 0.035 0.040 A 4014
+ 1906.68382 11.782 11.803 11.813 11.824 11.819 0.043 0.038 0.032 0.034 0.039 A 4172
+ 1907.69081 11.920 11.904 11.889 11.891 11.912 0.042 0.039 0.031 0.034 0.039 A 4335
+ 1908.68309 12.271 12.233 12.225 12.228 12.226 0.046 0.038 0.032 0.034 0.038 A 4493
+ 1915.67547 11.549 11.597 11.622 11.649 11.644 0.048 0.038 0.032 0.035 0.041 A 4944
+ 1918.65483 11.711 11.715 11.707 11.725 11.722 0.041 0.039 0.032 0.034 0.038 A 5150
+ 1919.66616 12.182 12.120 12.112 12.092 12.106 0.042 0.039 0.034 0.036 0.040 A 5315
+ 1920.66566 12.118 12.115 12.099 12.081 12.109 0.038 0.036 0.031 0.034 0.038 A 5475
+ 1921.66113 11.954 11.867 11.865 11.861 11.867 0.043 0.040 0.032 0.034 0.040 A 5632
+ 1922.66049 12.256 12.219 12.237 12.266 12.311 0.045 0.040 0.030 0.032 0.037 A 5783
+ 1923.65591 11.578 11.571 11.570 11.571 11.596 0.051 0.051 0.046 0.047 0.051 B 5946
+ 1925.65627 12.234 12.228 12.196 12.169 12.214 0.051 0.046 0.039 0.040 0.045 A 6284
+ 1926.64818 11.468 11.465 11.448 11.436 11.434 0.039 0.037 0.030 0.032 0.037 A 6451
+ 1932.63755 11.681 11.710 11.706 11.699 11.713 0.042 0.040 0.030 0.032 0.036 A 7426
+ 1933.63699 12.134 12.184 12.206 12.215 12.230 0.044 0.041 0.030 0.032 0.035 A 7591
+ 1936.61689 12.157 12.165 12.170 12.166 12.156 0.039 0.038 0.030 0.031 0.034 A 8015
+ 1938.61177 11.878 11.883 11.846 11.839 11.856 0.041 0.040 0.030 0.031 0.034 A 8253
+ 1940.61812 29.999 29.999 29.999 29.999 29.999 0.041 0.041 0.031 0.032 0.035 C 8500
+ 1952.59340 11.757 11.764 11.768 11.751 11.774 0.052 0.048 0.035 0.032 0.035 B 9567
+ 1954.59697 11.780 11.765 11.748 11.752 11.745 0.048 0.042 0.034 0.038 0.037 A 9834
+ 1955.59337 11.886 11.901 11.884 11.855 11.856 0.041 0.040 0.031 0.033 0.033 A 10009
+ 1965.55509 12.218 12.243 12.242 12.219 12.236 0.046 0.044 0.034 0.037 0.035 A 11141
+ 1979.60881 12.228 12.277 12.273 12.223 12.203 0.055 0.048 0.042 0.051 0.046 B 12215
+ 1981.58341 12.086 12.174 12.156 12.131 12.129 0.052 0.046 0.040 0.048 0.042 A 12539
+ 1994.48805 11.535 11.488 11.519 11.526 11.527 0.057 0.049 0.041 0.051 0.049 B 13384
+ 1996.50748 12.265 12.236 12.249 12.262 12.287 0.063 0.053 0.044 0.051 0.051 B 13789
+ 2031.49543 11.822 11.875 11.882 11.864 11.865 0.050 0.036 0.034 0.039 0.045 A 17962
+ 2033.50710 11.463 11.453 11.457 11.459 11.477 0.060 0.040 0.036 0.040 0.047 A 18400
+ 2057.46073 12.083 12.089 12.119 12.128 12.174 0.041 0.054 0.050 0.057 0.053 D 20850
+ 2070.45962 11.647 11.653 11.665 11.672 11.680 0.054 0.037 0.034 0.039 0.045 A 22451
+ 2136.90417 11.848 11.874 11.899 11.905 11.926 0.059 0.040 0.035 0.039 0.046 A 29758
+ 2156.89011 12.044 12.032 12.023 11.992 11.959 0.052 0.036 0.032 0.037 0.043 A 31759
+ 2166.89690 11.567 11.548 11.540 11.521 11.521 0.057 0.038 0.033 0.037 0.045 A 32024
+ 2168.85246 12.239 12.249 12.257 12.262 12.293 0.053 0.037 0.031 0.035 0.042 A 32359
+ 2172.81106 11.519 11.474 11.482 11.478 11.484 0.049 0.036 0.031 0.035 0.041 A 32865
+ 2183.83362 11.584 11.598 11.612 11.629 11.643 0.049 0.038 0.032 0.036 0.042 A 33975
+ 2185.88907 12.262 12.265 12.258 12.274 12.287 0.052 0.044 0.034 0.038 0.040 A 34377
+ 2189.84517 11.652 11.607 11.601 11.604 11.626 0.046 0.039 0.031 0.034 0.039 A 34849
+ 2191.79537 12.352 12.290 12.253 12.217 12.234 0.052 0.039 0.033 0.036 0.042 A 35184
+ 2193.78721 12.077 12.112 12.120 12.114 12.111 0.052 0.040 0.033 0.034 0.041 A 35536
+ 2197.79216 12.221 12.212 12.237 12.303 12.376 0.060 0.055 0.051 0.056 0.062 D 36204
+ 2199.78630 12.201 12.191 12.216 12.212 12.210 0.067 0.051 0.044 0.045 0.049 B 36562
+ 2201.79559 11.970 11.968 11.972 11.964 11.963 0.050 0.039 0.031 0.033 0.038 A 36813
+ 2203.77103 11.448 11.426 11.440 11.448 11.483 0.053 0.047 0.043 0.046 0.050 B 37144
+ 2208.77496 12.255 12.273 12.277 12.293 12.305 0.064 0.055 0.056 0.065 0.071 D 37739
+ 2212.74017 11.778 11.778 11.735 11.710 11.723 0.051 0.042 0.035 0.038 0.042 A 37964
+ 2213.78105 12.162 12.129 12.151 12.164 12.217 0.049 0.041 0.034 0.037 0.040 A 38151
+ 2215.74306 11.840 11.867 11.866 11.859 11.863 0.052 0.043 0.034 0.038 0.040 A 38451
+ 2216.84590 12.261 12.282 12.293 12.288 12.231 0.049 0.042 0.035 0.041 0.042 A 38661
+ 2221.74696 11.940 11.986 12.006 12.027 12.069 0.056 0.049 0.041 0.042 0.044 B 39077
+ 2222.78878 12.335 12.286 12.290 12.312 12.335 0.052 0.045 0.038 0.044 0.043 A 39251
+ 2224.79097 12.153 12.132 12.129 12.119 12.123 0.051 0.045 0.035 0.037 0.039 A 39416
+ 2226.72241 11.677 11.663 11.677 11.683 11.696 0.049 0.043 0.035 0.040 0.040 A 39700
+ 2227.80734 12.216 12.201 12.198 12.228 12.249 0.051 0.043 0.036 0.042 0.043 A 39890
+ 2230.83067 12.219 12.202 12.194 12.176 12.183 0.049 0.044 0.035 0.041 0.042 A 40393
+ 2232.78544 11.999 11.996 11.990 11.996 12.008 0.048 0.042 0.033 0.036 0.037 A 40540
+ 2233.82654 12.282 12.289 12.294 12.310 12.327 0.050 0.043 0.035 0.040 0.041 A 40714
+ 2234.79463 11.587 11.550 11.552 11.564 11.579 0.054 0.045 0.037 0.042 0.041 A 40858
+ 2235.75707 12.037 12.083 12.064 12.041 12.048 0.051 0.047 0.039 0.043 0.041 A 40998
+ 2236.79858 12.380 12.361 12.357 12.371 12.384 0.051 0.044 0.036 0.041 0.041 A 41175
+ 2237.76999 11.656 11.650 11.651 11.628 11.634 0.052 0.045 0.037 0.043 0.042 A 41322
+ 2239.74872 12.343 12.288 12.228 12.097 11.727 0.054 0.047 0.040 0.045 0.046 A 41472
+ 2240.78921 11.872 11.842 11.842 11.849 11.871 0.053 0.045 0.037 0.044 0.044 A 41647
+ 2241.77891 12.147 12.171 12.183 12.203 12.244 0.053 0.047 0.038 0.044 0.043 A 41802
+ 2242.74815 12.178 12.123 12.160 12.174 12.170 0.055 0.051 0.042 0.046 0.045 B 41950
+ 2243.76967 11.847 11.913 11.882 11.896 11.893 0.057 0.050 0.043 0.048 0.048 B 42115
+ 2244.79123 12.193 12.240 12.247 12.278 12.281 0.058 0.049 0.041 0.049 0.050 B 42245
+ 2247.73686 12.339 12.387 12.322 12.285 12.270 0.060 0.051 0.042 0.048 0.049 B 42376
+ 2248.76038 11.480 11.461 11.474 11.476 11.474 0.053 0.046 0.039 0.046 0.047 A 42552
+ 2249.74740 11.987 11.959 11.962 11.959 11.997 0.059 0.048 0.039 0.047 0.049 B 42743
+ 2250.73866 12.276 12.235 12.233 12.234 12.248 0.054 0.048 0.040 0.045 0.045 B 42900
+ 2251.72807 11.556 11.601 11.576 11.564 11.533 0.060 0.050 0.042 0.049 0.048 B 43057
+ 2254.73175 11.691 11.723 11.719 11.720 11.712 0.058 0.048 0.040 0.047 0.047 B 43511
+ 2255.72508 12.077 12.112 12.127 12.147 12.141 0.058 0.048 0.040 0.046 0.046 B 43666
+ 2257.73071 11.737 11.766 11.772 11.784 11.784 0.060 0.050 0.042 0.048 0.047 B 43990
+ 2445.44847 12.127 12.122 12.123 12.135 12.222 0.047 0.040 0.034 0.038 0.043 A 9014
+ 2498.91448 11.986 12.009 12.016 11.991 12.001 0.049 0.048 0.041 0.042 0.042 B 15559
+ 2501.93543 12.189 12.142 12.224 12.361 12.386 0.056 0.053 0.045 0.047 0.048 B 16140
+ 2521.86945 12.235 12.207 12.236 12.245 12.290 0.043 0.040 0.034 0.037 0.039 A 18497
+ 2526.87470 12.024 12.042 12.031 12.032 12.051 0.055 0.054 0.042 0.041 0.037 B 18946
+ 2539.82132 11.887 11.891 11.846 11.880 11.890 0.064 0.057 0.048 0.054 0.055 D 19600
+ 2545.79378 11.457 11.486 11.491 11.497 11.522 0.063 0.041 0.032 0.035 0.040 A 20240
+ 2553.82760 11.693 11.772 11.787 11.839 11.850 0.063 0.059 0.050 0.051 0.053 D 21406
+ 2556.84737 11.536 11.519 11.509 11.492 11.518 0.060 0.058 0.050 0.049 0.046 D 21782
+ 2558.82080 12.250 12.260 12.246 12.272 12.271 0.049 0.046 0.035 0.034 0.033 A 22126
+ 2560.80853 11.990 12.045 12.125 12.115 12.069 0.036 0.037 0.030 0.032 0.034 A 22480
+ 2562.80336 11.636 11.594 11.607 11.611 11.641 0.049 0.038 0.035 0.034 0.035 A 22806
+ 2564.79745 12.470 12.389 12.389 12.425 12.546 0.108 0.108 0.111 0.113 0.117 D 23162
+ 2566.80358 12.132 12.098 12.127 12.121 12.172 0.046 0.053 0.048 0.051 0.050 B 23522
+ 2578.78510 12.249 12.227 12.331 12.363 12.405 0.045 0.043 0.035 0.036 0.038 A 25010
+ 2621.77168 11.637 11.642 11.669 11.666 11.664 0.033 0.042 0.038 0.038 0.040 A 29858
+ 2623.72150 12.570 12.457 12.380 12.341 12.350 0.032 0.039 0.034 0.033 0.035 A 30168
+ 2625.70943 12.062 12.107 12.124 12.150 12.141 0.031 0.035 0.031 0.033 0.036 A 30445
+ 2635.67018 11.471 11.477 11.482 11.496 11.502 0.034 0.038 0.034 0.035 0.038 A 32241
+ 2637.69017 12.253 12.254 12.272 12.285 12.311 0.032 0.044 0.041 0.038 0.038 A 32541
+ 2639.69017 12.102 12.130 12.136 12.153 12.166 0.032 0.042 0.039 0.036 0.037 A 32849
+ 2641.69518 11.704 11.700 11.698 11.686 11.667 0.032 0.035 0.030 0.032 0.034 A 33134
+ 2643.70470 12.189 12.151 12.175 12.174 12.191 0.031 0.036 0.033 0.034 0.037 A 33449
+ 2645.68890 12.204 12.207 12.171 12.184 12.188 0.030 0.037 0.032 0.034 0.035 A 33740
+ 2647.67403 11.908 11.896 11.886 11.897 11.910 0.033 0.038 0.032 0.036 0.038 A 34030
+ 2650.65052 11.965 11.949 11.961 11.971 11.962 0.031 0.035 0.031 0.034 0.035 A 34286
+ 2652.66822 11.523 11.483 11.488 11.482 11.485 0.032 0.036 0.032 0.036 0.038 A 34599
+ 2654.66725 12.233 12.260 12.250 12.247 12.277 0.034 0.040 0.035 0.040 0.043 A 34908
+ 2657.70068 12.120 12.156 12.158 12.135 12.125 0.032 0.040 0.034 0.036 0.037 A 35453
+ 2663.71297 29.999 29.999 29.999 29.999 29.999 0.032 0.035 0.030 0.032 0.035 C 36481
+ 2675.67624 11.849 11.829 11.818 11.787 11.806 0.032 0.033 0.029 0.031 0.034 A 38473
+ 2680.65158 11.429 11.479 11.488 11.489 11.498 0.033 0.037 0.031 0.031 0.034 A 39311
+ 2683.69156 11.583 11.677 11.673 11.667 11.671 0.035 0.037 0.031 0.033 0.037 A 39838
+ 2691.73478 11.473 11.533 11.532 11.525 11.519 0.049 0.035 0.033 0.036 0.041 A 41323
+ 2695.70046 12.054 12.051 12.061 12.081 12.089 0.044 0.044 0.041 0.043 0.047 A 41978
+ 2697.70918 11.712 11.671 11.667 11.668 11.701 0.034 0.034 0.031 0.033 0.037 A 42311
+ 2705.68801 11.524 11.506 11.522 11.516 11.508 0.043 0.037 0.033 0.036 0.041 A 43864
+ 2709.64238 11.973 11.913 11.923 11.943 11.938 0.033 0.034 0.030 0.033 0.037 A 44574
+ 2719.54513 12.252 12.309 12.383 12.448 12.477 0.033 0.033 0.030 0.031 0.034 A 46059
+ 2728.60069 11.528 11.527 11.524 11.519 11.543 0.036 0.035 0.031 0.033 0.039 A 47842
+ 2750.50548 29.999 29.999 29.999 29.999 29.999 0.047 0.046 0.031 0.032 0.036 C 51580
+ 2770.49823 11.951 11.986 11.997 11.991 11.981 0.035 0.033 0.031 0.034 0.038 A 54797
+ 2775.50499 12.137 12.173 12.206 12.231 12.244 0.033 0.038 0.033 0.036 0.039 A 55027
+ 2787.46224 29.999 29.999 29.999 29.999 29.999 0.030 0.033 0.030 0.033 0.035 C 56720
+ 2860.91227 12.184 12.187 12.168 12.158 12.198 0.032 0.036 0.029 0.032 0.036 A 66868
+ 2867.92944 11.656 11.627 11.616 11.576 11.618 0.034 0.037 0.032 0.034 0.038 A 67887
+ 2877.89876 12.226 12.216 12.220 12.229 12.246 0.033 0.035 0.031 0.033 0.035 A 69059
+ 2884.88707 11.542 11.550 11.580 11.557 11.600 0.032 0.039 0.034 0.036 0.037 A 69924
+ 2893.85578 11.956 11.943 11.960 11.954 11.972 0.038 0.037 0.034 0.038 0.042 A 70969
+ 2896.84577 11.933 11.939 99.999 99.999 99.999 0.034 0.035 0.031 0.034 0.037 C 71561
+ 2899.87350 12.057 12.052 12.042 12.033 12.062 0.032 0.035 0.031 0.033 0.034 A 72126
+ 2903.89162 12.238 12.229 12.230 12.176 12.185 0.038 0.046 0.043 0.045 0.047 B 72773
+ 2907.84080 11.883 11.868 11.857 11.830 11.829 0.057 0.060 0.061 0.065 0.068 D 73322
+ 2911.82513 12.223 12.250 12.271 12.272 12.310 0.031 0.034 0.031 0.032 0.034 A 73995
+ 2915.86334 11.621 11.608 11.609 11.606 11.621 0.032 0.036 0.033 0.035 0.038 A 74484
+ 2918.79837 11.665 11.754 11.773 11.794 11.794 0.040 0.045 0.045 0.052 0.061 D 74957
+ 2922.77554 12.152 12.180 12.125 12.090 12.059 0.032 0.037 0.032 0.034 0.040 A 75329
+ 2924.83480 11.900 11.866 11.844 11.811 11.787 0.035 0.037 0.032 0.035 0.039 A 75712
+ 2927.80081 11.945 11.883 11.903 11.919 11.903 0.029 0.036 0.031 0.034 0.035 A 76074
+ 2929.81164 11.689 11.733 11.713 11.661 11.655 0.034 0.042 0.036 0.039 0.041 A 76435
+ 2932.82851 11.623 11.617 11.613 11.606 11.612 0.029 0.035 0.032 0.034 0.036 A 76977
+ 2935.80664 12.015 11.996 11.936 11.885 11.857 0.030 0.037 0.033 0.036 0.037 A 77508
+ 2939.86849 29.999 29.999 29.999 29.999 29.999 0.029 0.038 0.030 0.033 0.035 C 77915
+ 2943.81025 11.506 11.552 11.551 11.552 11.558 0.032 0.036 0.031 0.033 0.037 A 78438
+ 2946.75925 11.536 11.516 11.514 11.510 11.501 0.033 0.037 0.035 0.036 0.038 A 78879
+ 2951.81242 12.125 12.127 12.147 12.173 12.176 0.032 0.035 0.030 0.034 0.037 A 79634
+ 2954.78805 11.737 11.764 11.776 11.780 11.809 0.038 0.043 0.043 0.048 0.054 B 80002
+ 2957.78505 29.999 29.999 29.999 29.999 29.999 0.034 0.038 0.035 0.039 0.043 C 80435
+ 2963.77044 11.608 11.589 11.628 11.637 11.634 0.030 0.034 0.030 0.034 0.037 A 81252
+ 2966.75381 11.743 11.726 11.741 11.724 11.749 0.041 0.043 0.041 0.045 0.049 A 81677
+ 2970.77267 12.151 12.141 12.149 12.151 12.162 0.034 0.036 0.031 0.035 0.038 A 82157
+ 2979.74854 12.304 12.308 12.320 12.361 12.376 0.035 0.039 0.037 0.038 0.040 A 83298
+ 2984.70721 12.151 12.147 12.164 12.151 12.169 0.031 0.034 0.030 0.032 0.037 A 83933
+ 2989.70282 11.947 11.876 11.917 11.940 11.988 0.033 0.034 0.030 0.034 0.038 A 84548
+ 2994.68522 11.532 11.509 11.528 11.533 11.545 0.031 0.034 0.029 0.032 0.036 A 85201
+ 2996.73769 29.999 29.999 29.999 29.999 29.999 0.045 0.044 0.038 0.038 0.037 C 85484
+ 3265.84180 11.768 11.692 11.685 11.674 11.647 0.048 0.042 0.035 0.037 0.043 A 115095
+ 3333.77782 11.583 11.550 11.552 11.558 11.591 0.039 0.039 0.037 0.042 0.050 A 121833
+ 3355.70548 12.276 12.280 12.285 12.290 12.326 0.045 0.038 0.032 0.036 0.042 A 124383
+ 3358.69534 11.871 11.925 11.934 11.953 11.955 0.046 0.036 0.034 0.036 0.038 A 124715
+ 3365.72938 12.120 12.058 12.068 12.055 12.059 0.059 0.043 0.044 0.048 0.052 B 125083
+ 3373.79949 12.018 12.001 12.009 11.999 12.019 0.051 0.041 0.044 0.051 0.058 B 125384
+ 3382.68433 12.155 12.129 12.121 12.120 12.109 0.065 0.046 0.042 0.046 0.051 A 125644
+ 3383.73624 12.266 12.285 12.274 12.283 12.294 0.036 0.035 0.033 0.036 0.038 A 125791
+ 3385.81828 12.267 12.281 12.278 12.277 12.305 0.042 0.033 0.030 0.033 0.037 A 126097
+ 3390.65683 12.262 12.147 12.106 12.055 12.052 0.048 0.036 0.034 0.039 0.044 A 126728
+ 3392.73512 11.515 11.512 11.537 11.620 11.610 0.081 0.086 0.094 0.112 0.128 D 126972
+ 3395.72745 11.771 11.764 11.789 11.815 11.835 0.040 0.035 0.032 0.034 0.039 A 127289
+ 3397.77084 11.842 11.765 11.764 11.735 11.725 0.041 0.038 0.033 0.036 0.041 A 127548
+ 3399.83043 12.335 12.295 12.287 12.282 12.291 0.042 0.035 0.033 0.036 0.039 A 127828
+ 3402.79001 12.275 12.270 12.285 12.275 12.299 0.039 0.035 0.033 0.039 0.046 A 128147
+ 3405.56541 12.164 12.191 12.177 12.172 12.168 0.049 0.040 0.035 0.038 0.045 A 128536
+ 3407.61776 11.891 11.882 11.907 11.929 12.021 0.072 0.069 0.069 0.075 0.080 D 128871
+ 3409.64005 11.465 11.505 11.505 11.491 11.487 0.039 0.038 0.035 0.036 0.040 A 129189
+ 3411.67673 12.305 12.321 12.281 12.258 12.243 0.048 0.039 0.034 0.037 0.043 A 129496
+ 3413.72697 12.221 12.226 12.229 12.254 12.279 0.050 0.040 0.038 0.041 0.047 A 129813
+ 3417.77874 11.526 11.519 11.522 11.517 11.518 0.049 0.039 0.035 0.037 0.043 A 130471
+ 3420.54987 12.362 12.394 12.388 12.380 12.387 0.065 0.051 0.044 0.046 0.045 B 130868
+ 3424.61090 11.935 11.964 11.938 11.939 11.975 0.070 0.050 0.049 0.055 0.058 B 131498
+ 3426.61023 11.501 11.551 11.516 11.500 11.473 0.056 0.047 0.037 0.037 0.039 A 131831
+ 3428.61537 12.219 12.249 12.265 12.300 12.329 0.046 0.040 0.037 0.040 0.042 A 132143
+ 3430.61698 12.090 12.124 12.163 12.232 12.309 0.071 0.043 0.039 0.043 0.050 B 132185
+ 3432.61984 11.793 11.800 11.821 11.828 11.827 0.046 0.040 0.035 0.038 0.043 A 132512
+ 3434.61822 11.923 12.001 12.052 12.116 12.233 0.087 0.049 0.046 0.051 0.059 D 132829
+ 3437.60947 11.504 11.507 11.496 11.496 11.504 0.035 0.035 0.030 0.033 0.034 A 133129
+ 3440.60170 11.465 11.481 11.497 11.517 11.540 0.044 0.035 0.032 0.035 0.037 A 133472
+ 3443.65720 11.737 11.684 11.671 11.672 11.689 0.072 0.044 0.036 0.039 0.043 B 133753
+ 3445.62606 12.218 12.239 12.237 12.216 12.217 0.089 0.049 0.046 0.049 0.056 D 134098
+ 3447.62554 12.180 12.213 12.243 12.248 12.244 0.050 0.039 0.037 0.041 0.046 A 134735
+ 3449.64804 11.895 11.917 11.899 11.894 11.882 0.053 0.039 0.036 0.039 0.048 A 135071
+ 3452.57075 11.854 11.867 11.878 11.884 11.882 0.051 0.037 0.034 0.038 0.046 A 135465
+ 3454.63267 11.508 11.493 11.479 11.463 11.455 0.043 0.036 0.033 0.038 0.045 A 135822
+ 3456.62963 12.253 12.299 12.302 12.278 12.312 0.044 0.036 0.034 0.038 0.045 A 136174
+ 3458.61625 12.083 12.151 12.151 12.143 12.121 0.042 0.036 0.033 0.037 0.042 A 136524
+ 3460.61796 11.736 11.726 11.708 11.690 11.685 0.038 0.035 0.030 0.033 0.038 A 136891
+ 3462.62584 11.967 11.963 11.976 11.984 12.008 0.042 0.038 0.037 0.041 0.047 A 137165
+ 3464.66822 12.295 12.267 12.273 12.265 12.259 0.045 0.038 0.032 0.032 0.034 A 137503
+ 3466.66687 12.051 12.053 12.058 12.046 12.047 0.042 0.034 0.030 0.034 0.040 A 137840
+ 3469.65979 12.139 12.126 12.110 12.102 12.128 0.039 0.033 0.030 0.034 0.039 A 138258
+ 3472.51899 12.016 11.998 12.023 12.039 12.090 0.036 0.037 0.033 0.036 0.042 A 138674
+ 3474.54840 11.516 11.545 11.533 11.532 11.531 0.039 0.036 0.031 0.033 0.039 A 139019
+ 3476.63683 11.711 11.769 11.791 11.829 11.869 0.067 0.047 0.043 0.046 0.052 B 139374
+ 3478.62555 12.249 12.269 12.257 12.229 12.207 0.043 0.036 0.033 0.037 0.044 A 139717
+ 3480.62477 11.919 11.928 11.899 11.905 11.932 0.068 0.041 0.036 0.040 0.046 A 139999
+ 3483.52442 11.756 11.792 11.780 11.763 11.790 0.043 0.039 0.037 0.039 0.044 A 140457
+ 3487.60534 12.234 12.211 12.224 12.236 12.346 0.053 0.055 0.056 0.063 0.071 D 140765
+ 3491.50741 11.481 11.518 11.541 11.547 11.576 0.048 0.038 0.034 0.037 0.043 A 141265
+ 3495.50764 12.186 12.151 12.132 12.113 12.128 0.036 0.036 0.029 0.031 0.033 A 141592
+ 3497.57978 11.966 11.946 11.943 11.945 11.972 0.041 0.033 0.030 0.031 0.033 A 141895
+ 3500.56702 12.033 12.021 12.000 11.993 11.983 0.056 0.051 0.052 0.058 0.065 D 142248
+ 3503.49390 11.949 11.983 11.974 11.970 12.085 0.090 0.050 0.046 0.052 0.057 D 142760
+ 3506.54888 12.134 12.164 12.214 12.225 12.241 0.054 0.044 0.037 0.040 0.044 A 143114
+ 3511.46339 11.694 11.685 11.675 11.662 11.663 0.053 0.038 0.032 0.035 0.042 A 143609
+ 3513.48641 11.866 11.811 11.835 11.821 11.829 0.050 0.044 0.034 0.036 0.040 A 143975
+ 3521.49048 12.164 12.208 12.209 12.212 12.249 0.059 0.084 0.070 0.048 0.042 D 144792
+ 3523.51610 12.139 12.134 12.159 12.171 12.182 0.054 0.041 0.038 0.043 0.050 A 145153
+ 3526.50624 12.196 12.215 12.206 12.200 12.192 0.042 0.037 0.033 0.036 0.040 A 145634
+ 3529.48429 12.252 12.201 12.169 12.124 12.106 0.039 0.036 0.032 0.036 0.041 A 146142
+ 3539.45725 99.999 99.999 99.999 99.999 99.999 0.046 0.038 0.033 0.036 0.038 C 146974
+ 3544.45255 11.720 11.736 11.720 11.709 11.704 0.042 0.038 0.037 0.041 0.047 A 147663
+ 3590.93281 11.455 11.450 11.446 11.424 11.401 0.038 0.035 0.033 0.036 0.042 A 154112
+ 3603.91723 12.201 12.178 12.143 12.118 12.114 0.041 0.039 0.035 0.038 0.045 A 155977
+ 3619.88783 11.930 11.914 11.906 11.902 11.934 0.059 0.042 0.038 0.041 0.046 A 157514
+ 3626.87258 12.243 12.291 12.253 12.225 12.230 0.039 0.037 0.030 0.032 0.036 A 158396
+ 3630.85089 11.626 11.637 11.630 11.616 11.610 0.041 0.038 0.033 0.036 0.042 A 158861
+ 3634.85892 12.278 12.258 12.235 12.225 12.239 0.045 0.036 0.035 0.039 0.046 A 159452
+ 3639.85884 11.974 11.965 11.983 11.980 11.978 0.042 0.036 0.030 0.031 0.036 A 160012
+ 3643.84680 12.284 12.261 12.266 12.264 12.285 0.036 0.035 0.030 0.032 0.037 A 160525
+ 3647.88032 11.778 11.782 11.792 11.800 11.807 0.038 0.038 0.030 0.031 0.035 A 160956
+ 3651.81911 12.176 12.154 12.157 12.148 12.163 0.062 0.044 0.039 0.044 0.049 A 161511
+ 3655.80164 11.514 11.477 11.459 11.454 11.466 0.069 0.046 0.038 0.040 0.046 A 162077
+ 3658.79399 11.423 11.426 11.422 11.407 11.411 0.058 0.041 0.035 0.039 0.044 A 162529
+ 3661.84480 11.761 11.748 11.734 11.709 11.719 0.048 0.040 0.035 0.039 0.045 A 163004
+ 3665.80498 12.213 12.217 12.193 12.164 12.166 0.049 0.042 0.037 0.040 0.046 A 163560
+ 3669.85836 11.493 11.480 11.483 11.480 99.999 0.040 0.038 0.031 0.034 0.039 C 164041
+ 3672.85046 11.584 11.602 11.586 11.575 11.581 0.042 0.037 0.031 0.033 0.038 A 164470
+ 3675.82016 11.692 11.672 11.663 11.667 11.683 0.046 0.038 0.032 0.035 0.039 A 164891
+ 3699.76540 12.267 12.249 12.238 12.205 12.187 0.043 0.035 0.032 0.035 0.042 A 167947
+ 3702.77585 12.300 12.299 12.295 12.283 12.316 0.046 0.037 0.031 0.034 0.039 A 168340
+ 3705.74691 12.284 12.257 12.257 12.272 12.332 0.039 0.035 0.033 0.037 0.043 A 168743
+ 3708.73741 12.302 12.299 12.310 12.289 12.302 0.047 0.038 0.032 0.034 0.040 A 169157
+ 3712.77632 11.815 11.826 11.851 11.871 11.894 0.047 0.037 0.031 0.036 0.041 A 169452
+ 3714.79777 11.398 11.411 11.431 11.459 11.490 0.046 0.037 0.034 0.037 0.044 A 169749
+ 3717.71768 11.478 11.476 11.495 11.491 11.490 0.060 0.041 0.036 0.040 0.046 A 170108
+ 3719.77785 12.278 12.291 12.320 12.332 12.404 0.042 0.036 0.033 0.037 0.044 A 170348
+ 3722.69844 12.331 12.293 12.272 12.265 12.258 0.050 0.039 0.036 0.041 0.048 A 170715
+ 3725.74313 12.238 12.285 12.314 12.336 12.339 0.041 0.036 0.033 0.036 0.042 A 171038
+ 3728.67777 12.342 12.362 12.340 12.288 12.242 0.047 0.039 0.036 0.041 0.047 A 171426
+ 3731.80005 11.540 11.533 11.525 11.527 11.517 0.046 0.041 0.037 0.039 0.046 A 171740
+ 3734.72943 11.451 11.453 11.436 11.422 11.415 0.044 0.040 0.039 0.046 0.056 A 172104
+ 3737.70190 11.517 11.553 11.546 11.546 11.545 0.040 0.036 0.030 0.034 0.039 A 172510
+ 3739.75234 12.234 12.203 12.191 12.194 12.196 0.048 0.037 0.032 0.035 0.041 A 172808
+ 3742.64781 12.334 12.328 12.308 12.320 12.348 0.061 0.040 0.034 0.037 0.042 A 173147
+ 3744.72632 12.345 12.346 12.352 12.328 12.301 0.071 0.041 0.036 0.040 0.047 B 173443
+ 3747.64438 12.205 12.233 12.242 12.232 12.227 0.042 0.037 0.035 0.042 0.051 A 173816
+ 3749.74105 12.006 11.978 11.940 11.931 11.962 0.046 0.038 0.036 0.041 0.049 A 174131
+ 3752.70307 12.048 12.067 12.080 12.102 12.130 0.055 0.040 0.035 0.039 0.046 A 174539
+ 3754.76205 11.818 11.812 11.829 11.831 11.811 0.041 0.037 0.034 0.040 0.049 A 174829
+ 3756.82097 11.463 11.461 11.494 11.508 11.555 0.055 0.044 0.041 0.045 0.052 A 175120
+ 3759.63711 12.307 12.238 12.208 12.201 12.214 0.053 0.041 0.035 0.040 0.046 A 175483
+ 3761.78452 12.264 12.302 12.307 12.302 12.438 0.039 0.035 0.035 0.041 0.048 A 175784
+ 3764.65073 12.302 12.331 12.345 12.372 12.413 0.041 0.038 0.037 0.041 0.046 A 176156
+ 3766.75631 12.228 12.208 12.192 12.169 12.104 0.046 0.045 0.045 0.053 0.064 D 176476
+ 3769.63623 12.076 12.052 12.035 12.030 12.066 0.052 0.040 0.038 0.041 0.046 A 176829
+ 3771.70915 11.853 11.836 11.828 11.837 11.861 0.055 0.043 0.041 0.045 0.052 A 177143
+ 3774.63484 11.798 11.784 11.765 11.733 11.722 0.041 0.037 0.035 0.040 0.048 A 177504
+ 3776.67169 11.577 11.581 11.571 11.561 11.557 0.056 0.041 0.039 0.044 0.052 A 177807
+ 3778.66613 12.144 12.152 12.174 12.160 99.999 0.044 0.040 0.037 0.042 0.049 C 178112
+ 3780.72354 12.120 12.127 12.099 12.053 12.106 0.042 0.037 0.035 0.039 0.046 A 178403
+ 3783.75218 12.268 12.224 12.227 12.220 12.252 0.039 0.035 0.035 0.043 0.050 A 178709
+ 3787.75567 11.443 11.473 11.482 11.481 11.488 0.041 0.037 0.034 0.039 0.048 A 178880
+ 3790.58412 12.318 12.368 12.367 12.359 12.376 0.054 0.043 0.039 0.042 0.047 A 179230
+ 3792.69668 12.340 12.327 12.347 12.358 12.470 0.061 0.043 0.040 0.043 0.050 A 179573
+ 3794.74343 12.125 12.096 12.114 12.134 12.161 0.042 0.036 0.034 0.038 0.045 A 179874
+ 3797.57475 11.961 11.977 11.982 11.982 12.013 0.044 0.041 0.038 0.041 0.047 A 180237
+ 3799.63622 11.654 11.618 11.629 11.652 11.656 0.075 0.044 0.038 0.042 0.049 B 180537
+ 3801.65975 12.332 12.332 12.315 12.300 12.308 0.048 0.038 0.034 0.038 0.044 A 180819
+ 3804.57738 12.294 12.323 12.316 12.295 12.290 0.057 0.044 0.039 0.045 0.053 A 181148
+ 3806.59475 12.255 12.259 12.256 12.237 12.264 0.066 0.044 0.039 0.042 0.049 A 181454
+ 3809.62126 12.218 12.183 12.199 12.204 12.254 0.076 0.046 0.041 0.046 0.055 B 181817
+ 3811.62488 12.032 12.000 11.989 12.024 12.048 0.042 0.035 0.035 0.041 0.049 A 182132
+ 3813.63711 11.569 11.588 11.596 11.588 11.573 0.058 0.047 0.044 0.047 0.054 B 182457
+ 3815.66149 12.251 12.221 12.195 12.162 12.181 0.041 0.034 0.034 0.037 0.044 A 182786
+ 3817.68195 12.206 12.214 12.206 12.181 12.240 0.044 0.036 0.035 0.039 0.046 A 183107
+ 3819.70029 13.006 12.882 12.762 12.675 12.589 0.066 0.042 0.037 0.041 0.047 A 183437
+ 3822.57138 11.742 11.798 11.816 11.822 11.823 0.048 0.039 0.036 0.041 0.050 A 183878
+ 3824.60843 11.370 11.412 11.406 11.402 11.403 0.038 0.036 0.032 0.036 0.043 A 184222
+ 3826.60886 12.299 12.300 12.317 12.338 12.366 0.037 0.037 0.034 0.039 0.047 A 184560
+ 3828.61948 12.090 12.097 12.110 12.130 12.100 0.043 0.038 0.033 0.037 0.044 A 184908
+ 3831.52571 12.061 12.073 12.093 12.114 12.127 0.037 0.034 0.031 0.034 0.040 A 185379
+ 3833.55683 11.605 11.590 11.582 11.585 11.607 0.050 0.040 0.039 0.044 0.052 A 185742
+ 3835.57214 12.441 12.366 12.281 12.203 12.156 0.043 0.038 0.037 0.043 0.053 A 186099
+ 3837.58373 12.282 12.246 12.215 12.176 12.133 0.039 0.035 0.033 0.039 0.046 A 186437
+ 3847.56069 11.656 11.667 11.681 11.718 11.761 0.055 0.044 0.040 0.045 0.052 A 186741
+ 3849.61176 12.053 12.033 12.041 12.066 12.122 0.047 0.038 0.035 0.039 0.045 A 187084
+ 3851.60976 12.299 12.293 12.316 12.356 12.397 0.060 0.039 0.035 0.039 0.046 A 187429
+ 3854.50381 12.265 12.203 12.171 12.146 12.125 0.058 0.041 0.036 0.039 0.044 A 187924
+ 3856.57790 11.926 11.917 11.911 11.893 11.902 0.040 0.033 0.031 0.035 0.043 A 188216
+ 3861.54712 11.600 11.566 11.579 11.592 11.606 0.043 0.035 0.032 0.035 0.041 A 188984
+ 3863.54879 12.322 12.315 12.327 12.339 12.335 0.045 0.036 0.032 0.035 0.042 A 189328
+ 3865.56216 12.179 12.198 12.197 12.162 12.139 0.044 0.037 0.033 0.036 0.042 A 189684
+ 3868.51707 12.121 12.079 12.067 12.082 12.086 0.046 0.035 0.034 0.039 0.046 A 190154
+ 3870.51961 11.845 11.870 11.885 11.899 11.943 0.045 0.038 0.032 0.037 0.043 A 190515
+ 3872.53685 11.388 11.382 11.365 11.347 11.358 0.043 0.034 0.032 0.036 0.042 A 190895
+ 3876.53787 12.055 12.078 12.071 12.029 11.982 0.042 0.035 0.032 0.035 0.040 A 191306
+ 3883.49466 12.284 12.340 12.334 12.326 12.324 0.039 0.034 0.031 0.034 0.041 A 192213
+ 3887.49633 11.853 11.874 11.950 11.999 12.024 0.054 0.044 0.038 0.042 0.048 A 192609
+ 3890.49067 11.978 11.984 11.979 11.984 11.991 0.041 0.035 0.031 0.034 0.039 A 193128
+ 3892.50543 11.532 11.557 11.550 11.525 11.498 0.058 0.053 0.052 0.055 0.061 D 193481
+ 3897.45263 12.348 12.297 12.284 12.275 12.284 0.060 0.039 0.036 0.041 0.048 A 194142
+ 3900.45532 12.179 12.162 12.146 12.127 12.138 0.038 0.035 0.034 0.039 0.046 A 194599
+ 3903.45224 11.646 11.659 11.645 11.618 11.622 0.042 0.038 0.036 0.042 0.050 A 195158
+ 3906.45263 11.337 11.350 11.349 11.351 11.361 0.053 0.039 0.036 0.041 0.048 A 195728
+ 3983.87812 11.401 11.400 11.398 11.395 11.402 0.060 0.044 0.040 0.045 0.050 A 203692
+ 4090.70346 11.517 11.607 11.642 11.662 11.691 0.083 0.050 0.042 0.045 0.048 D 209274
+ 4104.71858 11.512 11.506 11.508 11.502 11.538 0.055 0.042 0.037 0.041 0.046 A 210726
+ 4106.77409 12.274 12.263 12.280 12.308 12.393 0.046 0.036 0.033 0.036 0.041 A 211006
+ 4111.69576 12.042 12.105 12.128 12.143 12.146 0.057 0.040 0.035 0.035 0.036 A 211405
+ 4126.72157 12.306 12.286 12.256 12.264 12.302 0.049 0.040 0.032 0.034 0.035 A 211695
+ 4128.75652 12.383 12.300 12.287 12.281 12.321 0.062 0.041 0.035 0.037 0.038 A 211973
+ 4133.57306 11.562 11.531 11.513 11.498 11.482 0.053 0.040 0.035 0.038 0.040 A 212562
+ 4135.62478 12.187 12.181 12.170 12.163 12.134 0.046 0.040 0.035 0.037 0.040 A 212850
+ 4137.63520 12.233 12.255 12.267 12.277 12.279 0.048 0.038 0.032 0.034 0.037 A 213129
+ 4139.64923 11.995 11.988 11.970 11.959 11.991 0.043 0.036 0.031 0.033 0.036 A 213433
+ 4141.66620 11.440 11.481 11.492 11.491 11.502 0.050 0.038 0.034 0.036 0.037 A 213718
+ 4143.68186 12.499 12.487 12.461 12.426 12.399 0.050 0.039 0.034 0.036 0.039 A 214014
+ 4145.75672 12.189 12.270 12.274 12.288 12.303 0.079 0.045 0.036 0.038 0.041 B 214303
+ 4149.65335 12.074 12.040 12.064 12.134 12.215 0.057 0.041 0.038 0.042 0.048 A 214662
+ 4151.65957 12.258 12.287 12.258 12.284 12.310 0.047 0.037 0.033 0.034 0.035 A 214970
+ 4153.66582 12.079 12.052 12.033 12.035 12.051 0.084 0.049 0.043 0.043 0.045 D 215286
+ 4157.73163 12.292 12.299 12.279 12.263 12.246 0.045 0.039 0.037 0.041 0.044 A 215869
+ 4159.71084 12.110 12.221 12.231 12.234 12.292 0.075 0.044 0.037 0.039 0.042 B 216171
+ 4161.69422 11.858 11.847 11.857 11.885 11.951 0.065 0.048 0.040 0.041 0.044 B 216484
+ 4163.70414 11.459 11.462 11.475 11.493 11.521 0.061 0.042 0.038 0.040 0.042 A 216781
+ 4165.74221 12.274 12.286 12.258 12.242 12.248 0.079 0.045 0.040 0.042 0.047 B 217075
+ 4168.73650 12.240 12.290 12.283 12.247 12.214 0.040 0.035 0.031 0.034 0.036 A 217479
+ 4173.71633 12.233 12.188 12.161 12.144 12.148 0.058 0.040 0.035 0.038 0.040 A 218098
+ 4176.54004 12.099 12.116 12.117 12.146 12.218 0.053 0.042 0.039 0.043 0.046 A 218491
+ 4179.61808 12.238 12.202 12.179 12.150 12.114 0.056 0.048 0.042 0.043 0.048 B 218831
+ 4181.64178 11.950 11.921 11.898 11.923 11.990 0.046 0.045 0.044 0.048 0.053 B 219114
+ 4183.65621 11.428 11.468 11.471 11.467 11.459 0.039 0.039 0.035 0.037 0.039 A 219413
+ 4185.65146 12.324 12.280 12.274 12.276 12.238 0.051 0.040 0.032 0.035 0.037 A 219697
+ 4189.60729 11.599 11.575 11.589 11.586 11.596 0.044 0.038 0.031 0.034 0.037 A 220086
+ 4191.62967 12.302 12.310 12.252 12.184 12.202 0.056 0.041 0.037 0.042 0.047 A 220407
+ 4193.62976 12.162 12.169 12.139 12.113 99.999 0.046 0.040 0.034 0.036 0.041 C 220732
+ 4196.64040 12.166 12.169 12.142 12.144 12.264 0.048 0.045 0.043 0.049 0.056 B 221048
+ 4202.55539 12.222 12.156 12.172 12.200 12.247 0.070 0.051 0.044 0.045 0.047 B 221621
+ 4205.53017 12.217 12.222 12.220 12.242 12.258 0.065 0.045 0.039 0.041 0.042 A 222074
+ 4213.54926 12.129 12.172 12.173 12.145 12.101 0.060 0.045 0.041 0.043 0.045 A 222554
+ 4216.59979 12.305 12.278 12.234 12.188 12.162 0.048 0.040 0.033 0.035 0.037 A 222854
+ 4226.57288 11.868 11.889 11.929 11.948 12.004 0.054 0.055 0.057 0.067 0.077 D 222988
+ 4228.58706 11.292 11.353 11.358 11.377 11.392 0.044 0.039 0.032 0.032 0.035 A 223327
+ 4231.47468 12.050 12.083 12.093 12.117 12.126 0.051 0.042 0.039 0.041 0.042 A 223816
+ 4233.50048 12.274 12.228 12.224 12.224 12.248 0.037 0.034 0.029 0.030 0.032 A 224170
+ 4235.50343 12.005 12.134 12.107 12.119 12.169 0.049 0.060 0.039 0.037 0.039 D 224539
+ 4237.55209 11.622 11.616 11.605 11.590 11.618 0.045 0.044 0.041 0.047 0.052 A 224849
+ 4247.50921 12.277 12.250 12.262 12.279 12.344 0.035 0.034 0.029 0.031 0.034 A 226360
+ 4250.51565 12.198 12.243 12.239 12.193 12.182 0.040 0.037 0.032 0.035 0.037 A 226635
+ 4256.45408 99.999 99.999 99.999 99.999 99.999 0.035 0.033 0.028 0.030 0.033 C 227187
+ 4258.46474 12.112 12.073 12.050 12.027 11.978 0.039 0.041 0.037 0.040 0.044 A 227459
+ 4310.93912 12.306 12.346 12.395 12.437 12.438 0.039 0.037 0.032 0.035 0.040 A 234001
+ 4331.92653 11.725 11.729 11.749 11.764 11.797 0.043 0.036 0.031 0.032 0.035 A 235598
+ 4339.89689 11.434 11.457 11.427 11.442 11.471 0.055 0.055 0.054 0.057 0.061 D 236678
+ 4343.86999 11.954 12.004 12.013 12.005 11.985 0.064 0.043 0.037 0.039 0.042 A 237358
+ 4347.88972 12.164 12.187 12.189 12.173 12.202 0.065 0.043 0.035 0.037 0.040 A 238046
+ 4351.87945 99.999 99.999 99.999 99.999 99.999 0.053 0.049 0.047 0.055 0.063 D 238681
+ 4355.86824 12.301 12.308 12.323 12.343 12.355 0.043 0.037 0.030 0.032 0.035 A 239254
+ 4363.84422 12.073 12.034 11.977 11.912 11.876 0.041 0.037 0.032 0.034 0.038 A 240410
+ 4366.88541 12.249 12.277 12.291 12.313 12.349 0.040 0.039 0.032 0.035 0.036 A 240773
+ 4373.84055 11.314 11.384 11.378 11.358 11.358 0.059 0.041 0.035 0.037 0.039 A 241835
+ 4377.83583 12.091 12.103 12.088 12.070 12.083 0.050 0.039 0.035 0.039 0.044 A 242327
+ 4381.81648 12.337 12.328 12.351 12.379 12.447 0.038 0.039 0.037 0.041 0.045 A 242934
+ 4384.82892 11.989 11.989 12.006 12.018 12.044 0.041 0.040 0.035 0.039 0.042 A 243396
+ 4387.83716 11.338 11.369 11.362 11.358 11.365 0.039 0.037 0.031 0.033 0.036 A 243877
+ 4400.79718 12.166 12.127 12.095 12.071 12.054 0.054 0.048 0.044 0.051 0.058 B 245023
+ 4404.78047 11.380 11.379 11.387 11.385 11.390 0.033 0.036 0.029 0.032 0.035 A 245392
+ 4408.77140 12.026 12.096 12.082 12.079 12.103 0.045 0.038 0.034 0.037 0.040 A 245767
+ 4411.82563 12.226 12.212 12.229 12.260 12.341 0.037 0.039 0.036 0.038 0.040 A 246153
+ 4418.85618 11.487 11.476 11.489 11.492 11.495 0.039 0.036 0.031 0.033 0.036 A 246374
+ 4422.75765 11.986 12.018 12.048 12.054 12.077 0.043 0.037 0.032 0.035 0.038 A 246687
+ 4426.77900 12.911 12.816 12.934 13.223 13.481 0.051 0.042 0.039 0.046 0.052 A 246986
+ 4429.75407 12.322 12.333 12.317 12.311 12.340 0.043 0.039 0.034 0.037 0.041 A 247340
+ 4432.74397 12.028 12.043 12.035 11.998 11.992 0.039 0.037 0.030 0.031 0.033 A 247703
+ 4435.73693 11.474 11.465 11.491 11.490 11.506 0.039 0.034 0.029 0.031 0.033 A 248062
+ 4438.72510 11.416 11.387 11.374 11.381 11.393 0.041 0.038 0.034 0.035 0.039 A 248434
+ 4441.72410 11.545 11.519 11.520 11.536 11.559 0.055 0.054 0.049 0.048 0.048 B 248809
+ 4453.68384 11.902 11.887 11.899 11.904 11.903 0.051 0.039 0.032 0.035 0.038 A 250139
+ 4455.78578 11.682 11.682 11.691 11.713 11.724 0.042 0.036 0.032 0.035 0.038 A 250388
+ 4458.68413 11.531 11.537 11.514 11.471 11.427 0.043 0.040 0.036 0.040 0.044 A 250713
+ 4460.79946 11.486 11.500 11.505 11.535 11.576 0.055 0.046 0.038 0.041 0.044 A 250954
+ 4463.66284 12.346 12.356 12.375 12.392 12.426 0.037 0.036 0.030 0.032 0.034 A 251316
+ 4465.72448 12.172 12.184 12.180 12.185 12.240 0.046 0.042 0.040 0.043 0.049 A 251555
+ 4468.69833 12.299 12.269 12.248 12.241 12.260 0.045 0.042 0.038 0.041 0.044 A 251884
+ 4474.70882 12.289 12.318 12.316 12.308 12.429 0.048 0.041 0.038 0.042 0.045 A 252490
+ 4477.70166 12.182 12.212 12.237 12.254 12.262 0.041 0.037 0.032 0.034 0.037 A 252789
+ 4479.78911 12.231 12.240 12.237 12.267 12.367 0.056 0.045 0.040 0.043 0.045 A 253066
+ 4482.73585 12.283 12.297 12.297 12.296 12.357 0.058 0.050 0.057 0.068 0.073 D 253349
+ 4485.72261 12.279 12.270 12.303 12.367 12.458 0.059 0.041 0.036 0.038 0.041 A 253619
+ 4487.74815 11.984 12.094 12.131 12.149 12.118 0.067 0.048 0.036 0.037 0.040 B 253862
+ 4489.80775 11.973 11.923 11.873 11.831 11.830 0.045 0.044 0.040 0.046 0.052 A 254120
+ 4492.61070 11.561 11.568 11.590 11.596 11.609 0.044 0.039 0.033 0.035 0.037 A 254390
+ 4494.64490 12.290 12.262 12.271 12.264 12.287 0.035 0.035 0.031 0.033 0.035 A 254649
+ 4497.77310 11.576 11.592 11.590 11.588 11.607 0.052 0.043 0.034 0.036 0.038 A 254801
+ 4502.74040 12.256 12.307 12.304 12.288 12.289 0.057 0.043 0.037 0.039 0.041 A 255452
+ 4505.59573 12.343 12.327 12.265 12.201 12.177 0.040 0.039 0.035 0.038 0.040 A 255837
+ 4507.65296 12.135 12.123 12.117 12.109 12.139 0.042 0.039 0.037 0.043 0.047 A 256146
+ 4509.73308 11.999 11.988 11.986 11.996 11.986 0.044 0.039 0.033 0.037 0.041 A 256453
+ 4511.80601 11.689 11.634 11.606 11.584 11.602 0.040 0.035 0.032 0.033 0.036 A 256735
+ 4515.64542 11.850 11.892 11.986 12.049 12.007 0.059 0.058 0.062 0.075 0.086 D 257018
+ 4517.70707 11.637 11.662 11.662 11.656 11.649 0.042 0.038 0.033 0.037 0.041 A 257287
+ 4519.73284 12.238 12.223 12.207 12.159 12.145 0.040 0.037 0.034 0.038 0.042 A 257603
+ 4521.74687 12.294 12.264 12.247 12.239 12.269 0.039 0.037 0.034 0.038 0.042 A 257882
+ 4523.78169 12.082 12.113 12.113 12.117 12.141 0.041 0.037 0.031 0.033 0.036 A 258202
+ 4526.57915 11.688 11.718 11.762 11.786 11.828 0.045 0.041 0.039 0.042 0.047 A 258559
+ 4528.62224 11.535 11.565 11.577 11.577 11.589 0.040 0.040 0.037 0.040 0.043 A 258877
+ 4530.68876 12.334 12.387 12.399 12.386 12.369 0.046 0.038 0.034 0.037 0.040 A 259201
+ 4533.58822 12.279 12.310 12.334 12.337 12.360 0.040 0.038 0.033 0.036 0.038 A 259609
+ 4536.64679 12.266 12.287 12.253 12.235 12.247 0.036 0.037 0.033 0.036 0.040 A 259934
+ 4538.68419 12.266 12.288 12.290 12.308 12.379 0.035 0.033 0.030 0.032 0.035 A 260243
+ 4541.53698 12.130 12.139 99.999 99.999 99.999 0.038 0.036 0.031 0.033 0.035 C 260636
+ 4543.56167 11.751 11.756 11.775 11.800 11.833 0.036 0.036 0.033 0.036 0.040 A 260957
+ 4547.60303 12.292 12.324 12.308 12.306 12.395 0.039 0.037 0.036 0.040 0.045 A 261593
+ 4552.58124 12.082 12.067 12.051 12.071 12.111 0.044 0.037 0.031 0.033 0.035 A 262230
+ 4554.60312 11.700 11.702 11.729 11.751 11.756 0.040 0.039 0.035 0.037 0.041 A 262529
+ 4556.61633 11.722 11.675 11.651 11.628 11.613 0.043 0.041 0.038 0.041 0.045 A 262847
+ 4558.62531 12.312 12.291 12.275 12.261 12.295 0.049 0.038 0.032 0.034 0.037 A 263190
+ 4560.63127 12.031 12.040 12.029 12.019 12.034 0.039 0.036 0.031 0.032 0.036 A 263522
+ 4562.66290 11.529 11.535 11.544 11.531 11.579 0.052 0.041 0.035 0.038 0.041 A 263870
+ 4565.51683 11.314 11.370 11.365 11.350 11.348 0.043 0.038 0.034 0.036 0.040 A 264323
+ 4567.55382 12.193 12.212 12.214 12.215 12.232 0.049 0.039 0.036 0.038 0.040 A 264667
+ 4569.57759 12.207 12.229 12.260 12.349 12.419 0.042 0.040 0.034 0.036 0.039 A 264980
+ 4571.59498 11.874 11.897 11.849 11.822 11.831 0.038 0.037 0.032 0.036 0.039 A 265323
+ 4573.61953 11.308 11.347 11.372 11.409 11.437 0.045 0.038 0.035 0.039 0.044 A 265677
+ 4576.51282 11.929 11.918 11.912 11.940 12.000 0.041 0.039 0.037 0.040 0.043 A 266111
+ 4580.51943 11.970 11.995 11.996 11.994 12.004 0.048 0.043 0.038 0.039 0.042 A 266521
+ 4583.57689 12.109 12.127 12.135 12.149 12.202 0.045 0.038 0.032 0.034 0.038 A 266763
+ 4586.60635 12.257 12.302 12.289 12.274 12.270 0.040 0.041 0.035 0.037 0.041 A 267105
+ 4589.54849 12.368 12.371 12.355 12.343 12.359 0.048 0.044 0.040 0.042 0.045 A 267576
+ 4592.50959 12.308 12.363 12.373 12.408 12.488 0.040 0.040 0.037 0.038 0.040 A 268086
+ 4594.56131 12.056 12.074 12.070 12.050 12.036 0.038 0.036 0.031 0.034 0.037 A 268455
+ 4596.56436 11.540 11.544 11.536 11.537 11.564 0.039 0.037 0.033 0.034 0.036 A 268825
+ 4599.49655 11.548 11.531 11.522 11.516 11.525 0.042 0.040 0.036 0.038 0.041 A 269165
+ 4601.54449 12.254 12.281 12.309 12.298 12.185 0.038 0.036 0.031 0.035 0.038 A 269535
+ 4606.46993 12.293 12.296 12.349 12.373 12.317 0.052 0.043 0.040 0.043 0.048 A 269964
+ 4608.51913 12.035 12.020 11.995 11.998 12.012 0.043 0.037 0.032 0.036 0.040 A 270285
+ 4611.51064 12.028 12.077 12.078 12.080 12.118 0.044 0.039 0.034 0.035 0.038 A 270725
+ 4616.48834 11.653 11.669 11.696 11.689 11.725 0.044 0.042 0.037 0.039 0.043 A 271124
+ 4620.48168 12.210 12.168 12.121 12.051 12.049 0.037 0.037 0.033 0.034 0.036 A 271601
+ 4623.47784 12.166 12.250 12.196 12.188 12.237 0.044 0.038 0.033 0.036 0.038 A 272016
+ 4626.47619 12.208 12.245 12.283 12.293 12.298 0.041 0.040 0.034 0.036 0.039 A 272477
+ 4629.48306 12.132 12.154 12.128 12.096 12.159 0.050 0.048 0.045 0.049 0.053 B 273016
+ 4632.47460 12.341 12.303 12.302 12.299 12.320 0.038 0.037 0.034 0.038 0.042 A 273531
+ 4641.45414 11.464 11.453 11.472 11.483 11.495 0.042 0.039 0.036 0.040 0.044 A 274298
+ 4683.93270 12.221 12.228 12.235 12.237 12.256 0.044 0.034 0.030 0.039 0.035 A 280628
+ 4691.92779 12.112 12.106 12.089 12.090 12.084 0.039 0.034 0.029 0.031 0.035 A 281956
+ 4696.92853 11.896 11.903 11.904 11.906 11.884 0.045 0.041 0.035 0.038 0.043 A 282354
+ 4700.90103 12.374 12.320 12.307 12.311 12.330 0.055 0.038 0.033 0.036 0.038 A 283062
+ 4704.89802 11.467 11.480 11.499 11.520 11.527 0.055 0.043 0.031 0.033 0.036 A 283746
+ 4708.90978 12.100 12.122 12.114 12.105 12.141 0.050 0.038 0.032 0.034 0.036 A 284282
+ 4717.90506 12.248 12.270 12.260 12.236 12.210 0.049 0.048 0.050 0.057 0.066 D 284971
+ 4721.88423 11.572 11.576 11.584 11.596 11.598 0.041 0.039 0.034 0.037 0.039 A 285344
+ 4726.85806 12.347 12.357 12.362 12.349 12.364 0.046 0.038 0.032 0.035 0.038 A 285967
+ 4729.88625 11.620 11.564 11.559 11.584 11.614 0.060 0.043 0.037 0.038 0.041 A 286393
+ 4734.87756 12.279 12.264 12.222 12.219 12.222 0.065 0.046 0.041 0.041 0.045 A 287000
+ 4741.83564 11.638 11.690 99.999 99.999 99.999 0.049 0.038 0.032 0.032 0.035 C 287654
+ 4749.83667 11.406 11.414 11.434 11.434 11.436 0.039 0.040 0.037 0.040 0.043 A 288609
+ 4752.84152 11.540 11.559 11.547 11.546 11.554 0.036 0.035 0.030 0.032 0.035 A 289001
+ 4756.80982 12.182 12.134 12.089 12.058 12.026 0.045 0.035 0.030 0.033 0.037 A 289563
+ 4759.82950 12.168 12.180 12.163 12.149 12.162 0.036 0.033 0.030 0.031 0.034 A 289969
+ 4762.86031 12.292 12.269 12.266 12.283 12.293 0.038 0.035 0.029 0.031 0.034 A 290392
+ 4765.83828 12.228 12.222 12.229 12.227 12.301 0.036 0.033 0.029 0.033 0.036 A 290798
+ 4768.82565 12.305 12.292 12.303 12.310 12.323 0.038 0.034 0.029 0.031 0.034 A 291216
+ 4771.80801 12.338 12.371 12.376 12.384 12.397 0.078 0.059 0.036 0.037 0.038 D 291628
+ 4774.84039 11.608 11.628 11.657 11.686 11.699 0.041 0.038 0.034 0.037 0.040 A 292032
+ 4778.76476 11.857 11.894 11.901 11.896 11.911 0.044 0.037 0.031 0.032 0.035 A 292532
+ 4782.80513 12.085 12.081 12.043 12.041 11.993 0.042 0.036 0.034 0.038 0.043 A 292945
+ 4786.79384 11.713 11.691 11.693 11.708 11.723 0.039 0.035 0.030 0.031 0.034 A 293396
+ 4792.76807 11.822 11.825 11.833 11.842 11.838 0.070 0.044 0.037 0.039 0.041 B 294091
+ 4795.75320 11.909 11.945 11.974 11.991 12.013 0.053 0.036 0.033 0.035 0.037 A 294439
+ 4798.75358 12.052 12.060 12.054 12.043 12.029 0.037 0.035 0.030 0.033 0.034 A 294754
+ 4801.74388 12.076 12.062 12.039 12.030 12.028 0.041 0.037 0.032 0.034 0.036 A 295128
+ 4804.73553 12.182 12.181 12.193 12.193 12.183 0.039 0.036 0.033 0.035 0.038 A 295495
+ 4807.71327 12.171 12.209 12.174 12.156 12.129 0.039 0.036 0.031 0.034 0.037 A 295900
+ 4809.78155 11.946 11.975 11.964 11.965 11.982 0.041 0.041 0.037 0.040 0.041 A 296189
+ 4812.76929 12.131 12.219 12.250 12.313 12.380 0.055 0.052 0.054 0.063 0.075 D 296467
+ 4815.70916 11.998 12.018 12.016 12.018 12.015 0.043 0.037 0.032 0.034 0.038 A 296823
+ 4818.75582 12.130 12.141 12.127 12.122 12.166 0.037 0.037 0.032 0.035 0.039 A 297128
+ 4821.68864 12.121 12.111 12.078 12.066 12.082 0.047 0.038 0.037 0.043 0.048 A 297494
+ 4824.68636 12.198 12.258 12.230 12.165 12.131 0.044 0.039 0.037 0.044 0.051 A 297896
+ 4827.72109 12.257 12.262 12.244 12.218 12.232 0.040 0.039 0.036 0.038 0.041 A 298275
+ 4830.66519 12.288 12.339 12.380 12.401 12.434 0.063 0.049 0.044 0.045 0.045 B 298656
+ 4835.66620 12.008 11.959 11.886 11.852 11.857 0.046 0.054 0.058 0.069 0.073 D 299264
+ 4837.74083 12.038 12.013 11.994 11.951 11.919 0.047 0.042 0.039 0.042 0.044 A 299546
+ 4840.63640 11.828 11.830 11.799 11.787 11.818 0.045 0.038 0.035 0.038 0.042 A 299893
+ 4842.73889 11.480 11.462 11.496 11.518 11.536 0.041 0.038 0.037 0.042 0.048 A 300146
+ 4845.72824 11.542 11.554 11.592 11.623 11.644 0.050 0.044 0.043 0.048 0.055 B 300457
+ 4847.78874 12.109 12.131 12.140 12.152 12.125 0.043 0.037 0.032 0.033 0.037 A 300724
+ 4850.66542 12.275 12.252 12.284 12.344 12.421 0.041 0.040 0.040 0.044 0.049 A 301077
+ 4853.66107 12.295 12.239 12.221 12.225 12.224 0.035 0.035 0.032 0.034 0.038 A 301433
+ 4856.66060 11.687 11.723 11.727 11.735 11.756 0.042 0.041 0.038 0.040 0.042 A 301687
+ 4859.66929 11.426 11.419 11.413 11.409 11.403 0.051 0.037 0.035 0.039 0.042 A 301995
+ 4862.67530 11.565 11.591 11.612 11.590 11.588 0.042 0.039 0.036 0.038 0.040 A 302315
+ 4865.62486 11.625 11.638 11.661 11.655 11.685 0.074 0.052 0.046 0.049 0.053 B 302662
+ 4867.80593 11.484 11.541 11.557 11.579 11.599 0.051 0.050 0.044 0.046 0.045 B 302935
+ 4870.63570 12.160 12.153 12.122 12.109 12.118 0.042 0.038 0.034 0.036 0.039 A 303249
+ 4872.68089 12.320 12.334 12.405 12.476 12.478 0.048 0.043 0.040 0.044 0.048 A 303549
+ 4875.64329 12.224 12.258 12.294 12.285 12.227 0.043 0.044 0.046 0.055 0.064 D 303837
+ 4877.67498 12.050 12.004 12.003 11.986 11.973 0.043 0.038 0.034 0.037 0.040 A 304128
+ 4879.79975 11.899 11.956 11.923 11.861 11.850 0.055 0.041 0.037 0.039 0.040 A 304319
+ 4882.59367 11.608 11.615 11.624 11.626 11.636 0.053 0.045 0.043 0.046 0.050 B 304657
+ 4884.69757 11.345 11.396 11.410 11.419 11.432 0.054 0.041 0.037 0.040 0.045 A 304943
+ 4887.68946 11.360 11.319 11.289 11.332 11.335 0.071 0.065 0.066 0.079 0.095 D 305291
+ 4890.63010 11.466 11.477 11.479 11.463 11.449 0.061 0.056 0.056 0.061 0.065 D 305626
+ 4892.72178 12.375 12.318 12.302 12.307 12.321 0.062 0.049 0.046 0.051 0.055 B 305915
+ 4902.61098 11.859 11.825 11.886 11.918 11.940 0.060 0.049 0.047 0.052 0.057 B 306907
+ 4905.62796 11.940 11.984 11.996 11.992 12.035 0.058 0.049 0.047 0.051 0.057 B 307355
+ 4907.67631 11.595 11.663 11.705 11.694 11.723 0.080 0.057 0.053 0.057 0.063 D 307660
+ 4911.62042 12.117 12.095 12.056 11.986 11.955 0.062 0.065 0.072 0.069 0.080 D 308070
+ 4915.62335 11.741 11.740 11.745 11.746 11.857 0.073 0.079 0.090 0.101 0.113 D 308286
+ 4917.65531 12.181 12.183 12.183 12.170 12.169 0.053 0.048 0.047 0.052 0.060 B 308580
+ 4920.60404 12.180 12.193 12.189 12.163 12.181 0.059 0.048 0.044 0.049 0.053 B 308994
+ 4925.51797 11.934 11.986 11.967 11.960 11.999 0.050 0.051 0.051 0.057 0.066 D 309321
+ 4929.52096 12.362 12.384 12.468 12.541 12.630 0.054 0.049 0.048 0.054 0.062 D 309644
+ 4932.54841 12.140 12.210 12.240 12.244 12.263 0.051 0.053 0.053 0.061 0.069 D 310052
+ 4934.59346 12.242 12.234 12.206 12.161 12.166 0.048 0.049 0.050 0.058 0.066 D 310383
+ 4936.63929 12.139 12.031 11.964 11.911 11.920 0.056 0.050 0.051 0.058 0.064 D 310689
+ 4939.53859 12.127 12.139 12.087 12.005 12.033 0.068 0.064 0.068 0.075 0.081 D 311127
+ 4945.52548 12.096 12.146 12.213 12.287 12.446 0.057 0.054 0.055 0.063 0.071 D 312016
+ 4947.55444 11.905 11.956 12.014 12.065 12.129 0.048 0.047 0.049 0.057 0.063 D 312362
+ 4949.58804 11.482 11.419 11.405 11.382 11.413 0.052 0.050 0.053 0.061 0.069 D 312711
+ 4952.53863 11.468 11.477 11.510 11.540 11.549 0.048 0.052 0.054 0.061 0.069 D 313136
+ 4954.55337 12.174 12.212 12.265 12.306 12.356 0.046 0.046 0.046 0.054 0.060 B 313482
+ 4959.55024 12.301 12.223 12.196 12.206 12.292 0.082 0.061 0.060 0.068 0.078 D 313763
+ 4962.52947 12.204 12.238 12.227 12.190 12.223 0.045 0.045 0.044 0.049 0.057 B 314093
+ 4965.50610 12.187 12.254 12.234 12.185 12.217 0.058 0.054 0.054 0.060 0.065 D 314486
+ 4968.50404 12.166 12.162 12.184 12.190 12.178 0.051 0.055 0.059 0.070 0.081 D 314973
+ 4972.50835 11.626 11.661 11.716 11.764 11.799 0.049 0.050 0.052 0.061 0.067 D 315412
+ 4975.49687 11.685 11.685 11.748 11.799 11.814 0.055 0.057 0.065 0.077 0.089 D 315893
+ 4984.49871 11.986 11.952 11.931 11.904 11.908 0.061 0.059 0.066 0.079 0.092 D 316222
+ 4987.48848 29.999 29.999 29.999 29.999 29.999 0.087 0.093 0.108 0.130 0.157 D 316738
+ 4994.47908 11.962 11.960 11.916 11.875 11.862 0.057 0.057 0.057 0.064 0.071 D 317640
+ 5049.93527 11.809 11.837 11.875 11.903 11.943 0.057 0.053 0.051 0.056 0.064 D 323333
+ 5069.91279 12.116 12.016 11.986 11.967 11.982 0.082 0.057 0.055 0.058 0.062 D 324835
+ 5082.90586 12.088 12.114 12.129 12.117 12.096 0.052 0.050 0.045 0.050 0.056 B 325997
+ 5086.87177 11.944 11.912 11.894 11.878 11.871 0.050 0.047 0.042 0.046 0.051 A 326589
+ 5098.88785 12.248 12.212 12.179 12.133 12.142 0.048 0.044 0.041 0.046 0.053 A 328055
+ 5105.87605 11.520 11.511 11.554 11.582 11.614 0.065 0.065 0.065 0.069 0.077 D 328693
+ 5118.81723 12.119 12.136 12.194 12.223 12.258 0.081 0.068 0.063 0.062 0.066 D 330346
+ 5123.83111 12.032 12.054 12.072 12.060 12.071 0.049 0.047 0.047 0.051 0.055 B 330804
+ 5128.84484 11.788 11.843 11.841 11.812 11.798 0.055 0.053 0.051 0.054 0.057 D 331391
+ 5131.82450 11.830 11.858 11.863 11.879 11.947 0.056 0.048 0.043 0.046 0.050 B 331799
+ 5136.84775 11.505 11.478 11.515 11.528 11.560 0.054 0.057 0.059 0.067 0.077 D 332140
+ 5154.83688 12.223 12.232 12.243 12.251 12.302 0.048 0.047 0.044 0.047 0.050 B 333419
+ 5158.74645 12.400 12.480 12.479 12.401 12.427 0.085 0.060 0.058 0.062 0.067 D 333842
+ 5162.78817 11.888 11.871 11.860 11.871 11.879 0.047 0.046 0.045 0.048 0.052 B 334245
+ 5165.75062 11.920 11.923 11.906 11.904 11.864 0.048 0.045 0.042 0.048 0.055 A 334609
+ 5168.73891 12.017 11.981 11.976 11.925 11.885 0.052 0.049 0.048 0.055 0.062 D 334955
diff --git a/homework/LiamNolan/08_final/final.ipynb b/homework/LiamNolan/08_final/final.ipynb
new file mode 100644
index 0000000..1ef0f3e
--- /dev/null
+++ b/homework/LiamNolan/08_final/final.ipynb
@@ -0,0 +1,26641 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "41a1e6d8",
+ "metadata": {},
+ "source": [
+ "# ASTR 596: The Final Countdown\n",
+ "\n",
+ "#### Three questions, each worth a third of your grade. (I'll make one 34 pts to get to an even 100). Each is designed to test an area where I think the class as a whole is less comfortable. They are sorted by my assesment of difficulty from easiest to hardest. \n",
+ "#### i.e. the last is probably going to be non-trivial, because well I like Gaussian distributions of grades. \n",
+ "#### That's OK because the points and grades don't matter!\n",
+ "\n",
+ "#### Remember, you can work together, discuss problems and solutions, but you have to write up your own solution. I'd strongly suggest doing that, ideally with some divide and conquer strategy."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "38560536",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib notebook\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "from astroquery.sdss import SDSS # enables direct queries to the SDSS database\n",
+ "import seaborn as sb\n",
+ "import scipy.stats as st\n",
+ "from scipy.signal import find_peaks, find_peaks_cwt\n",
+ "from sklearn.cluster import KMeans\n",
+ "from sklearn.preprocessing import StandardScaler\n",
+ "from astropy.table import Table\n",
+ "from astropy.io import ascii\n",
+ "from astropy.timeseries import LombScargle, TimeSeries, BoxLeastSquares\n",
+ "from astropy.time import Time\n",
+ "import astropy.units as u\n",
+ "import george\n",
+ "from george import kernels\n",
+ "from george.modeling import Model\n",
+ "import emcee\n",
+ "import corner\n",
+ "import pymc as pm"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "79307740",
+ "metadata": {},
+ "source": [
+ "### Q1. Using unsupervised learning to work with galaxies\n",
+ "\n",
+ "The following query will select 20k likely galaxies from the SDSS database and return the results of that query into an `astropy Table`. (For now, if you are not familiar with the SDSS DB schema, don't worry about this query, just know that it returns a bunch of photometric features.)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "514b12be",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Table length=20000\n",
+ "
\n",
+ "| ug | gr | gi | gz | petroRad_i | petroR50_i | deVAB_i | fracDev_i |
\n",
+ "| float64 | float64 | float64 | float64 | float64 | float64 | float64 | float64 |
\n",
+ "| 1.121708 | 1.39658 | 2.130693 | 2.535936 | 4.519153 | 1.872421 | 0.5599636 | 1.0 |
\n",
+ "| 1.792809 | 1.768518 | 2.524124 | 2.907356 | 4.24383 | 1.669696 | 0.9144205 | 1.0 |
\n",
+ "| 1.89439 | 0.9232388 | 1.339203 | 1.679128 | 6.378449 | 2.613452 | 0.914933 | 1.0 |
\n",
+ "| 1.84079 | 0.8907413 | 1.288263 | 1.59309 | 2.717706 | 1.217582 | 0.5773458 | 1.0 |
\n",
+ "| 1.823496 | 1.098845 | 1.572985 | 1.921814 | 4.58021 | 1.801169 | 0.521351 | 1.0 |
\n",
+ "| 2.261122 | 1.588793 | 2.13522 | 2.542738 | 4.816254 | 1.660566 | 0.7140034 | 1.0 |
\n",
+ "| ... | ... | ... | ... | ... | ... | ... | ... |
\n",
+ "| 1.143171 | 0.5796566 | 0.9803791 | 1.172194 | 3.690838 | 1.72496 | 0.2565176 | 0.0 |
\n",
+ "| 1.50012 | 1.32847 | 1.853071 | 2.177547 | 8.216843 | 3.219985 | 0.616406 | 1.0 |
\n",
+ "| 1.909227 | 1.735445 | 2.292746 | 2.659302 | 4.499832 | 1.836947 | 0.7521729 | 1.0 |
\n",
+ "| 1.790123 | 1.714592 | 2.39934 | 2.773396 | 2.698374 | 1.143784 | 0.7517908 | 1.0 |
\n",
+ "| 1.834823 | 0.8002348 | 1.174528 | 1.487597 | 8.650411 | 3.723582 | 0.5212104 | 0.8198439 |
\n",
+ "| 1.323072 | 0.407774 | 0.6685619 | 0.7597561 | 7.248721 | 3.160752 | 0.8490075 | 0.2819962 |
\n",
+ "| 2.309149 | 1.631569 | 2.221014 | 2.62665 | 5.296202 | 1.961564 | 0.7751737 | 1.0 |
\n",
+ "
"
+ ],
+ "text/plain": [
+ "\n",
+ " ug gr gi gz ... petroR50_i deVAB_i fracDev_i\n",
+ "float64 float64 float64 float64 ... float64 float64 float64 \n",
+ "-------- --------- --------- --------- ... ---------- --------- ---------\n",
+ "1.121708 1.39658 2.130693 2.535936 ... 1.872421 0.5599636 1.0\n",
+ "1.792809 1.768518 2.524124 2.907356 ... 1.669696 0.9144205 1.0\n",
+ " 1.89439 0.9232388 1.339203 1.679128 ... 2.613452 0.914933 1.0\n",
+ " 1.84079 0.8907413 1.288263 1.59309 ... 1.217582 0.5773458 1.0\n",
+ "1.823496 1.098845 1.572985 1.921814 ... 1.801169 0.521351 1.0\n",
+ "2.261122 1.588793 2.13522 2.542738 ... 1.660566 0.7140034 1.0\n",
+ " ... ... ... ... ... ... ... ...\n",
+ "1.143171 0.5796566 0.9803791 1.172194 ... 1.72496 0.2565176 0.0\n",
+ " 1.50012 1.32847 1.853071 2.177547 ... 3.219985 0.616406 1.0\n",
+ "1.909227 1.735445 2.292746 2.659302 ... 1.836947 0.7521729 1.0\n",
+ "1.790123 1.714592 2.39934 2.773396 ... 1.143784 0.7517908 1.0\n",
+ "1.834823 0.8002348 1.174528 1.487597 ... 3.723582 0.5212104 0.8198439\n",
+ "1.323072 0.407774 0.6685619 0.7597561 ... 3.160752 0.8490075 0.2819962\n",
+ "2.309149 1.631569 2.221014 2.62665 ... 1.961564 0.7751737 1.0"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "GALquery = \"\"\"SELECT TOP 20000 \n",
+ " p.dered_u - p.dered_g as ug, p.dered_g - p.dered_r as gr, \n",
+ " p.dered_g - p.dered_i as gi, p.dered_g - p.dered_z as gz, \n",
+ " p.petroRad_i, p.petroR50_i, p.deVAB_i, p.fracDev_i\n",
+ " FROM PhotoObjAll AS p JOIN specObjAll s ON s.bestobjid = p.objid\n",
+ " WHERE p.mode = 1 AND s.sciencePrimary = 1 AND p.clean = 1 AND p.type = 3\n",
+ " AND p.deVAB_i > -999 AND p.petroRad_i > -999 AND p.petroR50_i > -999 AND p.dered_r < 20\n",
+ " \"\"\"\n",
+ "SDSSgals = SDSS.query_sql(GALquery)\n",
+ "SDSSgals"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ec24dbbb",
+ "metadata": {},
+ "source": [
+ "### 1a - Visualize the dataset in g-i (y) vs u-g (x) and all the features (11 pts). \n",
+ "\n",
+ "The bluest galaxies are star-forming galaxies at low redshift 𝑧. The \"tight\" cluster of red galaxies are passive galaxies at low-𝑧. Finally the diffuse cloud at 𝑔−𝑖≈3 are high-𝑧 luminous red galaxies (LRGs) that were targeted for BAO measurements. These sources have a wide range of 𝑢−𝑔 colors because they essentially are not detected in the 𝑢 band as this is blueward of the Lyman break.\n",
+ "\n",
+ "Plot and examine each of the features in this data set using seaborn's `PairGrid`. Overlay a histogram and kernel density distribution (KDE) on each 1D and 2D plot. You should be able to roughly see the different groups of galaxies, but how to separate them?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "6b644e8e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Table length=19951\n",
+ "
\n",
+ "| ug | gr | gi | gz | petroRad_i | petroR50_i | deVAB_i | fracDev_i |
\n",
+ "| float64 | float64 | float64 | float64 | float64 | float64 | float64 | float64 |
\n",
+ "| 1.121708 | 1.39658 | 2.130693 | 2.535936 | 4.519153 | 1.872421 | 0.5599636 | 1.0 |
\n",
+ "| 1.792809 | 1.768518 | 2.524124 | 2.907356 | 4.24383 | 1.669696 | 0.9144205 | 1.0 |
\n",
+ "| 1.89439 | 0.9232388 | 1.339203 | 1.679128 | 6.378449 | 2.613452 | 0.914933 | 1.0 |
\n",
+ "| 1.84079 | 0.8907413 | 1.288263 | 1.59309 | 2.717706 | 1.217582 | 0.5773458 | 1.0 |
\n",
+ "| 1.823496 | 1.098845 | 1.572985 | 1.921814 | 4.58021 | 1.801169 | 0.521351 | 1.0 |
\n",
+ "| 2.261122 | 1.588793 | 2.13522 | 2.542738 | 4.816254 | 1.660566 | 0.7140034 | 1.0 |
\n",
+ "| ... | ... | ... | ... | ... | ... | ... | ... |
\n",
+ "| 1.143171 | 0.5796566 | 0.9803791 | 1.172194 | 3.690838 | 1.72496 | 0.2565176 | 0.0 |
\n",
+ "| 1.50012 | 1.32847 | 1.853071 | 2.177547 | 8.216843 | 3.219985 | 0.616406 | 1.0 |
\n",
+ "| 1.909227 | 1.735445 | 2.292746 | 2.659302 | 4.499832 | 1.836947 | 0.7521729 | 1.0 |
\n",
+ "| 1.790123 | 1.714592 | 2.39934 | 2.773396 | 2.698374 | 1.143784 | 0.7517908 | 1.0 |
\n",
+ "| 1.834823 | 0.8002348 | 1.174528 | 1.487597 | 8.650411 | 3.723582 | 0.5212104 | 0.8198439 |
\n",
+ "| 1.323072 | 0.407774 | 0.6685619 | 0.7597561 | 7.248721 | 3.160752 | 0.8490075 | 0.2819962 |
\n",
+ "| 2.309149 | 1.631569 | 2.221014 | 2.62665 | 5.296202 | 1.961564 | 0.7751737 | 1.0 |
\n",
+ "
"
+ ],
+ "text/plain": [
+ "\n",
+ " ug gr gi gz ... petroR50_i deVAB_i fracDev_i\n",
+ "float64 float64 float64 float64 ... float64 float64 float64 \n",
+ "-------- --------- --------- --------- ... ---------- --------- ---------\n",
+ "1.121708 1.39658 2.130693 2.535936 ... 1.872421 0.5599636 1.0\n",
+ "1.792809 1.768518 2.524124 2.907356 ... 1.669696 0.9144205 1.0\n",
+ " 1.89439 0.9232388 1.339203 1.679128 ... 2.613452 0.914933 1.0\n",
+ " 1.84079 0.8907413 1.288263 1.59309 ... 1.217582 0.5773458 1.0\n",
+ "1.823496 1.098845 1.572985 1.921814 ... 1.801169 0.521351 1.0\n",
+ "2.261122 1.588793 2.13522 2.542738 ... 1.660566 0.7140034 1.0\n",
+ " ... ... ... ... ... ... ... ...\n",
+ "1.143171 0.5796566 0.9803791 1.172194 ... 1.72496 0.2565176 0.0\n",
+ " 1.50012 1.32847 1.853071 2.177547 ... 3.219985 0.616406 1.0\n",
+ "1.909227 1.735445 2.292746 2.659302 ... 1.836947 0.7521729 1.0\n",
+ "1.790123 1.714592 2.39934 2.773396 ... 1.143784 0.7517908 1.0\n",
+ "1.834823 0.8002348 1.174528 1.487597 ... 3.723582 0.5212104 0.8198439\n",
+ "1.323072 0.407774 0.6685619 0.7597561 ... 3.160752 0.8490075 0.2819962\n",
+ "2.309149 1.631569 2.221014 2.62665 ... 1.961564 0.7751737 1.0"
+ ]
+ },
+ "execution_count": 47,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "def clip(tab, col):\n",
+ " dev = 20 # this is extremely relaxed clipping - lower to get tighter focus\n",
+ " med = np.median(tab[col])\n",
+ " mad = st.median_abs_deviation(tab[col], scale='normal')\n",
+ " ran = [med - (dev * mad), med + (dev * mad)]\n",
+ " tab = tab[tab[col] >= ran[0]]\n",
+ " tab = tab[tab[col] <= ran[1]]\n",
+ " return tab\n",
+ "\n",
+ "\n",
+ "# Pre-process to ensure all the values are on a nice distribution w/o crazy outliers\n",
+ "for col in SDSSgals.colnames[0:6]: # deVAB_i and fracDev_i are well behaved.\n",
+ " SDSSgals = clip(SDSSgals, col)\n",
+ "\n",
+ "SDSSgals"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "id": "5d5fde1b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#plt.hist(SDSSgals['fracDev_i'])\n",
+ "SDSSgals_df = SDSSgals.to_pandas()\n",
+ "pg = sb.PairGrid(SDSSgals_df, diag_sharey=False)\n",
+ "pg.map_diag(sb.histplot)\n",
+ "pg.map_lower(sb.histplot)\n",
+ "pg.map_lower(sb.kdeplot, linewidths=0.5)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a29aa459",
+ "metadata": {},
+ "source": [
+ "### 1b - Separating the galaxy types (11 pts) \n",
+ "\n",
+ "Using K-means from `sklearn` with n=3, separate the three clusters of galaxies. Initial guesses, hyper-paramter tuning, dimensionality reduction etc are your choices. What's important is to be able to justify them. To the referee, to me, to yourself. We'll do that in the next part. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "id": "6454c9f6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "Text(0.5, 1.0, 'KMeans')"
+ ]
+ },
+ "execution_count": 51,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "scaler = StandardScaler()\n",
+ "scaler.fit(SDSSgals_df)#[['ug', 'gi']])\n",
+ "X = scaler.transform(SDSSgals_df)#[['ug', 'gi']])\n",
+ "\n",
+ "km = KMeans(3, n_init=10)\n",
+ "labels = km.fit_predict(X)\n",
+ "labels -= np.min(labels)\n",
+ "##\n",
+ "\n",
+ "fig, ax = plt.subplots(figsize=(5,5))\n",
+ "color = [f'C{i}' for i in labels]\n",
+ "ax.scatter(X[:,0], X[:,1], color=color, s=0.2)\n",
+ "ax.set_xlim(-3.0, 6.0)\n",
+ "ax.set_ylim(-3.0, 3.5)\n",
+ "ax.set_xlabel('u-g', fontsize='large')\n",
+ "ax.set_ylabel('g-i', fontsize='large')\n",
+ "ax.set_title('KMeans', fontsize='large')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "27e13fb7",
+ "metadata": {},
+ "source": [
+ "### 1c - Working with the distributions (11 pts)\n",
+ "Repeat 1a, but using the results of K-means in 1b to create separately colored distributions for your different classes of galaxies. Use the KDE to provide the mean values of each feature and their standard deviation (hint - these are integrals), and compare them to the sample means and standard deviations. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "id": "702bcc1b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 52,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "SDSSgals_df['label'] = labels\n",
+ "pg = sb.PairGrid(SDSSgals_df, hue='label', palette='tab10', diag_sharey=False)\n",
+ "pg.map_diag(sb.histplot)\n",
+ "pg.map_lower(sb.histplot)\n",
+ "pg.map_lower(sb.kdeplot, linewidths=0.5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "de18f3f2",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Means\n",
+ "labels ug ... deVAB_i fracDev_i \n",
+ "------ ------------------ ... ------------------ ------------------\n",
+ " all 1.8855624758624212 ... 0.6594228488446515 0.7450188348542452\n",
+ " 0 2.4534530960478698 ... 0.7129673497304765 0.9013273002846046\n",
+ " 1 1.3368760361295693 ... 0.5772949021155414 0.2748764648043901\n",
+ " 2 1.727805967585829 ... 0.6610023528602941 0.8745659530785986\n",
+ "\n",
+ "Standard Deviations\n",
+ "labels ug ... deVAB_i fracDev_i \n",
+ "------ ------------------- ... ------------------- -------------------\n",
+ " all 0.892454881677943 ... 0.2106183079391449 0.34498145603004154\n",
+ " 0 1.191292722297923 ... 0.18155663713111717 0.1948103198228895\n",
+ " 1 0.3854437496552186 ... 0.229687166303734 0.29966649638841186\n",
+ " 2 0.45589231759855897 ... 0.20949144474555018 0.20492458318289294\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Getting integrals from KDE\n",
+ "\n",
+ "def doit(b):\n",
+ " ax = sb.kdeplot(b);\n",
+ " kdeline = ax.lines[0]\n",
+ " xs = kdeline.get_xdata()\n",
+ " ys = kdeline.get_ydata()\n",
+ " mn = np.sum(xs[1:] * ys[1:] * (xs[1:] - xs[:-1]))\n",
+ " sigma = np.sqrt(np.sum(((xs[1:] - mn) ** 2.) * ys[1:] * (xs[1:] - xs[:-1])))\n",
+ " ax.clear();\n",
+ " return mn, sigma\n",
+ "\n",
+ "\n",
+ "ulabels = np.unique(labels)\n",
+ "vrs = SDSSgals.colnames\n",
+ "\n",
+ "SDSSgals_split = []\n",
+ "for label in ulabels:\n",
+ " SDSSgals_split.append(SDSSgals_df[SDSSgals_df['label'] == label])\n",
+ "\n",
+ "means = []\n",
+ "stds = []\n",
+ "for vr in vrs:\n",
+ " x = SDSSgals_df[vr]\n",
+ " m, s = doit(x)\n",
+ " mean = [m]\n",
+ " std = [s]\n",
+ " for label in ulabels:\n",
+ " section = SDSSgals_split[label]\n",
+ " x = section[vr]\n",
+ " m, s = doit(x)\n",
+ " mean.append(m)\n",
+ " std.append(s)\n",
+ " means.append(mean)\n",
+ " stds.append(std)\n",
+ "\n",
+ "lbs = ['all', *ulabels]\n",
+ "mean_tab = Table([lbs, *means], names=['labels', *vrs])\n",
+ "print('Means')\n",
+ "print(mean_tab)\n",
+ "std_tab = Table([lbs, *stds], names=['labels', *vrs])\n",
+ "print('\\nStandard Deviations')\n",
+ "print(std_tab)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "0e011ecb",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Means\n",
+ "labels ug ... deVAB_i fracDev_i \n",
+ "------ ------------------ ... ------------------ ------------------\n",
+ " all 1.8855619252845974 ... 0.6594467431371861 0.7455657316607789\n",
+ " 0 1.7278191944265087 ... 0.6610649174829771 0.8751524352817562\n",
+ " 1 1.3367663347148124 ... 0.5772159045369768 0.2747256721065279\n",
+ " 2 2.45345243386954 ... 0.7130062253576663 0.9020043087878921\n",
+ "\n",
+ "Standard Deviations\n",
+ "labels ug ... deVAB_i fracDev_i \n",
+ "------ ------------------- ... ------------------- -------------------\n",
+ " all 0.8840758637162341 ... 0.20865326182385066 0.3419820730274697\n",
+ " 0 0.44988793610802685 ... 0.2067722352488107 0.20233714569837183\n",
+ " 1 0.3789872324859523 ... 0.22580906101792916 0.2947230078274856\n",
+ " 2 1.1742382464400034 ... 0.17897413437266177 0.19213722297088734\n"
+ ]
+ }
+ ],
+ "source": [
+ "# The easier way\n",
+ "means = []\n",
+ "stds = []\n",
+ "for vr in vrs:\n",
+ " mean = [np.mean(SDSSgals_df[vr])]\n",
+ " std = [np.std(SDSSgals_df[vr])]\n",
+ " for label in ulabels:\n",
+ " section = SDSSgals_split[label]\n",
+ " mean.append(np.mean(section[vr]))\n",
+ " std.append(np.std(section[vr]))\n",
+ " means.append(mean)\n",
+ " stds.append(std)\n",
+ " \n",
+ "lbs = ['all', *ulabels]\n",
+ "mean_tab = Table([lbs, *means], names=['labels', *vrs])\n",
+ "print('Means')\n",
+ "print(mean_tab)\n",
+ "std_tab = Table([lbs, *stds], names=['labels', *vrs])\n",
+ "print('\\nStandard Deviations')\n",
+ "print(std_tab)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6cbb410b",
+ "metadata": {},
+ "source": [
+ "### Q2. Gaussian Processes + Emcee\n",
+ "\n",
+ "There are many sources with periodic light curves that are not strictly sinusoidal. Thus, the use of the cosine kernel (on its own) may not be sufficient to model the signal. The quasi-periodic kernel: \n",
+ "\n",
+ "$$K_{ij} = k(x_i - x_j) = A \\exp \\left(-\\Gamma \\sin^2\\left[\\frac{\\pi}{P} \\left|x_i - x_j\\right|\\right]\\right)$$\n",
+ "\n",
+ "is useful for non-sinusoidal signals. It is implemented in the `george` package. Note that the parameters in the kernel aren't the only parameters you might need... look back on your previous homework assignments and think about what I'm glossing over here. \n",
+ "\n",
+ "I've given you an example light curve file with a decidedly non-sinusoidal, periodic signal from the ASAS-SN project from our colleagues at OSU. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "09209dcd",
+ "metadata": {},
+ "source": [
+ "### 2a - Implement the model (11 pts)\n",
+ "\n",
+ "Examine this data, filter it as you see fit (I've included the file header in full - I'd pick one aperture, and look at the grades and notes about separate datasets). You can make tradeoffs here - more data that is potentially messier, vs less data so weaker constraints, but cleaner. Pick something that you can justify (and if you're struggling at 2c, examine this choice before twiddling with emcee). \n",
+ "\n",
+ "Write down a model for it with the likelihood function, an appropriate prior and posterior.\n",
+ "\n",
+ "You may wish to look at the `george` documentation again, particularly how some parameters are better log transformed if the expectation is that they are positive real values. \n",
+ "\n",
+ "https://george.readthedocs.io/en/latest/tutorials/model/"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "a2652f3f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['MAG_0', 'MAG_1', 'MAG_2', 'MAG_3', 'MAG_4']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Pull all data\n",
+ "# File information\n",
+ "hs = np.asarray([54, 305, 757, 790, 829, 875, 913])\n",
+ "s = np.copy(hs) + 1\n",
+ "e = np.asarray([282, 735, 768, 807, 852, 891, 1488])\n",
+ "n = 0\n",
+ "locs = [n]\n",
+ "for m in (e - s):\n",
+ " n += m\n",
+ " locs.append(n)\n",
+ "\n",
+ "with open('asas_data.dat', 'r') as reader:\n",
+ " lines = reader.readlines()\n",
+ " headers = [lines[hs[0] - 1].split()[1:]]\n",
+ " for h in hs[1:] - 1:\n",
+ " headers.append(lines[h].split()[1:])\n",
+ "\n",
+ "data = [ascii.read('asas_data.dat', guess=False, delimiter=' ', format='no_header', \n",
+ " data_start=locs[0], data_end=locs[1], names=headers[0])]\n",
+ "for i in range(1, len(hs)):\n",
+ " data.append(ascii.read('asas_data.dat', guess=False, delimiter=' ', format='no_header', \n",
+ " data_start=locs[i], data_end=locs[i+1], names=headers[i]))\n",
+ "\n",
+ "apertures = headers[1][1:6]\n",
+ "print(apertures)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "ec6335d3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Clean data\n",
+ "badthresh = 29\n",
+ "data_trim = data.copy()\n",
+ "for n in range(len(data_trim)):\n",
+ " data_trim[n] = data_trim[n].to_pandas()[data_trim[n]['GRADE'] != 'D'] # eliminate data with a grade of D\n",
+ " data_trim[n] = data_trim[n][data_trim[n]['GRADE'] != 'C'] # eliminate data with a grade of C\n",
+ " #for bv in badvals:\n",
+ " # data_trim[n][data_trim[n][apertures] > badthresh] = np.nan # Replace unmeasured values with NaNs - if \n",
+ " # throwing issues later, try removing C grades"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "06063eca",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/22/dh8f6qrs5xxcjd4nzyck348r0000gn/T/ipykernel_4454/1979478772.py:5: MatplotlibDeprecationWarning: Auto-removal of overlapping axes is deprecated since 3.6 and will be removed two minor releases later; explicitly call ax.remove() as needed.\n",
+ " ax = plt.subplot(3, 2, n + 1)\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Display all datasets in all apertures\n",
+ "for datum in data_trim:\n",
+ " fig = plt.subplots(figsize=(9, 6))\n",
+ " for n, ap in enumerate(apertures):\n",
+ " ax = plt.subplot(3, 2, n + 1)\n",
+ " ax.plot(datum['HJD'], datum[ap], 'b-')\n",
+ " ax.set_title(ap)\n",
+ " plt.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "f647c365",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " HJD | \n",
+ " MAG_1 | \n",
+ " MAG_0 | \n",
+ " MAG_2 | \n",
+ " MAG_3 | \n",
+ " MAG_4 | \n",
+ " MER_1 | \n",
+ " MER_0 | \n",
+ " MER_2 | \n",
+ " MER_3 | \n",
+ " MER_4 | \n",
+ " GRADE | \n",
+ " FRAME | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1868.76113 | \n",
+ " 12.131 | \n",
+ " 12.146 | \n",
+ " 12.144 | \n",
+ " 12.165 | \n",
+ " 12.193 | \n",
+ " 0.038 | \n",
+ " 0.065 | \n",
+ " 0.034 | \n",
+ " 0.038 | \n",
+ " 0.046 | \n",
+ " A | \n",
+ " 134 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1869.74854 | \n",
+ " 12.260 | \n",
+ " 12.271 | \n",
+ " 12.226 | \n",
+ " 12.184 | \n",
+ " 12.190 | \n",
+ " 0.030 | \n",
+ " 0.058 | \n",
+ " 0.027 | \n",
+ " 0.031 | \n",
+ " 0.037 | \n",
+ " A | \n",
+ " 292 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1869.75808 | \n",
+ " 12.314 | \n",
+ " 12.364 | \n",
+ " 12.288 | \n",
+ " 12.256 | \n",
+ " 12.247 | \n",
+ " 0.040 | \n",
+ " 0.068 | \n",
+ " 0.036 | \n",
+ " 0.042 | \n",
+ " 0.049 | \n",
+ " A | \n",
+ " 296 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 1870.77105 | \n",
+ " 11.755 | \n",
+ " 11.734 | \n",
+ " 11.768 | \n",
+ " 11.787 | \n",
+ " 11.820 | \n",
+ " 0.040 | \n",
+ " 0.067 | \n",
+ " 0.037 | \n",
+ " 0.041 | \n",
+ " 0.048 | \n",
+ " A | \n",
+ " 449 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 1871.78921 | \n",
+ " 12.176 | \n",
+ " 12.152 | \n",
+ " 12.181 | \n",
+ " 12.163 | \n",
+ " 12.176 | \n",
+ " 0.041 | \n",
+ " 0.069 | \n",
+ " 0.038 | \n",
+ " 0.042 | \n",
+ " 0.049 | \n",
+ " A | \n",
+ " 587 | \n",
+ "
\n",
+ " \n",
+ " | ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " | 1109 | \n",
+ " 5154.83688 | \n",
+ " 12.232 | \n",
+ " 12.223 | \n",
+ " 12.243 | \n",
+ " 12.251 | \n",
+ " 12.302 | \n",
+ " 0.047 | \n",
+ " 0.048 | \n",
+ " 0.044 | \n",
+ " 0.047 | \n",
+ " 0.050 | \n",
+ " B | \n",
+ " 333419 | \n",
+ "
\n",
+ " \n",
+ " | 1110 | \n",
+ " 5160.75874 | \n",
+ " 12.256 | \n",
+ " 12.223 | \n",
+ " 12.182 | \n",
+ " 12.098 | \n",
+ " 12.077 | \n",
+ " 0.070 | \n",
+ " 0.081 | \n",
+ " 0.069 | \n",
+ " 0.078 | \n",
+ " 0.087 | \n",
+ " B | \n",
+ " 334049 | \n",
+ "
\n",
+ " \n",
+ " | 1111 | \n",
+ " 5162.78817 | \n",
+ " 11.871 | \n",
+ " 11.888 | \n",
+ " 11.860 | \n",
+ " 11.871 | \n",
+ " 11.879 | \n",
+ " 0.046 | \n",
+ " 0.047 | \n",
+ " 0.045 | \n",
+ " 0.048 | \n",
+ " 0.052 | \n",
+ " B | \n",
+ " 334245 | \n",
+ "
\n",
+ " \n",
+ " | 1112 | \n",
+ " 5165.75062 | \n",
+ " 11.923 | \n",
+ " 11.920 | \n",
+ " 11.906 | \n",
+ " 11.904 | \n",
+ " 11.864 | \n",
+ " 0.045 | \n",
+ " 0.048 | \n",
+ " 0.042 | \n",
+ " 0.048 | \n",
+ " 0.055 | \n",
+ " A | \n",
+ " 334609 | \n",
+ "
\n",
+ " \n",
+ " | 1113 | \n",
+ " 5166.74107 | \n",
+ " 12.306 | \n",
+ " 12.253 | \n",
+ " 12.301 | \n",
+ " 12.257 | \n",
+ " 12.278 | \n",
+ " 0.050 | \n",
+ " 0.055 | \n",
+ " 0.047 | \n",
+ " 0.054 | \n",
+ " 0.062 | \n",
+ " A | \n",
+ " 334713 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
1114 rows × 13 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " HJD MAG_1 MAG_0 MAG_2 MAG_3 MAG_4 MER_1 MER_0 MER_2 \\\n",
+ "0 1868.76113 12.131 12.146 12.144 12.165 12.193 0.038 0.065 0.034 \n",
+ "1 1869.74854 12.260 12.271 12.226 12.184 12.190 0.030 0.058 0.027 \n",
+ "2 1869.75808 12.314 12.364 12.288 12.256 12.247 0.040 0.068 0.036 \n",
+ "3 1870.77105 11.755 11.734 11.768 11.787 11.820 0.040 0.067 0.037 \n",
+ "4 1871.78921 12.176 12.152 12.181 12.163 12.176 0.041 0.069 0.038 \n",
+ "... ... ... ... ... ... ... ... ... ... \n",
+ "1109 5154.83688 12.232 12.223 12.243 12.251 12.302 0.047 0.048 0.044 \n",
+ "1110 5160.75874 12.256 12.223 12.182 12.098 12.077 0.070 0.081 0.069 \n",
+ "1111 5162.78817 11.871 11.888 11.860 11.871 11.879 0.046 0.047 0.045 \n",
+ "1112 5165.75062 11.923 11.920 11.906 11.904 11.864 0.045 0.048 0.042 \n",
+ "1113 5166.74107 12.306 12.253 12.301 12.257 12.278 0.050 0.055 0.047 \n",
+ "\n",
+ " MER_3 MER_4 GRADE FRAME \n",
+ "0 0.038 0.046 A 134 \n",
+ "1 0.031 0.037 A 292 \n",
+ "2 0.042 0.049 A 296 \n",
+ "3 0.041 0.048 A 449 \n",
+ "4 0.042 0.049 A 587 \n",
+ "... ... ... ... ... \n",
+ "1109 0.047 0.050 B 333419 \n",
+ "1110 0.078 0.087 B 334049 \n",
+ "1111 0.048 0.052 B 334245 \n",
+ "1112 0.048 0.055 A 334609 \n",
+ "1113 0.054 0.062 A 334713 \n",
+ "\n",
+ "[1114 rows x 13 columns]"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# As far as I can tell, the three long datasets (indices 0, 1, -1) are from the same object, so I will merge the data\n",
+ "superset = data_trim[0].copy()\n",
+ "superset = pd.concat([superset, data_trim[1], data_trim[-1]], axis=0, ignore_index=True)\n",
+ "superset = superset.sort_values(by=['HJD'], ignore_index=True)\n",
+ "superset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "2472cf27",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Display the superset\n",
+ "fig = plt.figure(figsize=(9, 6))\n",
+ "for n, ap in enumerate(apertures):\n",
+ " ax = plt.subplot(3, 2, n + 1)\n",
+ " ax.plot(superset['HJD'], superset[ap], 'b-')\n",
+ " ax.set_title(ap)\n",
+ "plt.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "91d36d2d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# My choice of aperture\n",
+ "aper = 'MAG_1'\n",
+ "aper_err = 'MER_1'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "63382c3e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def kernel(A, gamma, logP):\n",
+ " return A * kernels.ExpSine2Kernel(gamma=gamma, log_period=logP)\n",
+ "\n",
+ "\n",
+ "class lightcurve_model(Model):\n",
+ " parameter_names = (\"m\")\n",
+ " def get_value(self, t):\n",
+ " \n",
+ " t = t.flatten()\n",
+ " # the baseline model is the mean m\n",
+ " mean_model = np.repeat(self.m, len(t))\n",
+ " return mean_model\n",
+ "\n",
+ "\n",
+ "# params: [mean, amplitude, gamma, logP]\n",
+ "def log_prior(params):\n",
+ " # This is my prior function\n",
+ " bounds = [[10,13]] # mean\n",
+ " bounds.append([0.1,2]) # amplitude\n",
+ " bounds.append([5E2,5E4]) # gamma\n",
+ " bounds.append([0.2,2]) # logP\n",
+ " for i, bound in enumerate(bounds):\n",
+ " if params[i] < bound[0] or params[i] > bound[1]:\n",
+ " return -np.inf\n",
+ " pr = 1 # here one could instead specify a multiplication of other prior distributions\n",
+ " return np.log(pr)\n",
+ "\n",
+ "def log_posterior(params, mags=None): # y is the magnitudes\n",
+ " model.set_parameter_vector(params)\n",
+ " return model.log_likelihood(mags, quiet=True) + log_prior(params)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9570e4b0",
+ "metadata": {},
+ "source": [
+ "### 2b - Initial Guesses (11 pts)\n",
+ "\n",
+ "Make some initial guess for the parameters. For the period, use Lomb-Scargle to find the top three periods for this light curve. Initialize 1/3rd of the walkers to each of the top three periods\n",
+ "\n",
+ "Do the burn in with `emcee` - a 100 walkers and a 1000 steps should be plenty - you should find that the walkers have migrated away from the starting guess. Plot the chains. \n",
+ "\n",
+ "Make a plot of the log of the Posterior vs the log of the Period - select the periods with the highest log Posterior and change the initial guess for the Period of all the walkers to be in a small region around the Period with the highest log Posterior. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "d38bc132",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "time = superset['HJD']\n",
+ "mags = superset[aper]\n",
+ "mag_err = superset[aper_err]\n",
+ "\n",
+ "# First guesses\n",
+ "m = np.mean(mags)\n",
+ "A = np.std(mags)#*60\n",
+ "gamma = 5000\n",
+ "logP = np.log(20)\n",
+ "guess = [m, A, gamma, logP]\n",
+ "\n",
+ "# test it out\n",
+ "fig = plt.figure(figsize=(6,4))\n",
+ "ax = fig.add_subplot()\n",
+ "model = george.GP(mean=lightcurve_model(m), kernel=kernel(A, gamma, logP))\n",
+ "model.compute(time, mag_err)\n",
+ "mag_pred = model.predict(mags, time, return_cov=False)\n",
+ "\n",
+ "ax.plot(time, mags, 'r')\n",
+ "ax.plot(time, mag_pred, \"k\")\n",
+ "#ax.set_xlim(2600, 3100)\n",
+ "ax.set_title(r'm=%d, A=%.3f, Gamma=%d, logP=%.3f' % (m, A, gamma, logP))\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "3499914d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "frequency, power = LombScargle(time*u.d, mags*u.mag, mag_err*u.mag).autopower()\n",
+ "cut = np.argmax(frequency > 0.05) # Remove frequencies less than 0.05 (periods greater than 20 days)\n",
+ "frequency = frequency[cut:]\n",
+ "power = power[cut:]\n",
+ "period = (frequency ** -1)\n",
+ "\n",
+ "peaks = find_peaks(power, prominence=0.025, distance=500)[0]\n",
+ "\n",
+ "# Plot\n",
+ "fig = plt.figure(figsize=(10, 3.5))\n",
+ "ax = fig.add_subplot()\n",
+ "\n",
+ "ax.plot(period, power, '-k', linewidth=0.5, label='11442793')\n",
+ "ax.plot(period[peaks], power[peaks], 'xr', linewidth=0.5, label='peaks')\n",
+ "ax.set_xlabel('Period [d]')\n",
+ "ax.set_ylabel('BLS Power')\n",
+ "#ax.set_xlim(0, 5)\n",
+ "ax.legend()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "83e4714e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1.23987778 0.34174995 0.43685958]\n"
+ ]
+ }
+ ],
+ "source": [
+ "pk_per = period[peaks]\n",
+ "pk_pk = power[peaks]\n",
+ "pk_tab = Table([pk_per, pk_pk], names=['Period', 'Power'])\n",
+ "\n",
+ "toremove = []\n",
+ "cons = 0.1\n",
+ "for n, prd in enumerate(pk_tab['Period']):\n",
+ " for chpd in pk_tab['Period'][n:]:\n",
+ " if chpd > ((prd / 2.) - cons) and chpd < ((prd / 2.) + cons):\n",
+ " toremove.append(n)\n",
+ " elif chpd > ((prd / 3.) - cons) and chpd < ((prd / 3.) + cons):\n",
+ " toremove.append(n)\n",
+ "\n",
+ "pk_tab.remove_rows(toremove)\n",
+ "pk_tab.sort('Power')\n",
+ "pk_per = pk_tab['Period'].data\n",
+ "top = np.log(pk_per[-3:])\n",
+ "print(top)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "7e1006a3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def run_emcee(data, aper, top, ndim, nwalkers, nsteps, goodP=False, guessP=None):\n",
+ " kwargs = {'mags':data[aper]}\n",
+ " nburn = nwalkers//10\n",
+ " \n",
+ " np.random.seed(10)\n",
+ " starting_guesses = np.zeros((nwalkers, ndim))\n",
+ " # Match to cell 98 priors\n",
+ " starting_guesses[:, 0] = 10 + 3 * np.random.rand(nwalkers) # mean\n",
+ " starting_guesses[:, 1] = 0.1 + 1.9 * np.random.rand(nwalkers) # amplitude\n",
+ " starting_guesses[:, 2] = 500 + 49500 * np.random.rand(nwalkers) # gamma\n",
+ " # Compose logP walkers\n",
+ " if goodP:\n",
+ " scale = guessP/6\n",
+ " starting_guesses[:, 3] = np.random.normal(loc=guessP, scale=scale, size=nwalkers)\n",
+ " else:\n",
+ " div = nwalkers // 3\n",
+ " starting_guesses[:div, 3] = np.random.normal(loc=top[0], scale=0.05, size=div)\n",
+ " starting_guesses[div:2*div, 3] = np.random.normal(loc=top[1], scale=0.05, size=div)\n",
+ " starting_guesses[2*div:, 3] = np.random.normal(loc=top[2], scale=0.05, size=div+1)\n",
+ " \n",
+ " sampler = emcee.EnsembleSampler(nwalkers, ndim, log_posterior, kwargs=kwargs)\n",
+ " state = sampler.run_mcmc(starting_guesses, nburn) # burning in\n",
+ " sampler.reset()\n",
+ " \n",
+ " sampler.run_mcmc(state, nsteps, progress=True);\n",
+ " samples = sampler.get_chain(flat=True)\n",
+ " return samples\n",
+ "\n",
+ "\n",
+ "def make_corner(samples, labels):\n",
+ " fig = corner.corner(samples, plot_contours=True, show_titles=True, smooth=2, labels=labels)\n",
+ " return\n",
+ "\n",
+ "\n",
+ "def visualize_chain(samples, labels):\n",
+ " # we can visualize the chains\n",
+ " fig, axs = plt.subplots(nrows=4, ncols=1, figsize=(10, 10))\n",
+ " for i in range(samples.shape[1]):\n",
+ " ax = axs[i]\n",
+ " ax.plot(samples[::10,i], linestyle='-', color='grey', marker='.', alpha=0.1)\n",
+ " med = np.median(samples[:,i])\n",
+ " std = np.std(samples[:,i])\n",
+ " ax.set_ylim(med-3*std, med+3*std) \n",
+ " ax.set_ylabel(labels[i])\n",
+ " return"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c6b0d426",
+ "metadata": {},
+ "source": [
+ "With all my functions and guesses written, I'm now running emcee with walkers at the three top periods."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "56f492ce",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|███████████████████████████████████████| 1000/1000 [48:03<00:00, 2.88s/it]\n"
+ ]
+ }
+ ],
+ "source": [
+ "ndim = 4\n",
+ "nwalkers = 100\n",
+ "nsteps = 1000\n",
+ "prms = ['Mean', \"Amplitude\", \"Gamma\", \"log(Period)\"]\n",
+ "sams = run_emcee(superset, aper, top, ndim, nwalkers, nsteps)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "64d8da7c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "make_corner(sams, prms)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "ef58aaae",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "visualize_chain(sams, prms)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "4ec0cd48",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig, ax = plt.subplots()\n",
+ "ax.hist(sams[:,3], bins=40)\n",
+ "ax.set_yscale('log')\n",
+ "ax.set_title('LogP vs Log Post')\n",
+ "\n",
+ "best_pd = 0.436"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "ac3bec85",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/emcee/moves/red_blue.py:99: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " lnpdiff = f + nlp - state.log_prob[j]\n",
+ "100%|███████████████████████████████████████| 1000/1000 [48:37<00:00, 2.92s/it]\n"
+ ]
+ }
+ ],
+ "source": [
+ "sams2 = run_emcee(superset, aper, top, ndim, nwalkers, nsteps, goodP=True, guessP=best_pd)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "92c03291",
+ "metadata": {},
+ "source": [
+ "### 2c - Infer the model parameters (11 pts)\n",
+ "\n",
+ "Plot the chains, the corner plot, the folded lightcurve, the Gaussian process model given the median parameters, 10 other draws from the model and the uncertainty about the model. \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "f00d435c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "visualize_chain(sams2, prms)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "a0c3d7f9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "make_corner(sams2, prms)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "021f855c",
+ "metadata": {
+ "tags": [
+ "raises-exception"
+ ]
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/erfa/core.py:154: ErfaWarning: ERFA function \"utctai\" yielded 1114 of \"dubious year (Note 3)\"\n",
+ " warnings.warn('ERFA function \"{}\" yielded {}'.format(func_name, wmsg),\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/erfa/core.py:154: ErfaWarning: ERFA function \"utctai\" yielded 1 of \"dubious year (Note 3)\"\n",
+ " warnings.warn('ERFA function \"{}\" yielded {}'.format(func_name, wmsg),\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Lomb-Scargle cannot create a transit time, so I can't fold the lightcurve\n",
+ "snupersnet = Table.from_pandas(superset)\n",
+ "tnime = Time(snupersnet['HJD'], format='mjd')\n",
+ "snupersnet['HJD'] = tnime\n",
+ "snupersnet.write('temp.csv', format='ascii.ecsv', overwrite=True)\n",
+ "ts = TimeSeries.read('temp.csv', format='ascii.ecsv', time_column='HJD')\n",
+ "periodogram = BoxLeastSquares.from_timeseries(ts, aper)\n",
+ "best_pd = 2.38#np.median(sams2[:,3])\n",
+ "results = periodogram.autopower(best_pd*u.day)\n",
+ "find = np.argmin(np.abs(results.period - best_pd))\n",
+ "bestest_pd = results.period[find]\n",
+ "bestest_tt = results.transit_time[find]\n",
+ "ts_folded = ts.fold(period=bestest_pd, epoch_time=bestest_tt)\n",
+ "fig, ax = plt.subplots(figsize=(6,4))\n",
+ "ax.plot(ts_folded.time.jd, ts_folded[aper], 'k.', markersize=1)\n",
+ "ax.set_xlabel('Time [d]')\n",
+ "ax.set_ylabel('Mag')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "7d2d57c6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "Text(0.5, 1.0, 'Folded Lightcurve (approx)')"
+ ]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "best_pd = np.median(sams2[:,3])\n",
+ "fig, ax = plt.subplots(figsize=(6,4))\n",
+ "t_fold = (time-np.min(time)) % best_pd\n",
+ "model = george.GP(mean=lightcurve_model(params_best[0]), kernel=kernel(*params_best[1:]))\n",
+ "model.compute(time, mag_err)\n",
+ "mag_pred_fold = model.predict(mags, t_fold, return_cov=False)\n",
+ "ax.plot(t_fold, mag_pred_fold, \"r.\", label='emcee median')\n",
+ "ax.plot(t_fold, mags, 'k.', markersize=1)\n",
+ "ax.set_xlabel('Mag')\n",
+ "ax.set_ylabel('Folded Time [d]')\n",
+ "ax.set_title('Folded Lightcurve (approx)')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "c4fe36da",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 45,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "params_best = np.zeros(4)\n",
+ "for i in range(len(params_best)):\n",
+ " params_best[i] = np.median(sams2[:,i])\n",
+ "\n",
+ "# plot\n",
+ "fig = plt.figure(figsize=(6,4))\n",
+ "ax = fig.add_subplot()\n",
+ "\n",
+ "# draws\n",
+ "draws = sams2[::len(sams2)//10]\n",
+ "draw = draws[0]\n",
+ "model = george.GP(mean=lightcurve_model(draw[0]), kernel=kernel(*draw[1:]))\n",
+ "model.compute(time, mag_err)\n",
+ "mag_pred = model.predict(mags, time, return_cov=False)\n",
+ "ax.plot(time, mag_pred, \"b-\", alpha=0.3, label='emcee draws')\n",
+ "for draw in draws[1:]:\n",
+ " model = george.GP(mean=lightcurve_model(draw[0]), kernel=kernel(*draw[1:]))\n",
+ " model.compute(time, mag_err)\n",
+ " mag_pred = model.predict(mags, time, return_cov=False)\n",
+ " ax.plot(time, mag_pred, \"b-\", alpha=0.3)\n",
+ "\n",
+ "# best\n",
+ "model = george.GP(mean=lightcurve_model(params_best[0]), kernel=kernel(*params_best[1:]))\n",
+ "model.compute(time, mag_err)\n",
+ "mag_pred_best = model.predict(mags, time, return_cov=False)\n",
+ "\n",
+ "ax.plot(time, mag_pred_best, \"r-\", label='emcee median')\n",
+ "\n",
+ "# data\n",
+ "ax.plot(time, mags, 'k.')\n",
+ "\n",
+ "ax.set_title('Best Fit')\n",
+ "ax.legend()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fb5eb72a",
+ "metadata": {},
+ "source": [
+ "N.B. you should be a bit worried about \"burn in\" and how the walkers were initialized throughout. If you plan to use GPs to search for periods in your own work, I highly recommend you read Angus et al. 2018 on the GP periodogram. Angus et al. provide far more intelligent methods for initializing the MCMC than what is presented here. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7dfbe936",
+ "metadata": {},
+ "source": [
+ "### Q3: PyMC (yes, that thing), hierarchical mixture models, and the mass-radius relation for small exoplanets\n",
+ "\n",
+ "The mass-radius relation is a relationship between the radius $R$ of an exoplanet and its mass $M$. We usually call planets smaller than the Neptune size $(R < 4 R_{\\oplus})$ small planets. In the Solar System, we don't have any planets between the Earth and Neptune sizes ($ 1-4 R_{\\oplus}$), whereas in extrasolar systems, plenty of planets with radii in the range are observed. Thus, it's extremely intriguing to study the compositions of these planets and understand why we don't have one in the Solar System.\n",
+ "\n",
+ "In this problem, you will work on one of the papers that one of our colloquium speakers brought up (this is why you should go to colloquium btw, because it'd have totally helped with this final exam to know the answer) - the mass-radius relation for small exoplanets around M-dwarfs. \n",
+ "\n",
+ "The paper is by [Luque et al., Science 377, 1211 (2022)](https://ui.adsabs.harvard.edu/abs/2022arXiv220903871L/abstract). We will reproduce some of their results using the PyMC."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "63c9097c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " ID | \n",
+ " ID_Star | \n",
+ " Star | \n",
+ " AltName | \n",
+ " Karmn | \n",
+ " RA_J2000 | \n",
+ " DE_J2000 | \n",
+ " SpT | \n",
+ " SpTnum | \n",
+ " d_pc | \n",
+ " ... | \n",
+ " eurho_gcm-3 | \n",
+ " edrho_gcm-3 | \n",
+ " Teq_K | \n",
+ " euTeq_K | \n",
+ " edTeq_K | \n",
+ " TSM | \n",
+ " ESM | \n",
+ " Method | \n",
+ " DiscoveryRef | \n",
+ " ParameterRef | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " GJ 3053 | \n",
+ " LHS 1140 | \n",
+ " J00449-152 | \n",
+ " 00:44:59.33 | \n",
+ " -15:16:17.5 | \n",
+ " M4.5 V | \n",
+ " 4.5 | \n",
+ " 14.964 | \n",
+ " ... | \n",
+ " 0.84 | \n",
+ " 0.80 | \n",
+ " 378.9 | \n",
+ " 4.3 | \n",
+ " 4.2 | \n",
+ " 8.88 | \n",
+ " 0.19 | \n",
+ " RV | \n",
+ " Dit17 | \n",
+ " Dit17 Men19 Lil20 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " GJ 3053 | \n",
+ " LHS 1140 | \n",
+ " J00449-152 | \n",
+ " 00:44:59.33 | \n",
+ " -15:16:17.5 | \n",
+ " M4.5 V | \n",
+ " 4.5 | \n",
+ " 14.964 | \n",
+ " ... | \n",
+ " 0.81 | \n",
+ " 0.74 | \n",
+ " 708.9 | \n",
+ " 8.0 | \n",
+ " 7.8 | \n",
+ " 25.90 | \n",
+ " 3.45 | \n",
+ " RV | \n",
+ " Dit17 | \n",
+ " Dit17 Men19 Lil20 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 3 | \n",
+ " 2 | \n",
+ " TOI-1468 | \n",
+ " LSPM J0106+1913 | \n",
+ " J01066+192 | \n",
+ " 01:06:36.98 | \n",
+ " +19:13:33.2 | \n",
+ " M3 V | \n",
+ " 3.0 | \n",
+ " 24.721 | \n",
+ " ... | \n",
+ " 1.05 | \n",
+ " 0.92 | \n",
+ " 682.2 | \n",
+ " 7.4 | \n",
+ " 6.9 | \n",
+ " 9.00 | \n",
+ " 6.30 | \n",
+ " RV | \n",
+ " Cha22 | \n",
+ " Cha22 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 4 | \n",
+ " 2 | \n",
+ " TOI-1468 | \n",
+ " LSPM J0106+1913 | \n",
+ " J01066+192 | \n",
+ " 01:06:36.98 | \n",
+ " +19:13:33.2 | \n",
+ " M3 V | \n",
+ " 3.0 | \n",
+ " 24.721 | \n",
+ " ... | \n",
+ " 0.21 | \n",
+ " 0.19 | \n",
+ " 337.5 | \n",
+ " 3.7 | \n",
+ " 3.4 | \n",
+ " 59.00 | \n",
+ " NaN | \n",
+ " RV | \n",
+ " Cha22 | \n",
+ " Cha22 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 5 | \n",
+ " 3 | \n",
+ " GJ 3090 | \n",
+ " TOI-177 | \n",
+ " NaN | \n",
+ " 01:21:45.39 | \n",
+ " -46:42:51.8 | \n",
+ " M2 V | \n",
+ " 2.0 | \n",
+ " 22.454 | \n",
+ " ... | \n",
+ " 0.52 | \n",
+ " 0.45 | \n",
+ " 693.0 | \n",
+ " 18.0 | \n",
+ " 18.0 | \n",
+ " 221.00 | \n",
+ " NaN | \n",
+ " RV | \n",
+ " Alm22a | \n",
+ " Alm22a | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
5 rows × 44 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ID ID_Star Star AltName Karmn RA_J2000 \\\n",
+ "0 1 1 GJ 3053 LHS 1140 J00449-152 00:44:59.33 \n",
+ "1 2 1 GJ 3053 LHS 1140 J00449-152 00:44:59.33 \n",
+ "2 3 2 TOI-1468 LSPM J0106+1913 J01066+192 01:06:36.98 \n",
+ "3 4 2 TOI-1468 LSPM J0106+1913 J01066+192 01:06:36.98 \n",
+ "4 5 3 GJ 3090 TOI-177 NaN 01:21:45.39 \n",
+ "\n",
+ " DE_J2000 SpT SpTnum d_pc ... eurho_gcm-3 edrho_gcm-3 Teq_K \\\n",
+ "0 -15:16:17.5 M4.5 V 4.5 14.964 ... 0.84 0.80 378.9 \n",
+ "1 -15:16:17.5 M4.5 V 4.5 14.964 ... 0.81 0.74 708.9 \n",
+ "2 +19:13:33.2 M3 V 3.0 24.721 ... 1.05 0.92 682.2 \n",
+ "3 +19:13:33.2 M3 V 3.0 24.721 ... 0.21 0.19 337.5 \n",
+ "4 -46:42:51.8 M2 V 2.0 22.454 ... 0.52 0.45 693.0 \n",
+ "\n",
+ " euTeq_K edTeq_K TSM ESM Method DiscoveryRef ParameterRef \n",
+ "0 4.3 4.2 8.88 0.19 RV Dit17 Dit17 Men19 Lil20 \n",
+ "1 8.0 7.8 25.90 3.45 RV Dit17 Dit17 Men19 Lil20 \n",
+ "2 7.4 6.9 9.00 6.30 RV Cha22 Cha22 \n",
+ "3 3.7 3.4 59.00 NaN RV Cha22 Cha22 \n",
+ "4 18.0 18.0 221.00 NaN RV Alm22a Alm22a \n",
+ "\n",
+ "[5 rows x 44 columns]"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "## Download the dataset from Luque et al. 2022\n",
+ "data = pd.read_csv(\"https://carmenes.caha.es/ext/tmp/TMP.csv\")\n",
+ "data.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "d55928b1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "## Lets extract mass and radius and their uncertainties from the data; both M and R are in Earth units \n",
+ "M = data.M_Mterra\n",
+ "R = data.R_Rterra\n",
+ "\n",
+ "err_M = (data.edM_Mterra+data.euM_Mterra)/2 # Assume the + and - errors on M and R are symmetric because lazy\n",
+ "err_R = (data.edR_Rterra+data.euR_Rterra)/2\n",
+ "\n",
+ "ind = err_R < 1.\n",
+ "M = M[ind]\n",
+ "R = R[ind]\n",
+ "err_M = err_M[ind]\n",
+ "err_R = err_R[ind]\n",
+ "\n",
+ "c=data['rho_gcm-3'][ind]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "5620dc2e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "## Plot the mass and radius of small planets around M-dwarfs\n",
+ "plt.figure(figsize=(5,4))\n",
+ "plt.errorbar(M, R, xerr=err_M, yerr=err_R,\n",
+ " linestyle='', fmt='o', markersize=4, elinewidth=1.2, capsize=1.2, c='grey')\n",
+ "plt.scatter(M, R, c=c, zorder=100, cmap='plasma_r')\n",
+ "plt.xscale('log')\n",
+ "plt.xlabel('Mass [Earth mass]')\n",
+ "plt.ylabel('Radius [Earth radius]')\n",
+ "plt.colorbar(label=r'Density [g/cm$^3$]')\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "095492f6",
+ "metadata": {},
+ "source": [
+ "Exoplaneteers made up cute names to describe planets in different compositions.\n",
+ "- \"Rocky world\" if a planet has a bulk density similar to the Earth.\n",
+ "- \"Water world\" if a planet has a bulk density consistent with 50% rocky and 50% water ice.\n",
+ "- \"Puffy world\" if a planet has a bulk density smaller than the \"Water World\" density.\n",
+ "\n",
+ "Now, while it's possible that this final is making you wish you were on a \"puff\" of something or the other, we'll restrict our analysis to the rocky and water worlds. It's where the grant dollars are. \n",
+ "\n",
+ "\n",
+ "### 3a - modeling the mass radius relation for rocky worlds (11 pts) \n",
+ "\n",
+ "First, select the rocky worlds. \n",
+ "\n",
+ "Let's write down the mass-radius relation for rocky worlds as a power law.\n",
+ "\n",
+ "$R = aM^b$, where $a$ is proportional to $1/\\rho_{\\oplus}$, and $b$ is unitless. If the relation follows $M = \\frac{4}{3}\\pi R^3 \\rho$, we have $a = 1$ and $b = 1/3$. However, in reality, the interior density of planets is not uniform and depends on the equation of state.\n",
+ "\n",
+ "Build a PyMC model to find parameters of interest {a, b}. Plot the traces (`pm` has a `plot_trace` function)and inferred model, along with some draws.\n",
+ "\n",
+ "Hints:\n",
+ "- As a, b have to be positive, I'd suggest Uniform priors on log a, log b, and then using pm.Deterministic to exponentiate them \n",
+ "- For the masses, since you've selected the rocky worlds, I'd suggest a normal distribution with the sample mean and sample standard deviation of the rocky worlds. \n",
+ "- Given M, a, b you can use pm.Deterministic to get R_model\n",
+ "- Assume our favorite normal likelihood for R_model. You have the observed radius and their uncertainties from the file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "88bab092",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "rho_E = 5.51 # g . cm^-3\n",
+ "rocky_thresh = 0.66 # at least 2/3 Earth density (approx. midpoint in paper)\n",
+ "rocky_data = data[data['rho_gcm-3'] > (rho_E * rocky_thresh)]\n",
+ "\n",
+ "rocky_M = rocky_data.M_Mterra\n",
+ "rocky_R = rocky_data.R_Rterra\n",
+ "\n",
+ "rocky_err_M = (rocky_data.edM_Mterra+rocky_data.euM_Mterra)/2 # Assume the + and - errors on M and R are symmetric because lazy\n",
+ "rocky_err_R = (rocky_data.edR_Rterra+rocky_data.euR_Rterra)/2\n",
+ "\n",
+ "ind = rocky_err_R < 1.\n",
+ "rocky_M = rocky_M[ind]\n",
+ "rocky_R = rocky_R[ind]\n",
+ "rocky_err_M = rocky_err_M[ind]\n",
+ "rocky_err_R = rocky_err_R[ind]\n",
+ "rocky_c = rocky_data['rho_gcm-3'][ind]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "df1f92f3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Auto-assigning NUTS sampler...\n",
+ "Initializing NUTS using jitter+adapt_diag...\n",
+ "Multiprocess sampling (4 chains in 4 jobs)\n",
+ "NUTS: [log_a, log_b]\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ " 100.00% [10000/10000 00:01<00:00 Sampling 4 chains, 0 divergences]\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Sampling 4 chains for 500 tune and 2_000 draw iterations (2_000 + 8_000 draws total) took 17 seconds.\n"
+ ]
+ }
+ ],
+ "source": [
+ "with pm.Model() as my_model: \n",
+ " # Priors\n",
+ " log_a = pm.Uniform('log_a', lower=-1, upper=1)\n",
+ " log_b = pm.Uniform('log_b', lower=-5, upper=1)\n",
+ " a = pm.Deterministic('a', np.exp(log_a))\n",
+ " b = pm.Deterministic('b', np.exp(log_b))\n",
+ " #a = pm.Uniform('a', lower=0.1, upper=3)\n",
+ " #b = pm.Uniform('b', lower=0.1, upper=3)\n",
+ " \n",
+ " R_model = pm.Deterministic('R_model', a * (rocky_M.array ** b))\n",
+ " #R_model = a * (rocky_M.array ** b)\n",
+ " \n",
+ " like = pm.Normal('likelihood', mu=R_model, sigma=rocky_err_R.array, observed=rocky_R.array)\n",
+ " \n",
+ " hm = pm.sample(2000, tune=500, target_accept=0.9)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "b7936f4e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " mean sd\n",
+ "a 1.025 0.004\n",
+ "b 0.282 0.005\n"
+ ]
+ }
+ ],
+ "source": [
+ "res_hm = pm.summary(hm)\n",
+ "a_best = res_hm['mean'][2]\n",
+ "b_best = res_hm['mean'][3]\n",
+ "print(res_hm.iloc[2:4,0:2])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "1a77e8cb",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pm.plot_trace(hm)\n",
+ "plt.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "ee119ac3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "draws = [hm.posterior['a'].to_numpy().flatten(), hm.posterior['b'].to_numpy().flatten()]\n",
+ "draws = np.asarray([d[::len(d)//100] for d in draws])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "c9279584",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Plotting\n",
+ "xc = [0.2, 30]\n",
+ "yc = [0.5, 2.5]\n",
+ "\n",
+ "xlog = np.logspace(*np.log10(xc), 1000)\n",
+ "\n",
+ "plt.figure(figsize=(5,4))\n",
+ "for n in range(len(draws[0])-1):\n",
+ " plt.plot(xlog, draws[0, n] * (xlog ** draws[1, n]), 'b-', alpha=0.1)\n",
+ "plt.plot(xlog, draws[0, n+1] * (xlog ** draws[1, n+1]), 'b-', alpha=0.1, label='Draws')\n",
+ "plt.errorbar(rocky_M, rocky_R, xerr=rocky_err_M, yerr=rocky_err_R,\n",
+ " linestyle='', fmt='o', markersize=4, elinewidth=1.2, capsize=1.2, c='grey')\n",
+ "plt.scatter(rocky_M, rocky_R, c=rocky_c, zorder=100, cmap='plasma_r')\n",
+ "plt.plot(xlog, a_best * (xlog ** b_best), linestyle='-', color='gold', label='Best Fit')\n",
+ "plt.xscale('log')\n",
+ "plt.legend()\n",
+ "plt.xlim(*xc)\n",
+ "plt.ylim(*yc)\n",
+ "plt.xlabel('Mass [Earth mass]')\n",
+ "plt.ylabel('Radius [Earth radius]')\n",
+ "plt.colorbar(label=r'Density [g/cm$^3$]')\n",
+ "plt.title('Rocky Planets')\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5e98bf59",
+ "metadata": {},
+ "source": [
+ "### 3b - The Mass-Radius Relation for Rocky+Water Worlds (23 pts) \n",
+ "\n",
+ "Let's now add water worlds and model the mass-radius relation for both rocky and water worlds. Physically, it will require two models to describe the mass-radius relations for rocky and water worlds. The tricky part is we don't know exactly which kind of worlds a planet is belong to. In this situation, it is helpful to introduce a categorical variable `z` that is either 0 or 1, with the relative posterior probabilities telling us how Rocky/Watery a planet is.\n",
+ "\n",
+ "Select the Rocky Water worlds - see the categories above 3a again. \n",
+ "\n",
+ "To make this work like magic with PyMC and it's Monte-Carlo sampler, we can choose a special prior for our categorial variable: the Drichlet Prior - https://en.wikipedia.org/wiki/Dirichlet_distribution\n",
+ "\n",
+ " # Two categories for water and rocky worlds\n",
+ " p = pm.Dirichlet(\"p\", a=np.ones(2), shape=2)\n",
+ " z = pm.Categorical(\"z\", p=p, shape=len(RockyWaterWorlds))\n",
+ " \n",
+ "\n",
+ "The rest of the PyMC model should be the same as 3a except you are fitting two relations - one for rocky worlds and one for water worlds, so you need two different `a` and `b` parameters - `shape=2` as above should take it. You might want to sort the `a` parameter with `transform=pm.distributions.transforms.ordered` when you define the prior to sort things. \n",
+ "\n",
+ "Build a PyMC model to find parameters of interest {a, b}. Plot the traces (`pm` has a `plot_trace` function)and inferred model, along with some draws."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "f00e286f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "rw_thresh = 0.33 # at least 1/3 Earth density (approx. midpoint in paper)\n",
+ "rw_data = data[data['rho_gcm-3'] > (rho_E * rw_thresh)]\n",
+ "\n",
+ "rw_M = rw_data.M_Mterra\n",
+ "rw_R = rw_data.R_Rterra\n",
+ "\n",
+ "rw_err_M = (rw_data.edM_Mterra+rw_data.euM_Mterra)/2 # Assume the + and - errors on M and R are symmetric because lazy\n",
+ "rw_err_R = (rw_data.edR_Rterra+rw_data.euR_Rterra)/2\n",
+ "\n",
+ "ind = rw_err_R < 1.\n",
+ "rw_M = rw_M[ind]\n",
+ "rw_R = rw_R[ind]\n",
+ "rw_err_M = rw_err_M[ind]\n",
+ "rw_err_R = rw_err_R[ind]\n",
+ "rw_c = rw_data['rho_gcm-3'][ind]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "05b9714d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Multiprocess sampling (4 chains in 4 jobs)\n",
+ "CompoundStep\n",
+ ">NUTS: [p, log_a, log_b]\n",
+ ">BinaryGibbsMetropolis: [z]\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ " 100.00% [10000/10000 00:11<00:00 Sampling 4 chains, 0 divergences]\n",
+ "
\n",
+ " "
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Sampling 4 chains for 500 tune and 2_000 draw iterations (2_000 + 8_000 draws total) took 25 seconds.\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n"
+ ]
+ }
+ ],
+ "source": [
+ "with pm.Model() as my_model: \n",
+ " # Two categories for water and rocky worlds\n",
+ " p = pm.Dirichlet(\"p\", a=np.ones(2), shape=2)\n",
+ " z = pm.Categorical(\"z\", p=p, shape=len(rw_M))\n",
+ " \n",
+ " # Other priors\n",
+ " log_a = pm.Uniform('log_a', lower=-1, upper=1, shape=2)\n",
+ " log_b = pm.Uniform('log_b', lower=-5, upper=1, shape=2)\n",
+ " a = pm.Deterministic('a', np.exp(log_a))\n",
+ " b = pm.Deterministic('b', np.exp(log_b))\n",
+ " \n",
+ " R_model = pm.Deterministic('R_model', (1-z)*(a[0] * (rw_M.array ** b[0])) + z*(a[1] * (rw_M.array ** b[1])))\n",
+ " \n",
+ " like = pm.Normal('likelihood', mu=R_model, sigma=rw_err_R.array, observed=rw_R.array)\n",
+ " \n",
+ " hm = pm.sample(2000, tune=500, target_accept=0.9)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "4294caad",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n",
+ "/Users/ljnolan/opt/anaconda3/envs/fds/lib/python3.10/site-packages/arviz/stats/diagnostics.py:584: RuntimeWarning: invalid value encountered in double_scalars\n",
+ " (between_chain_variance / within_chain_variance + num_samples - 1) / (num_samples)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " mean sd\n",
+ "a[0] 1.029 0.026\n",
+ "a[1] 1.027 0.023\n",
+ "b[0] 0.338 0.077\n",
+ "b[1] 0.339 0.078\n",
+ "[0.338 0.339]\n"
+ ]
+ }
+ ],
+ "source": [
+ "res_hm = pm.summary(hm)\n",
+ "a_best = np.asarray(res_hm['mean'][len(rw_R)+6:len(rw_R)+8])\n",
+ "b_best = np.asarray(res_hm['mean'][len(rw_R)+8:len(rw_R)+10])\n",
+ "print(res_hm.iloc[len(rw_R)+6:len(rw_R)+10,0:2])\n",
+ "print(b_best)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "09426c23",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "pm.plot_trace(hm)\n",
+ "plt.tight_layout()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "8e78dad6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "draws = [np.sort(hm.posterior['a'][0].to_numpy().flatten()), np.sort(hm.posterior['a'][1].to_numpy().flatten()),\n",
+ " np.sort(hm.posterior['b'][0].to_numpy().flatten()), np.sort(hm.posterior['b'][1].to_numpy().flatten())]\n",
+ "draws = np.asarray([d[::len(d)//100] for d in draws])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "0f0718d8",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "I plot these separately, because if I overplot, the transparent draws are on top of each other and become purple.\n"
+ ]
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_device_pixel_ratio', {\n",
+ " device_pixel_ratio: fig.ratio,\n",
+ " });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute('tabindex', '0');\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;' +\n",
+ " 'z-index: 2;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: relative;' +\n",
+ " 'z-index: 0;'\n",
+ " );\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'left: 0;' +\n",
+ " 'pointer-events: none;' +\n",
+ " 'position: absolute;' +\n",
+ " 'top: 0;' +\n",
+ " 'z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " /* This rescales the canvas back to display pixels, so that it\n",
+ " * appears correct on HiDPI screens. */\n",
+ " canvas.style.width = width + 'px';\n",
+ " canvas.style.height = height + 'px';\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " /* User Agent sniffing is bad, but WebKit is busted:\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=144526\n",
+ " * https://bugs.webkit.org/show_bug.cgi?id=181818\n",
+ " * The worst that happens here is that they get an extra browser\n",
+ " * selection when dragging, if this check fails to catch them.\n",
+ " */\n",
+ " var UA = navigator.userAgent;\n",
+ " var isWebKit = /AppleWebKit/.test(UA) && !/Chrome/.test(UA);\n",
+ " if(isWebKit) {\n",
+ " return function (event) {\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We\n",
+ " * want to control all of the cursor setting manually through\n",
+ " * the 'cursor' event from matplotlib */\n",
+ " event.preventDefault()\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " } else {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'dblclick',\n",
+ " on_mouse_event_closure('dblclick')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " canvas_div.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " canvas_div.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " fig.canvas_div.style.cursor = msg['cursor'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " var img = evt.data;\n",
+ " if (img.type !== 'image/png') {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " img.type = 'image/png';\n",
+ " }\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " img\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * https://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " // from https://stackoverflow.com/q/1114465\n",
+ " var boundingRect = this.canvas.getBoundingClientRect();\n",
+ " var x = (event.clientX - boundingRect.left) * this.ratio;\n",
+ " var y = (event.clientY - boundingRect.top) * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.key === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.key;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.key !== 'Control') {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " else if (event.altKey && event.key !== 'Alt') {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " else if (event.shiftKey && event.key !== 'Shift') {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k' + event.key;\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "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",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\", \"webp\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.binaryType = comm.kernel.ws.binaryType;\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " function updateReadyState(_event) {\n",
+ " if (comm.kernel.ws) {\n",
+ " ws.readyState = comm.kernel.ws.readyState;\n",
+ " } else {\n",
+ " ws.readyState = 3; // Closed state.\n",
+ " }\n",
+ " }\n",
+ " comm.kernel.ws.addEventListener('open', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('close', updateReadyState);\n",
+ " comm.kernel.ws.addEventListener('error', updateReadyState);\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " var data = msg['content']['data'];\n",
+ " if (data['blob'] !== undefined) {\n",
+ " data = {\n",
+ " data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
+ " };\n",
+ " }\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(data);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '
';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '
';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Plotting\n",
+ "xc = [0.2, 30]\n",
+ "yc = [0.5, 2.5]\n",
+ "\n",
+ "xlog = np.logspace(*np.log10(xc), 1000)\n",
+ "\n",
+ "print('I plot these separately, because if I overplot, the transparent',\n",
+ " 'draws are on top of each other and become purple.')\n",
+ "fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10,4))\n",
+ "for n in range(len(draws[0])-1):\n",
+ " axs[0].plot(xlog, draws[0, n] * (xlog ** draws[2, n]), linestyle='-', c='brown', alpha=0.1)\n",
+ " axs[1].plot(xlog, draws[0, n] * (xlog ** draws[2, n]), linestyle='-', c='blue', alpha=0.1)\n",
+ "axs[0].plot(xlog, draws[0, n+1] * (xlog ** draws[2, n+1]), linestyle='-', c='brown', alpha=0.1, label='Draws (rocky)')\n",
+ "axs[1].plot(xlog, draws[1, n+1] * (xlog ** draws[3, n+1]), linestyle='-', c='blue', alpha=0.1, label='Draws (water)')\n",
+ "for ax in axs:\n",
+ " ax.errorbar(rocky_M, rocky_R, xerr=rocky_err_M, yerr=rocky_err_R,\n",
+ " linestyle='', fmt='o', markersize=4, elinewidth=1.2, capsize=1.2, c='grey')\n",
+ " im = ax.scatter(rocky_M, rocky_R, c=rocky_c, zorder=100, cmap='plasma_r')\n",
+ " ax.plot(xlog, a_best[0] * (xlog ** b_best[0]), linestyle='-', color='maroon', label='Best Fit (rocky)')\n",
+ " ax.plot(xlog, a_best[1] * (xlog ** b_best[1]), linestyle='-', color='cyan', label='Best Fit (water)')\n",
+ " ax.set_xscale('log')\n",
+ " ax.legend()\n",
+ " ax.set_xlim(*xc)\n",
+ " ax.set_ylim(*yc)\n",
+ " ax.set_xlabel('Mass [Earth mass]')\n",
+ " ax.set_ylabel('Radius [Earth radius]')\n",
+ " plt.colorbar(im, label=r'Density [g/cm$^3$]')\n",
+ " ax.set_title('Rocky+Water Planets')\n",
+ "plt.tight_layout()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "aa0c1e44",
+ "metadata": {},
+ "source": [
+ "### Throughout, make sure your plots have things like appropriate axes scales, axes labels, errorsbars, legends, reasonable colors. Remember, these are how you tell the story of what you've done, and ultimately what we're looking at. \n",
+ "\n",
+ "\n",
+ "### Get started. You know how to do all of this. If not, there's something in a class notebook that can help. I'm on Teams, so direct questions there. \n",
+ "\n",
+ "# Best of luck. You've got this. "
+ ]
+ }
+ ],
+ "metadata": {
+ "celltoolbar": "Tags",
+ "kernelspec": {
+ "display_name": "Python [conda env:fds] *",
+ "language": "python",
+ "name": "conda-env-fds-py"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.9"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}