replot/Examples.ipynb

15309 lines
1.4 MiB

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Replot\n",
"======\n",
"\n",
"This is some basic Jupyter notebook to show you the features of [replot](https://github.com/Phyks/replot). It gives you usage examples, and is used by me as a visual test suite to check I did not break anything between updates.\n",
"\n",
"For detailed documentations, please refer to the module documentation."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Let's go!\n",
"\n",
"First import the required modules. Note that importing `replot` will not have any side effect and that if you previously imported `matplotlib` it will be left untouched."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import replot\n",
"\n",
"%matplotlib notebook"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Also import numpy as it will be useful…\n",
"import numpy as np\n",
"\n",
"# and add some black magic for easy reloading of the module before executing any cell (just here to ease testing)\n",
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Basic plotting\n",
"\n",
"Let's start by doing some basic plotting."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Let's plot a basic data series, as we would do with matplotlib\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Or a (X, Y) point series, as we would do with matplotlib\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" y = [i**2 for i in x]\n",
" figure.plot(x, y)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# But we can also plot a function, by automatically\n",
"# evaluating it on the given interval\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, (-2, 2)) # Plot sinus on [-2, 2]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# We can also do the same forcing replot to use some evaluation points\n",
"with replot.Figure() as figure:\n",
" x = np.linspace(-np.pi, np.pi, 200)\n",
" figure.plot(np.sin, x)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOy9Z5AcSZYmdnck788Zjbbkmq3Z7tqsTQ8aPyiMdv9pZ8c/NJL3gzTyOFANNLQGGt1oaK21lg2ttdZAoVCQhQIKJVE6UuuExszu7M70TDv9eURkZWVlREZkosoryr/P7DOIyoryyvfyvefuT/yrfwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfD1119vGzBgwN/LXgcAAAAAAADQC+CB37/nAWDHV1999SvZawEAAAAAAAB6Hv+WB4D/18CBAx8gAAQAAAAAAFAAPPj7z/yP//Lrr7+uQAAIAADQN9Dx7aCVHSN+W98w/H/7d7LXAgBAPwMP/v6HgQMH/s/0dzcB4C+//MIAAACAnsFf/vAH5hv7DdNGD+V//yfZywH6EXo2qgA8Ax78jTD4LWcrDwh/+Lu/+7v/rtD3kRK9e/c79vYt2N9Jcoa81SHk3TcYv3OXad8OYsG1KyFv8IvKuzdiC8BjcHMCSAaDlOnNG7C/k+QMeatDyLtvMLh6hQgAY3fLIG/wi8q7p2MJwGMYMGDAsIEDB8Y5N/393//9f1vo9TAY6hAOQi1C3vKZCsSYNmoI08YOZ+nYW8gb/KLy7o2YAujHgMFQh3AQahHyls/o5Svi9C+0dRPkDX5xecuOHwCPAwZDHcJBqEXIWz4Di+eLADD+6CnkDX5xecuOHwCPAwZDHcJBqEXIWy5TrX4R/PkmjWHp5AfIG/zi8pYdPwAeBwyGOoSDUIuQt1xGTp8WAWB47x7IG+wRecuOHwCPAwZDHcJBqEXIWx7T6c/MP3uGCAATL2ogb7BH5C07fgA8DhgMdQgHoRYhb3lM1rfo17/fTWLp1CfIG+wRecuOHwCPAwZDHcJBqEXIWx7Dhw+JADBy5DDkDfaYvGXHD4DHAYOhDuEg1CLkLYd04kcnfxQA0kkg5A32lLxlxw+AxwGDoQ7hINQi5C2HiapXIvjzz/5e5AJC3mBPyVt2/AB4HDAY6hAOQi1C3nIY3rNbv/49cwbyBntU3rLjB8DjgMFQh3AQahHy7n2mEx+Yb9JoEQCm2vyQN9ij8pYdPwAeBwyGOoSDUIuQd++TJn5Q8EcTQCBvsKflLTt+ADwOGAx1CAehFiHv3mdoyyYRAEYvX4W8wR6Xt+z4AfA4YDDUIRyEWoS8e5fp6BumjR3OtFFDWCoQg7zBHpe37PgB8DhgMNQhHIRahLx7l7G7ZeL0L7hmBeQN9oq8ZccPgMcBg6EO4SDUIuTduwyuXSkCwNjte5A32Cvylh0/AB4HDIY6hINQi5B37zEVjDNt1FBxBZyOvIG8wV6Rt+z4AfA4YDDUIRyEWoS8e4/Rq9fE6V9o80bIG+w1ecuOHwCPAwZDHcJBqEXIu/cYWLpABIDxiseQN9hr8pYdPwAeBwyGOoSDUIuQd+8w1R4UwZ9v4ijRCBryBntL3rLjB8DjgMFQh3AQahHy7h1Gz54VAWB49y7IG+xVecuOHwCPAwZDHcJBqEXIu3fonztTBICJ59WQN9ir8pYdPwAeBwyGOoSDUIuQd88z2diqX/9On8DSqU+QN9ir8pYdPwAeBwyGOoSDUIuQd88zcvSofv176KD0tUDeahEBIFAyYDDUIRyEWoS8e5bp9GfmmzFZBIDJuibp64G81SICQKBkwGCoQzgItQh59ywTL2tF8OefNUMEg7LXA3mrRQSAQMmAwVCHcBBqEfLuWYZ/2isCwMipU9LXAnmrRwSAQMmAwVCHcBBqEfLuOaaTH5hv8lj9+rfFJ309kLd6RAAIlAwYDHUIB6EWIe+eY/xxpQj+AovmSl8L5K0mEQACJQMGQx3CQahFyLvnGNq2RQSA0UuXpa8F8laTCACBkgGDoQ7hINQi5N0zTMfeMm38CKaNHMxS/pj09UDeahIBIFAyYDDUIRyEWoS8e4axe+Xi9C+4apn0tUDe6hIBIFAyYDDUIRyEWoS8e4bBdatFABi7dUf6WiBvdYkAECgZMBjqEA5CLULeX56pUJJpo4cybcwwlo6kpa8H8laXCACBkgGDoQ7hINQi5P3lGbt+Q7/+3bRe+logb7WJABAoGTAY6hAOQi1C3l+egeWLRQAYf/BI+logb7WJABAoGTAY6hAOQi1C3l+WqY6QqPzVJoxk6cR76euBvNUmAkCgZMBgqEM4CLUIeX9ZRs+dF6d/oV07pK8F8gYRAAIlAwZDHcJBqEXI+8vSP3+WCAATlS+krwXyBhEAAiUDBkMdwkGoRcj7yzH5ul0Ef75p41k69Un6eiBvEAEgUDJgMNQhHIRahLy/HCPHj4sAMHxgv/S1QN6gKW/Z8QPgccBgqEM4CLUIeX8ZptOfmf+HqSIATNa+lr4eyBs05S07fgA8DhgMdQgHoRYh7y/DxKt6Efz5f5wugkHZ64G8QVPesuMHwOOAwVCHcBBqEfL+Mgzv3ycCwMiJE9LXAnmD2fKWHT8AHgcMhjqEg1CLkHfpTCc/Mt+Ucfr1b3OH9PVA3mC2vGXHD4DHAYOhDuEg1CLkXTrjT6tE8BdYMFv6WiBvMFfesuMHwOOAwVCHcBBqEfIunaEd20QAGL14SfpaIG8wV96y4wfA44DBUIdwEGoR8i6N6fg7po3/Vox/S/ki0tcDeYO58pYdPwAeBwyGOoSDUIuQd2mM36/Qr39XLJW+FsgbzCdv2fED4HHAYKhDOAi1CHmXxuCGtSIAjN24JX0tkDeYT96y4wfA44DBUIdwEGoR8i6e6XCKaaOHCdLfZa8H8gbzyVt2/AB4HDAY6hAOQi1C3sWTTv3o9C+4YZ30tUDeoJW8ZccPgMcBg6EO4SDUIuRdPCnvjwJAygOUvRbIG7SSt+z4AfA4YDDUIRyEWoS8iyNV/FLlrzZhpKgElr0eyBu0krfs+AHwOGAw1CEchFqEvItj9MJFcfpHPQBlrwXyBu3kLTt+ADwOGAx1CAehFiHv4khTP8T179Mq6WuBvEE7ecuOHwCPAwZDHcJBqEXI2z1p3i8FfzT/l+YAy14P5A3ayVt2/AB4HDAY6hAOQi1C3u4ZOXFCBIDh/fukrwXyBgvJW3b8AHgcMBjqEA5CLULe7phOf2b+H6eLADDxqkH6eiBvsJC8ZccPgMcBg6EO4SDUIuTtjsna1yL48/8wVQSDstcDeYOF5C07fgA8DhgMdQgHoRYhb3cMH9gvAsDI8ePS1wJ5g07kLTt+ADwOGAx1CAehFiFv50ynPjHftPEiAEw2tUtfD+QNOpG37PgB6EMYMGDAsK+//vr/5dw2cODA/9PJ98BgqEM4CLUIeTtnovKFfv07f5b0tUDeoFN593RMAXgE//AP//BrHvQ10N9/85vf/O/879VOvg8GQx3CQahFyNs5Q7t2iAAwev6C9LVA3qBTefdsVAF4Cr/61a/+iv78+uuvFwwYMGCxk++BwVCHcBBqEfJ2xnTivRj7RuPfUh0h6euBvEGn8u7ZiALwGv6r3/zmN4N4AHiQ//3fOvkGMhjv3unKBPZvkpwhb3UIeTtjvOKROP0LLl8sfS2QN+hG3j0cTwBexMCBAwdzXnHyWgYAAKAwEjs2iwDwU8V92UsBAFfo6VgC8CC++uqrrzl++du//du/LvRaUiLsGNUgTgjUIuRdmG+iaaaNGca00UNZOpyUvh7IG3Qj796IJwAPYODAgeN40Hee/s7//A+cMf7Xf1Po+8hgkDLJzmcAeydnBPJWh5B3YcZu3dGvf9evkb4WyBt0K+8eDywAb+DXv/713/Cgb6Rx/bv/q6+++p+cfB8MhjqEg1CLkHdhBlctEwFgrKxc+logb9CtvHs6rgD6OWAw1CEchFqEvO2Z8sdE5a82fgRLx95KXw/kDbqVt+z4AfA4YDDUIRyEWoS87Rm9dFmc/oW2bZG+FsgbLEbesuMHwOOAwVCHcBBqEfK2Z2DRXBEAxh9XSl8L5A0WI2/Z8QPgccBgqEM4CLUIeVsz2eITwZ9v8liWTn6Uvh7IGyxG3rLjB8DjgMFQh3AQahHytmbk1CkRAIb37ZW+FsgbLFbesuMHwOOAwVCHcBBqEfLOz3T6M/PP+k4EgImXddLXA3mDxcpbdvwAeBwwGOoQDkItQt75maxr0q9/Z0wWwaDs9UDeYLHylh0/AB4HDIY6hINQi5B3foYPHRQBYOToUelrgbzBUuQtO34APA4YDHUIB6EWIe/uTKc+Md/0CSIATL5uk74eyBssRd6y4wfA44DBUIdwEGoR8u7OxPNqEfz5586UvhbIGyxV3rLjB8DjgMFQh3AQahHy7s7w7l0iAIyePSd9LZA3WKq8ZccPgMcBg6EO4SDUIuTdlenEB+abOEoEgKn2oPT1QN5gqfKWHT8AHgcMhjqEg1CLkHdXxisei+AvsHSh9LVA3uCXkLfs+AHwOGAw1CEchFqEvLsytHmjfv179Zr0tUDe4JeQt+z4AfA4YDDUIRyEWoS8O5mOvGHa2OFMGzWUpYIJ6euBvMEvIW/Z8QPgccBgqEM4CLUIeXcydvueOP0Lrl0lfS2QN/il5C07fgA8DhgMdQgHoRYh704G16wQAWDsbpn0tUDe4JeSt+z4AfA4YDDUIRyEWoS8daYCMaaNGiKugNOxt9LXA3mDX0resuMHwOOAwVCHcBBqEfLWGb18VZz+hbZukr4WyBv8kvKWHT8AHgcMhjqEg1CLkLfOwOL5IgCMP3omfS2QN/gl5S07fgA8DhgMdQgHoRYh79+xVJtfBH++SWNYOvlB+nogb/BLylt2/AB4HDAY6hAOQi1C3r9jkTNnRAAY3rtH+logb/BLy1t2/AB4HDAY6hAOQi1C3r9j/jk/iAAw8aJG+logb/BLy1t2/AB4HDAY6hAOQi2qLu9kfYt+/fvdJJZOfZK+Hsgb/NLylh0/AB4HDIY6hINQi6rLO3LksAgAI0eOSF8L5A32hLxlxw+AxwGDoQ7hINSiyvKmEz86+aMAMNnQIn09kDfYE/KWHT8AHgcMhjqEg1CLKsubcv4o+KMcQNlrgbzBnpK37PgB8DhgMNQhHIRaVFneVPUrrn/PnJG+Fsgb7Cl5y44fAI8DBkMdwkGoRVXlTf3+qO8fBYDUB1D2eiBvsKfkLTt+ADwOGAx1CAehFlWVd/zRUxH80QQQ2WuBvMGelLfs+AHwOGAw1CEchFpUVd4085cCwOiVq9LXAnmDPSlv2fED4HHAYKhDOAi1qKK807G3TBs7nGmjhrBUIC59PZA32JPylh0/AB4HDIY6hINQiyrKO3a3TJz+BdeskL4WyBvsaXnLjh8AjwMGQx3CQahFFeUdXLtSBICx2/ekrwXyBnta3rLjB8DjgMFQh3AQalE1eaeCcaaNGiqugNORN9LXA3mDPS1v2fED4HHAYKhDOAi1qJq8o1evidO/0JaN0tcCeYO9IW/Z8QPgccBgqEM4CLWomrwDSxeKADD+8In0tUDeYG/IW3b8AHgcMBjqEA5CLaok71R7UAR/vomjWDrxQfp6IG+wN+QtO34APA4YDHUIB6EWVZJ39Ow5EQCGd++SvhbIG+wtecuOHwCPAwZDHcJBqEWV5O2fO1MEgInn1dLXAnmDvSVv2fED4HHAYKhDOAi1qIq8k42t+vXv9IksnfokfT2QN9hb8pYdPwAeBwyGOoSDUIuqyDty9Kh+/XvokPS1QN5gb8pbdvwAeBwwGOoQDkItqiDvdPoz882YLALAZF2T9PVA3mBvylt2/AB4HDAY6hAOQi2qIO/EyzoR/PlnzRDBoOz1QN5gb8pbdvwAeBwwGOoQDkItqiDv8E97RQAYOXVK+lpkUwV5g13lLTt+ADwOGAx1CAehFvu7vNPJD8w3eax+/dvik74e2ezv8ga7y1t2/AB4HDAY6hAOQi32d3nHH1eK4C+waJ70tfQF9nd5g93lLTt+ADwOGAx1CAehFvu7vEPbtogAMHrpsvS19AX2d3mD3eUtO34APA4YDHUIB6EW+7O807G3TBs/gmkjB7OUPyZ9PX2B/VneYH55y44fAI8DBkMdwkGoxf4s79i9cnH6F1y1TPpa+gr7s7zB/PKWHT8AHgcMhjqEg1CL/VnewXWrRQAYu3VH+lr6CvuzvMH88pYdPwAeBwyGOoSDUIv9Vd6pUJJpo4cybcw3LB1JS19PX2F/lTdoLW/Z8QPgccBgqEM4CLXYX+Udu35DnP6FNq2Xvpa+xP4qb9Ba3rLjB8DjgMFQh3AQarG/yjuwfLEIAOMPHklfS19if5U3aC1v2fED4HHAYKhDOAi12B/lneoIicpfbcJIlk68l76evsT+KG/QXt6y4wfA44DBUIdwEGqxP8o7eu68fv27a4f0tfQ19kd5g/bylh0/AB4HDIY6hINQi/1R3v75s0QAmKh8KX0tfY39Ud6gvbxlxw+AxwGDoQ7hINRif5N38nW7CP580yawdOqT9PX0NfY3eYOF5S07fgA8DhgMdQgHoRb7m7wjx4+LADB88ID0tfRF9jd5g4XlLTt+ADwOGAx1CAehFvuTvNPpz8z/w1QRACZrX0tfT19kf5I36EzesuMHwOOAwVCHcBBqsT/JO/GqXgR//h+ni2BQ9nr6IvuTvEFn8pYdPwAeBwyGOoSDUIv9Sd7h/ftEABg5cUL6Wvoq+5O8QWfylh0/AB4HDIY6hINQi/1F3unkR+abMk6//m3WpK+nr7K/yBt0Lm/Z8QPQhzBgwIBJnGO//vrrk7/+9a//wcn3wGCoQzgItdhf5B1/WiWCv8DCOdLX0pfZX+QNOpd3T8cUgEfwm9/85v/g/B+Nv//fPAi87uT7YDDUIRyEWuwv8g7t2CYCwOjFS9LX0pfZX+QNOpd3z0YVgGfAA77pAwYM2EF/53/+9/zf9U6+DwZDHcJBqMX+IO90/B3Txn8rxr+lfBHp6+nL7A/yBt3Ju2ejCsBL+C+++uqr/4b+YlwDr3fyTWQw3r3TlQns3yQ5Q97qsD/IO36/Qpz+BVculb6Wvs7+IG/Qnbx7NqQAPIe//uu//q958Hfpb/7mb/6dk9czAACAPorE9o0iAPz86IHspQBAn0NPxxOAt/CvefC38le/+tVfOf0GUiLsGNUgTgjUotflnY6kmDZ6GNPGDGNv+N9lr6ev0+vyBt3LuyeDCcBjGDhw4Lhf//rXf0N/54Hg/+Pke8hgkDLJzmcAeydnBPJWh16Xd+zGLf36d8M66WvxAr0ub9C9vHs2ogA8A6r85QHg73jg98bgYSffB4OhDuEg1KLX5R1YsVQEgJQHKHstXqDX5Q26l3dPxxVAPwcMhjqEg1CLXpZ3SouIyl9twkhRCSx7PV6gl+UNFidv2fED4HHAYKhDOAi16GV5Ry9cFKd/1ANQ9lq8Qi/LGyxO3rLjB8DjgMFQh3AQatHL8g4smC0CwMTTKulr8Qq9LG+wOHnLjh8AjwMGQx3CQahFr8o72dwhgj+a/5tOfZK+Hq/Qq/IGi5e37PgB8DhgMNQhHIRa9Kq8IydOiAAwvH+f9LV4iV6VN1i8vGXHD4DHAYOhDuEg1KIX5Z1Of2b+mdP0699XDdLX4yV6Ud5gafKWHT8AHgcMhjqEg1CLXpR3oqZRBH/+H6aKYFD2erxEL8obLE3esuMHwOOAwVCHcBBq0YvyDh/YLwLAyPHj0tfiNXpR3mBp8pYdPwAeBwyGOoSDUItekzcVfPimjRcBYLKpXfp6vEavyRssXd6y4wfA44DBUIdwEGrRa/JOVL7Qr3/nz5K+Fi/Sa/IGS5e37PgB8DhgMNQhHIRa9Jq8Q7t2iAAwev6C9LV4kV6TN1i6vGXHD4DHAYOhDuEg1KKX5J2Ovxdj32j8W6ojJH09XqSX5A1+GXnLjh8AjwMGQx3CQahFL8k7Xv5QnP4Fli+Wvhav0kvyBr+MvGXHD4DHAYOhDuEg1KKX5B3ctF4EgLHrN6Svxav0krzBLyNv2fED4HHAYKhDOAi16BV5pyNppo0ZxrTRQ1k6lJS+Hq/SK/IGv5y8ZccPgMcBg6EO4SDUolfkHbt1R5z+Bdevkb4WL9Mr8ga/nLxlxw+AxwGDoQ7hINSiV+QdXLlMv/4tK5e+Fi/TK/IGv5y8ZccPgMcBg6EO4SDUohfknfJFReWvNn4ES8feSl+Pl+kFeYNfVt6y4wfA44DBUIdwEGrRC/KOXrosTv9C27ZIX4vX6QV5g19W3rLjB8DjgMFQh3AQatEL8g4smisCwPjjSulr8Tq9IG/wy8pbdvwAeBwwGOoQDkIt9nV5J1t8IvjzTR7L0smP0tfjdfZ1eYNfXt6y4wfA44DBUIdwEGqxr8s7cuqUCADD+/ZKX0t/YF+XN/jl5S07fgA8DhgMdQgHoRb7srzT6c/MP+s7EQAmXtZJX09/YF+WN9gz8pYdPwAeBwyGOoSDUIt9Wd7Juib9+nfGZBEMyl5Pf2BfljfYM/KWHT8AHgcMhjqEg1CLfVne4UMHRQAYOXpU+lr6C/uyvMGekbfs+AHwOGAw1CEchFrsq/JOpz4x3/QJIgBMNrZKX09/YV+VN9hz8pYdPwAeBwyGOoSDUIt9Vd6J59Ui+PPPnSl9Lf2JfVXeYM/JW3b8AHgcMBjqEA5CLfZVeYd27xQBYPTsOelr6U/sq/IGe07esuMHwOOAwVCHcBBqsS/KO514z3wTR4kAMNUelL6e/sS+KG+wZ+UtO34APA4YDHUIB6EW+6K84xWPRfAXWLpQ+lr6G/uivMGelbfs+AHwOGAw1CEchFrsi/IObd6oX/9evSZ9Lf2NfVHeYM/KW3b8AHgcMBjqEA5CLfY1eacjb5g2djjTRg1lqWBc+nr6G/uavMGel7fs+AHwOGAw1CEchFrsa/KO3b4nTv+Ca1dJX0t/ZF+TN9jz8pYdPwAeBwyGOoSDUIt9Td7B1StEABi7WyZ9Lf2RfU3eYM/LW3b8AHgcMBjqEA5CLfYleacCMaaNGiKugNOxt9LX0x/Zl+QN9o68ZccPgMcBg6EO4SDUYl+Sd/TyVXH6F9q6Sfpa+iv7krzB3pG37PgB8DhgMNQhHIRa7EvyDiyeLwLA+KOn0tfSX9mX5A32jrxlxw+AxwGDoQ7hINRiX5F3qs0vgj/fpDEsnfwg/X3pr+wr8gZ7T96y4wfA44DBUIdwEGqxr8g7cvq0CADDe/dIf0/6M/uKvMHek7fs+AHwOGAw1CEchFrsC/JOpz8z/+wZIgBMvKiR/p70Z/YFeYO9K2/Z8QPgccBgqEM4CLXYF+SdrG/Rr3+/m8TSqU/S35P+zL4gb7B35S07fgA8DhgMdQgHoRb7grwjRw6LAJD+lP1+9Hf2BXmDvStv2fED4HHAYKhDOAi1KFvedOJHJ38UANJJoOz3o79TtrzB3pe37PgB8DhgMNQhHIRalC1vyvmj4M8/+3uRCyj7/ejvlC1vsPflLTt+ADwOGAx1CAehFmXLO7xnt379e+aM9PdCBcqWN9j78pYdPwAeBwyGOoSDUIsy5Z1OfGC+SaNFAEh9AGW/FyoQn2+1iAAQKBkwGOoQDkItypQ3Tfyg4I8mgMh+H1QhPt9qEQEgUDJgMNQhHIRalClvmvlLASDNAJb9PqhCfL7VIgJAoGTAYKhDOAi1KEve6dhbpo0dzrRRQ1gqEJP+PqhCfL7VIgJAoGTAYKhDOAi1KEvesbtl4vQvuHqF9PdAJeLzrRYRAAIlAwZDHcJBqEVZ8g6uXSkCwNjte9LfA5WIz7daRAAIlAwYDHUIB6EWZcg7FYwzbdRQcQWcjryR/h6oRHy+1SICQKBkwGCoQzgItShD3tGr18TpX2jzRum/v2rE51stIgAESgYMhjqEg1CLMuQdWLpQBIDxisfSf3/ViM+3WkQACJQMGAx1CAehFntb3qn2oAj+fBNHiUbQsn9/1YjPt1pEAAiUDBgMdQgHoRZ7W97Rs2f169/dO6X/7ioSn2+1iAAQKBkwGOoQDkIt9ra8/XNnigAw8bxa+u+uIvH5VosIAIGSAYOhDuEg1GJvyjvZ2Kpf/06fwNKpT9J/dxWJz7daRAAIlAwYDHUIB6EWe1PekaNHRQAYPnRQ+u+tKvH5VosIAIGSAYOhDuEg1GJvyTud/sx8MyaLADBZ1yT991aV+HyrRQSAQMmAwVCHcBBqsbfknXhZK4I//6zvRDAo+/dWlfh8q0UEgEDJgMFQh3AQarG35B3+aa8IACMnT0n/nVUmPt9qEQEgkBcDBw4c/9VXX/0vTl4Lg6EO4SDUYm/IO538wHyTx+rXvy0+6b+zysTnWy0iAARy8W8HDBgwhQeA1V9//fV/cPINMBjqEA5CLfaGvOOPK0XwF1g0V/rvqzrx+VaLCACBvODB32EEgGA+gwF5q8PekHdo2xYRAEYvXZb++6pOfL7VIgJAIC/cBoDv3unKZMd49BN7fCvNzu2Js71Lwmzv0jA7tCbCbp5Mstev3nOF/FzwGSbpta+a37NTZUm29lSELTkSZsuOhtmuyzF25/kbFo59cvwsYjj9id2MpNkuf4wtaQ+zpZxrOyLsdCjJahPvXT2L1vYi6Wcnos/Y6tA1tiR4kS0LXmJ7I+XsTryBxd64e14oHWdl8bvsYHgX2xxcwTYEl7LdoY3sSvQCa0q1uP7vZr4AACAASURBVFzbJxZM1rLG6ClWFVrDKoPL2HP+zLrIQdYRf8DSb97Zfj/JOVve6XiUxZvusvCz7Sz4cCULli9hoadbWLTuAkuFO9ytLfWZRavesfbDCfZ6dYQ1Lg6z18vDrG1/nIXK3rA3Sef6QQz6PrKKa2l2YnOU7ePP2b0oJP5++0yS+Vo/unpWKv2ZPW98xw7ciAt9W3QoxFadiLB91+Lswau3LJVytzZf6iO7HE6xzb4oW8Z1bRHnVv73c1zfOlIu18Zl+izRwfZFHrC1oetsQeC80Luf+L8fJ9rE1908z5+OsBuxK2x/eDvbxPVje2yV+Dv9H33Nnb59ZP5EldCvF6F17FlgEf9zvfh3IFHN0rEU08aPYNrIwSztjxZ8XjoWYtH6S7q+cV0LVqzgf9/GYo03uC66XBuXWejBW9a2L85er4qwBq4fTWsjrP1AnEWevxNfdyVTrlOkW6RjpGukc/R30kHSRTfPSvCfXfbiDdt/Pc6WHwuzxYfDbPXJCDt8K8GquB6SPrp5XlPyAzvDdWuTFhW6trxD1zeyef4sfcv9fOdj/M0HdjfeKPSL7BrZt1Whq+x49CmrSvq4DXG5Nm7DyJaRTSPbRjaObB3ZPLJ97j4Lb1h7vJzr135h18i+VYXWstfRM9zu1bnyMcRk4DW3ZedZ6PF6rmvLWfDBMhZ+vpfFm++xdDLlbm1hbnvvvGGtu2KscVmYNXIfSPqmnUqyaBH+j3wm+U7yoeRLyaeSbyUfS77WyXNIzj0dSwAehNMA8Ml/avyrn//xz8wOv//0M7t66A1bOtLH5g3SLLljLnf6z3/PfvnlF8tn0deet/yezTsYYYNWapYcsc7Hjtx7wz787mfbtb3/08/sQDzNRjT52KDXmiUX+iKs+vM/2j6L1vbkd+1sTvgMG6TttOQo/z527O1T9vs//7Pt897+Kc1Opvexab5v2CRtkCU3RZewln9qKLC2v7D450fsaXgmu8u/x4oP/GNY+9uT7Oe/2K/tj79PslTNHqZdHsq0S4MsGX28lP3hXZvts/7y8y/sTcVnVj89xF5wPbBizVg/i555x/78z3+xf9/if2RndyTZ/MHWukbcvzzGwu1/sH3Wz3/+hd2v/cQmbw/a6tu4zQF24fF79sc/2a8t9i9/ZJvCCVtdG8y5MhBjgT/8i/3afvkzu/2xgU0IHLLVt/GBg+z6h1r2p1/sP6fxf4mwXfF1bLI22FLX6Gv0GnqtHf7yy59Y8MN1VhEYb69v7aPYq+2DWGTDctvn/fPHAIs9Xcl1arCtviWqNrE//i5mv7Y//oXFLrxnNeMCtvpWNznI0vc/Cf20A+kQ6ZKdrpEukk6Sbtr+nnxtZyresbGb/bb6Nn1XiFXUfxb6aYe2f/oDW8oDazt9G8q5J5piyX8psLa//JGdfFvJxvj32+rbzPBJ9uhzK9cB+88C2SyyXXa2jWwf2UCyhXb4059/z9reHmPl/lG2+lYZnsMSv3ti62MI/8g3J5GKhba65rs6gqXrDrCf//De9ll//PAzCx15w6pH+Gz1rWlehL134P/IR5KvtNM38rXkc3//2f4z/4///Gf2n+Y2/lVvxBSAh+A0AKwa1NH6aqSfhSve5t2lPLyeZstGGYEfN4K0K753IcVqK9+xhhfvWFX5G3Zxf5ytnRzIKO+RdRGWiHXfDXUEP4rdsGkEJ271ixOZ+y/fsJdN71hlwzt2oSLFVh6PsMGr9NeM2ehjz+q7n2rR2q6EU+xbI/Ajp7u6I8Iu8v97Hn/HXnDej75h+/xxNqHZnzGW230xlsizU2tLJdhivhM2jeAU/xF2IPKQlSea2Qu+K6YTmnOxF3zHfDnzmom+w6w6Gej2rPSbT+K0Zbo2XBjBKdpQtjO0nt2KXeOvf8Vq+U62Iv6AHeO73B99YzPG8kTkEN8Bf+j2vFjKx54GFmSM4EP/d6w+cpT5Ek/FaWAg8ZI1xy7x3fLSLq8J5z1d/MQ+dNzggd8w3RDyP0NPNrLY65ss6XvFkv46vju+z8JV+5jv2hjDWA5h0ZpT4vSx22lC0wdW92Ow0+l+HxQngOGHb1n05TsWfvKW+c4lWcP8zuDw1US/OLnp9r6lP7PrxxNs/hBdjxYN57q0Pip0UOgbfx7tjs/sjHXZjJzYEmWxSPe11be9ZzN2BTL6NnNvkB27k2APa96y6qb37BH/88z9JJuzL5R5zeRtfva4rvvaUlxnDgTiQs9Ij0jvNmr6CYypb7f437dx/RqZpZOkb/E8+vaK681U/9GMLv0YOC1OnB8mWsTX6M/T0Uo2m/9/tk5WJbXupxxv3rOj4X2ZwO97bST7KbSV3Y/fYzWpGqb9oZWV87/T/9HXzECQvieZ5zQ7mKxhFf6pGV16EpjDmqLnub49Y6Fkg/jzdfQ0///ZmddUNI9j4eTr7p/T1FsWrtyVCfx810bxf+/kOlYmdI10jk5jQk82M+3qt4a+DWaR6iPi9DH3eeHHb1nNJH9Gl+rnhJh2JsnCj7i+Vb8XetdxLMHqZnbqZO2MAIs35PlccZ0h3ck4XW7nSLdIx0jXSOdI90gHSRdFIMh1k3Q0necEj06SyaaZurTgYIidK0+yJ1yfyL6R3tEJ4IzdnZuRH7lONmnd10ancMeCiYy+jeY6tYfbstsRbiu5rpHOXQ2n2XotwoYZr6E/z4aSPHD7pdsJYH0qzKb7j2V0aXHwgrBnZNfIvlVwfTsYecRfczzzmvmBc6wl1f0Ej2zUicjBjN0iG0a2jGwa2TaycWTryOaR7aPXkC28EbsqbGPu80LJelbhm5TRJTr5I3tGJ8xk37TEY27vjnTRSbJ1sXSwu76l3xv6ZgR5NyawyIuDLN76kOtbrdC3WMNVFnq0tnMzcnWkOIHOd4IXefqOVY8xAj/u/16vjDAf938Rrhtk30L337C2A3Fh00x9o1uPZEd33SWfeHhdZ+BHPpN8J/lQ8qWkb+RbycfOMza/5HtJB/Ot7UH1W/btOm5rVna09kZMAXgITgPAF7/tWGsqdzs3nOmU3sOLDNyFffGMsh6mo+7Wj5a5CKnkZ/boZpotH6M75k08EOho/pD5OjnjsZt04ziO/3mrMs2SKet+Yc2+D+KKjl5PweDpsmSmvxhdn2zROnfFdC3SlrReW5K//ho3lmaw+GNrkLVmvf5Fws9Gaj8ZQd0hdjf+mv8M61FWTclYJlgcqu1m56MvMmtLpD+wHcF1GeNIVyFaKmT5rAQ3WNejV9k0TT8lXB2YzzpSwczXffHnrEwboTtZbgA74o/4z7JeWyTZzh3zXPH6e9ow1hK9lllbOvlWXIOYTjb8/CeWikUsn5VOvWeRmrOZU8LA/UUsFe38XYJ3uTMabjjZ7wIiqLPrARerf88aFnYGgu1HOvUtEvrEdi0IZZzshZ/iLOS3/j0T8c/s1qkkWzxc17cN/Odn69v1p2n2zRoj8NsTZI9q7ddW0/KezTsQyujbyXud+ubjujK3LZRxsvu5Iw7ajDqL8e87Fkiw4YZ+zuT61pKlbxej1WwY1xvSn1k8wHvKnbBdnk9VwsfmBPRT6SHaLnY2WpVZG+nKSi5v08mejhxj0fSbLjlCBH3TxN/ndFq8xtyc0Pea+knPbIpe4roz1Aj85rFgos76M8+DjcalQ9jDx4My+tbM9S3z9Yif+e/O1PXtynAWeXVK6KDl8+JJFnl5OLM5CdxfwPUzmllbx4mksFMi8JsX4puS99a6y18f4kGhGQi+/EZjfuFI9a+3840L6QzpzuIRPnbrdFLolNXzSBdJJ83NyS6ux6Szpj06wgM7M6hbeCgk7J3d2sh5f2dsToav1djdqk6ZtXNdWWDo2xDOE8Eki9vorsZfv5tvNMxgcXUwLjYd5s/K1jfSo8ak9WeefpeyeBPfbOibk+HaXvYo3pb5Oukb2ShxusdtFtkusmGWa+O6RTbQtIdkG8lGdurbZa43QzNBXSRp/Vkgu9cer2APjGDxPt/MZOunrm+zjKDuW76pvc3tywfr3zUSZKGnWzPBYujZ9oxtFfp2qlPfKMUg3mz9rDT3fwG+cXg1Tg8EX431c3vX+XqyTRtnBIXukI8kX0k+0/J9476WfK7pf8kXZ/s/2sia+vbbFR1reyOmADyCAQMGTOLBXxPnEf73/1jo9emyT+zFUEPRV0dYMvyRndquX4ks4oazsuyNpaLm0tf2kW35MZg5xn5R8Vbk+o3a4BPKSkFdKOpsTigpPAV+5mngmpMRFox+ZBuM4I9OWh5GrR1KLpsSH9gM7ozpe0cZ3/s8obER3MiRsdsYusXC6XeOnkUB4pHIYzbY2C1T7lYo9YZtC64Rhm6Wbxx33C8cr60x2cIW+qeL7/3BN5qvq0oEf+RUydi9Cu3kgayz3zXNDWxd+FBmt/witJGlEmkWKF8qDF3w9hSxE3a6toS/nvluTjFOcEazhK+WBe+9YS+G6DrTujvGHbWz5r9iYsTlVEbfmjZEWST4kW2brevM2ikB1vDS2qHk0t/Ov3dOKHOC01T7nl17ks4YR8rxS9gY2ty1nXuQYkMMfdt5Kcb83Ll+1xIQOjOV/1kbd762Fq5vMw19G9vsZ83832d48Eb6QnpzmOuP3Uajq759Ziciz/j37RLfT99LznWeb7LQmcX+GayZB/+535cbAGY+C8k28T30vfQMXyrM6nlgqOvMYNYYOWO70SDGrt/Qq383rzO+d7D4fgoik2Ef810fK3TGf/dH4Zydvm/JQBPz35qmf++d71kyFmctO2L6xoHrnHYu5bjZdDrxWeQImpsOCgJJR8wTZNId0iGnayPdJB01vzfCbeWGM1GhL8NWa+zKY+dri/G17b4cE99LOkc5g1Wxd8I2kc5M4fr20oW+VfLvnWjcdixuD7Nw6iNbF7qROdHbH67gNsSZvkV5ULctdFd83zfaHvaYB4Fkk8g2kc6QrSKb5XRt9L1kE+l7yUbGU0mRS2rqW0PkREF9y+gH38S8DG0R31umfcsCiVoWb68Up8u6zvzA9c9+U5VN+l7tqv69oSdb+Pe+Z6/XRDKnftrppGOZJvmmgIJF+t5qbo8oN5B8oKlvW2cFXekb+V7ywfS9p/lnIBz5yFYbByNDub5dfpRCDiBQGshBUPI+7VpIcR+O9rEF/M8l3/pY3XNnAVE26aj7+ObOq5Xx83SHuvFs1PbUz4pP69+Jq2BxJbyP/9mgX4nUuDCOnYbts7i603fXHWxYu36ysitcVtQEA9odj/HpOTWTfFvYRG6UZvvGsxabnaz12t6w3aFNxu56GDtnBH/kXItZmxZ/xsp9Y/RrlboJrIOM462p7Oc/vOsWEBRimgeQoSebhJFs2b2aO+IOoSt0/eZ2XcRIVefVypXxfqEnG2cEWDjgzAl00bf4Z3Z0g65vS7jufrNE1zcKBItZG6Uc6FcrGht3SXeoc9pC3KG6XxudBq7qiIhnjGluZ4M69olTvHvx10Wt7VG8NXOaM82n519tDC7rcuqXTasA0NQ3StqnZ8znzvm6cYrni1c6Wktg+WIRAMbLH4p/d8Qfcl0bIvSt9omePhB8tM721M9O3wJlc8UzXq87rZ/icXsUfubeHhH919IZh77PcMZHN0ZtT/2sSKeB5unh0ql+Nni5nqpCxR3FrI3SEEQQyB368DL9FG89t1HF6BsVIE1r0zcd41sauL7t5vbpAHvI9ca1DLjuHoo8ErpGOjdBmyJ0ZU9os6W+2ZFsItlGcdPB/7zN/yT75ItXFbW2mvBeIwj8hjXeHZIJ4IrRNyoWoZSXjgtDWN0PlXoAx+1T+Kl7mdJpYDPXLXpGFQ/eNmSlqhSjb+SDyRfTM+ZM53ZphSZu00jf6HMtO34APA7TQcTaPrBHRqLr5aEaa6wuzqCZH9Bje/VTxDl8177pUEScYhT7vBb/B/bNFt2xf3NSY/UJ6+N4J2vb6OswrpCb2Zbgo5LGVzUlw3yXvF0YynHa4qKCv+y17Q+uNXK5BrGn3MiVsrZwvImVtetOufr5SJaOBi0DAidraz95kgd/rfoV7rFg0esiBivfsUrjiuUkN7ZUaVnss6iKd/MC/RRx5giNnbldXGBqsqL2LRtknASOv+VnoSKcsUm6vpvR2qbrW1MNuxytL2ltt2N1XNd26LmDvuW2ztguACTS9y7zTdWDQDq9i9139n53hETlrzaB61TWRqw1fE0/1ekYxBoqfxBpBEXLNJ5kzdv3Gyd/bSz0OFHS+9ZKV3r8Wc85z84JCp0pWne5ri4drzvl78dwR19XvK0kHroT10+teRC46HGo6M+8kPMf/8RGNuv6NqS5itUmwkWvi9axO3zHOEXcxjYFfyrJHpFtnKmNEPq2nG82giXayhr/Nj39oH0Qa63bWtLaEoEWVr/wnB78ja1j8Tb3gWRmbVy3ao1TxGec93bESlob+eL5Rh7q7Ckaa/V9yMhbdvwAeBymg7h2NMFWcAV7YjhlyoEoVmHbAx/Z6A0+NnmSrrRrJvuLOt0xSQnQg55xA7lWd8pULFLssyiH75uOvWxQ8yNhJKe3BEpy8JRcP04bwwYbQeDVWE3Rzwolm7hBG8aWGTkzS/0zi9ptmwaSTmAa7+oOmQxle7ys6ACQWmu8GKbrRuOKPSxwb05Ru20iOd99y8JsK+2SjZMZulYu9n2jRPtvuF58P8qoSJ8XEifRxTwrwd83aiM06I6WyQksry7eGdAp8ZCOn0TwJyrS20K2OV32a3vPNgSWstHa9ExOoN3pTqEAkE6Jr2tD2GxD3+hE0C6ny2T03Hlx+hfaub1T33iwFyhfzF49MnMCh4o0hmLft2D5GyMHq4M1bV3Bgg+W2+Z02b5vXBe2zw2xg2bVJt/gUoFSsWu7V/WGDVuisR8Np0yJ+8UGlHQrMYtSBS4YG9w1WtGniSRn6mQwqP0A17VGoW9rOiJFBx9ke5b4ZrJvtdmZ6+CaZPEbv9bYTXbR2NySvv0U2lb0s9KJJPPdns6qKgcZJ4EjWDRZ/CQa3/mUkS/axFoPT2Phqv1FP4tOiddM9LGThr5Vj/axREfxG1zKSf5mIQ/+jOvga8cSGXnLjh8Aj4McBFUgUauDBUM0Vncxped38X9TYr9bZSVDSBVwZMzWntD7t4nE6QUhlky4N0QPom+FIfuG8+KLlHDIlDNDif1un5VIfxQVl2TMtobK2BwjR4t6ByaLMJLlsTLjtG4UuxB9mnHKhRL7875v6beielfP29vDlvtniWdvDq7ka3NvPKIN1/S8vevjWUvwfCZR/8MfWlwHgJTbYla6te0PizwbccX3cLXj3J1s3jiRFDqxaoKfvT6eyCTq09Ww22f5Qh8zKQIHL8XZ+mn69dzB1ZFMkYkbUpEH6QTlUx0pS2ScMuWyun1WayrBnadeYLQ/VCnyuujZlMdajFM+YCTUz/dNYYfC5ZlE/QaLxH67ADCcbOVOc7jQi6rI0Uw+If2MQuvwz58lAsBEpZ7nKooujBQBSjNoCB7O5GhFUwH3ulv9XuiDvhH1M9/NSeLZVCTi9lmkAwdX6Qn1pBtNRk4gXfElizh1puBsmFFgdPpaQugwPZt6url9Ft2KrKDNBtcJyjXdez2W6ZBAvVDdPu95UsukCJwK14vcU3r2pZD7DTPZHOrpRzqxzDeL7QrfE8+lSuFY2n0g7k+8yBQYvYheETaTnl3u8NS5q0w/8A2BntPsL5vHXoV2GIVLs/l76n5tVDAkNhucgTttomiJnh1ve+b+feM+bqdR0LZ7YYi9XqufBDbw/yvGHlHB0GAjT/TGzZTw0eSryWcjAARKBvUaWmnkYd0+rRsx38VUJu8m1uDuA3XkdsJoqREQRiwS/JRJnKbiEjfPogq3MUZS9BXDiJk5MyPX+1hTh7u17Qs/EEZshv+EMGL+1Cc2yTCSVEnn5lnt3LHNMNpqUAsE+r/jkWfi+SO1faK1jJvn1YR3G0Zsrijk8KUibI5vonj+qcgRd0Yo1N5pxNr1UxhKtNZ7BY7lgXDc1fOoWEMYscVhYcSoGphaLAinXHPW3bNq3rMFQ3UjVv9CD/jaDiYyLWKo4arTZ1HgscJoLURFQvRvqqBbMU7X5/uX3Dm+57F3opqSqn3NNAMqJBG923YGWNzFBoacOzV1Jn3YErot1kaFIKMNfaaWHm7W9iz+TOjCDB5UtXJHT8+j3FWzmjhfgr9VAEj69dho41Ib/kn8Hz3zO+N67plNHmDydbsI/nzTxnNd0H9mrPm+USQ0RhSA0NqqQ9vF858FFrvaJFBBUe00vccfFXCInxlsMaqDB7OE5u6EvYzrAOkC6QTpBq2Nit1E0duKsKtAnOzZhC16N4NDN/XPN+mw2DxznW6yqUzOR6rwFfl63AZR9S/pzKLDuj5vPBN19Sx/Kp3JRz4afSL+71HW5vm1y7SZk9zmkC6QDSJbRPo1y9g87+DBoJtnxVJBdl/Te/xRgRH934NYeaZtUbvLTQJ1MBD6dnMy15cYf9/esUf+GeL5VADn5lnUyqp6pK9LTjO1hdE3z2NtOyXko1lAuW5qQPg+smc1k3V9bj/qzic0tH/I5CNfeqjbMqpYp+eTz6bny44fAE9j6b85sjaeucbI3qG0bI9lerulHVZSUgK9eUL3sikrN6jxQyaR9Xm5M8cnjKGxO16bdY1Bf245r1fezdsfcpxbSFdxZkJzfbIzL4Yc/XDDKT+LOTuBot2x2Q5hH3d05v/T2jaEboqfQz0DnToXLf447zVGQ7KJTdWGsSnaEL5mZ4UDtDs22yFQP7/stVFXffo5L0ObHBuhwO03maq27GuMhK9O76XFHXMy5OzEk67izAT6K4cTXdbWsCgsfg5VfDpdG1Vdkh5QUnQg0hlkvOQ7+nlGIRNVpjt5VoQHM5ONE7rTwc7THCpcmvWT3ruNJjs4XdtZo+J3ku8Ii2Rdq97hgZ/Z281n074om+F0ks32TRD6djt2M/P/ca6H3xm9245Hnnb7PqsAsDFySugBOc1U1tpuxW4YTn+C+Jl536fjx0UAGD6gX5GRAzZ7RsZbHmR9RtKswjc5Uxns9H2jyTGi1cvsrnYnWns+c8KYTjqzISR7avNCulD9qPPGIBn4lCl68191Xiy0/aJ+QkeTPbI/21cOJTLtiJwm+jdyuzPM6Bf5IsvuUPoMbW7p59x+7nyTYFb8bkzcYm/edK6BNrZm+6uEQ3tEtoZsDtkeskHm/zcnY+LEmX5OebzZ0bPofaLefrrd2dzlfSPbSfq2JrDA8S1HQqs2WguN4BuDzvSHcLIl0zXBaWEJ+bv6uXprquat0S4+hqaHiHZE5Usdb2Ce33+T6YDR1tgZcEdevs/cqoUrHfoYvrbvjZ6ROy7GuqyZ0mdMn82d+L+WHUUAHsXc37bPNK/icnP0qIVC7fdBx/mAwUjn7pjat+R+nRpa0s9aPdHPYg5awZi7Yzqhy83RoxYKdMJIP4tK4Qs9i3bHY30HhOG6EH3Z7evnQinxs6bxAMBJftbZyAmjHcK0bjl6ofRbNs53UPysW7GGgs+K8921Wa3bGrvdfW2Rk3rStH+WIyMpeqkZ7RByk/AT6Sgr948WP0uLPylsbNs/ZnbH1Pcv9+uUJ2P2bHNiJGnUkdkOIZmzqYi3fMz0FXRSfdfi+yAmxpAOVLzqng5gNvmlEUtOAvHthqOkHmy5m4qGtg+izcfgnI2NFRuTUZEvRTrwLE86wBqjMniVw/ysPaEtRjrAim6vr04ERNoB9aSsS3ZN+M8XAIaSzUbvtSEsmOiqn/TsTca1317+M3PXQV/3/zBVv/6taTTyTNfqFZjcYXb73CVeGqkH34gelYV1971+FTdM63bzQPoVuK9Pd6Bmv4WeRWvbs0R3lCe3dj9No/QWccvBA8R4S+HTsSd174y+fT7W6u/6OSRdNttfkY4Xehbpl9lbcq+/++tpHKZ5y0EBYaHnUTAmphT59rGPP/9jF3lTJfoMY2NzIM/PymUy/YEt8/8odOBc5FS3r1+L1YqfRaeNvlTh4LktViZ0oNw3ntufrraabOcCbkP1n3WysEy5PfPfnq5PKarvPnu6OXol87PiqcK/q++SftNVMyXQrZVVOpESJ4xObzmosbiZDvDwevf3pcMoQnrFX5MMFraVp+7pN10UBOa2siJfbd7azfv/2n+QHUcAHgVXoBBdX1i1e4m8eKcbSe6Y4zaNoIlmP6ylR8N5T+VERdki3SCf32v/4aR+a0OMRqgvLE7lKAfQNJJayH5tK4NXhdFaGbyS1+HSemcb+YCHA/bH9DWJOjFJgbrc1yUa876GmknrRvIAC6asd/G0lsrgciPvb33etVHj1CX+74WRvBQ9Z7s2fXdsnMoFu/fpEtXenyv0q2DfBHFKY21sP2caNzdvyn8dRUUgdCJjZZCzWf34baa3ZNvr/A5XO59lkKPWgRHlmdLpL8l/+8X8J4bUqNc0kg8KnPJUGFdlNFKwxeJU7sRd3SBTA1+7q+Dsq7I94fK8r6HUAzO14VbYfm0P4w8zeaZ0FZfvNQeNdh0z/SdFnmu2vLMDQMqPeuyfabQXOpr3WdQT0MzPehR/2FW/XtWL4M8/c5rQ1VhTWedVWTz/Z7o2vC8rtcGmmXz8s2goLjacJ/JvOKmfoHZ1hKP8LJK5ubmNWqQVmLcc1FjaLj8rGu/ccJ5/kH/DSSc+Zs+2VwUKTMwNJ+WExiw2ANQ2i37eokP57alJ6l06waePE7wer8t74lvH7al52ljoluNi9KyQ/RL/D5mmzdkkua8JXhc/b2nwku0GJsGDMHNz2xGvyPuaOr4JIVtKNrXGpvE4MVJ9TN9wls3Nu+HUTxtX63mtwTW2z0poH0WKk9hwPs4vL+p5SpOQiMmA/YmnubklH5fvPSH9alyq33I0bbS/3qcNBuUdU+7fi9f55VX77J05LjMkO44APIrZv237X7XGf7ItCjCbsNIAbKsPOyVG6TZLHQAAIABJREFUk7GifAWfTTBGHfgXDtPzv16/yn+SQj/D7IRfKBjbaASda09Z52lQlaQZjAVsgrE6I+ik2ZoNFvky1LjXLM64YOSyWP0OZtC5KdT9VC/zfsTKjWBsIje21qesZtBJ3fcpVyvvz6SrX3N3XHcx72tIzjSPkoas08+lvEOrnykaNlMwNsk+Ly/R8TJzJZOK5M/lifPdNZ38koEsu2B9YiuuZObpQWerzSbhtJEHOmV7gDtn67VVPXibuZIJWFTh0enyOCMP9KpNMEZXMjS6i34ujTC0et2xyFNHyfJ3javgUTZXwUHuQM1xgWUx67wrugr+3n9C/FxqUJ4t7+yAoCFy3Lj6nWmbLF8Wu5sZ8xXMOkkJ798nAsDIiRNiSgc1BtevfvM7d/0z8y5T3NQYOW35OhqpJVJOZtmnnMQabxpjvsaLStB8r6Fmu2bKCTXitVxb9JPYbBTqabnnip4HStNi7IIxGuVl3nLELarQaQqROSXmqU0wRvmGk4zRcna3HNuN4owlQfrMf7Ys+jlj3KjQLYdVwRvZFrIxZGtqE9btiuiWwww678YbLV9XHdqaCcbsAkWypaRvK0QRR/7PM133iqlEnPk2tyb1oHOscRVsnctqNntuLhCMZYLO8sWWvwP5MvJp5NvIx1muzdcZdEZe5Jc9/YxlR/U80B2X7NNhaKMx9z+3/kfZcQTgYRRqCyIqQI18mXzXgGQQzRypfFe/ubx+TM+XoSuTfONw7hmOkaowrXbHJv08MDGnjDzI06qDTmPMHKnLscLTLw4YFaBz81wDEu/GbgtDtYg7tGSBarOOVCpTAfo4a5xS5/v2PpMj1R5/UHBtNLuVfva6QH5DRCdwwlDdm215HWsGBLFUIFMB6k9Ud19b5BOrNmQeelS42jr0bKdeFfxgWd61mTKnEVqFrjwpKVtUgA7OXxVMuX5mYrSTdhnHNupXwftW5O+H9pMh82Xtha+K69s+iA78dBVM4+Nyv96eSoqrX5rYQVezhda2zrgKpj/zfX1/aKeQ+fbg2oJro/YcdBVMfJ2MdpG3mGuabDeqMIeKdkN2z6KfZU61oTWI/+OBi2/KOBEAJps7WOjxBuPqd2PB35OummniA10Fx/KMRqSxbpmr33r7z5W4dq5YoV8FvziY9zUka5L5MYuT62yK9kaUI8g3Cck8rapIxwYbleCFis5EYY5RAUozg/N9fbGR17zdQdEZzas2c1wjeaqCKb3ArASninO7qm+yZz8atxzn81QFU+C1LrBIyPxouHALlDuxxkyOazzPyS61ANLzmkdymdv3IqSTRnMS0r3YnTzv2ycWKJtnVIIXLohrid3I5LjmO3UOlb/NtGdJ2oyc1PX+Ld9sTDQ2Og+7fZ182JaZQUuZ59K8ChYbnTynzjQW0ByZWmhqFqqAgZLhpC+cWQhAsw5zT4PM0VtTdwQcjd2iMnmzEODO2a4BI+XfmYn4ha7Gcn/+xC3djSTl+5GR+t5/0tHYLQo4zVYdF0Ld81XMTvZPHOTPES9Fq8XPn5zHSDZGzgoj9TSwwFEeGP18s1XH3ZxcQWqaa45CSmjWgW62g9Dnvg4SpzO5RrLtkF6VS1cWTn5PkS9jVAXnngZR01wxs3ew8yrJLkYy570xx2etszn1zSZVyq0Y6897NUfXvcOMVIMmh1WSZpU7FQLkfm1z6LaQ93aHVZKB1Ccx0pD0LXfsF41ro5MYmttrN086m/vCFeLnrwpe6yZvOoVxUyVJP9M8DaK1xJ9W6aPfFswW4wH1maujLK9+c/kqvEtvSJ5VNCV0J6sAyGmVJI360k+DhnU7dTZTDUjmEQe5VuK9Nlp10FjD3LWZp76nHGxuia+5jpOuU/FJbnNzc3M7gW9unU76WHok3KXqOPMecHs23djcnou+6CbvfM+i61/z1Dk3r9rc3JKNiTkYO0nvzdzAWfHzT0a7nrTpm9spQt4t0euOfk+yqZPEJKUJ3fKqow1XjQKgaTwgK7zpo4DxkZHq0By92nVtkc6WVv48uXr5mEl1uDmlW171nTPJTAGQkzZn6fhnVjM1kPfn06kvBX5OC4AQAAIlw0kASB92M38h+2oukqWw+U7grEg5h+Yg9uziE7Pwg07gHM/75K+jAey0BnLO5v/TNQUlRZOBctOX74mRDzY25wTydORYplmu07WlsowkVYWa/x9PxUSPNDJQuYn4TozkXN+kLg17zWIMSsgvZDBMeZORNPPBWmO3Mq+hwg/zBM5NCyDTSPpvdw0ozbYIxx2cxmRkyjcS5tVcdoNoOoGhCnMqyGhx0cOt7GIqU3ySLbv1xljAXS5aAFE+mKnzj7N6UdYmQ2LGL53GOEmON3nS0PmFOTq/NbjaaAGUP1cvH7N1/kXCn5F3MFkr5HzfN8o21SCXp4xWILSW0I5t+vXvhQsscH+RnmpQa5+Tmk0qdtJPnQeLis3Mmh+97dxcumjeHX6+1xj/1VnRTicqZjFGmYsWQFQEIuZTD9HECbT5/+ZpDKUauBljSSePuW2v6Np1msvNLZFOnenEmU4gswtCqOE8yfmHrM1toQCQaI4mzC4+iXNbQjaFZP003r2a3IovEwGxBrrp8GfpfFP0orG5ne+4glZ0UAjoownPRI53/j8P+My50okO5/PVzQKk+74xXXS+/Yi+uW2wyNWzWlugbL6h850FIdTw2awydzM21TyBFDqf1b1g79V4Jo/eydoQAAIlw+lkCDKMZCBfDtMy7UAoF4oUdskRd/20iOb81gtGry/q+TfCOA2pdjnnt7b1fSYHMWh8oPYYjXLN0xA3NNvPmFclHalg5jTktYsh6MTKhJbJQTTbgZinIS/zVFoWMkTUMoGM5FWjtQb1XcvkxoTz5wdmG4xseWvc2Os5iJMy7UCajDmWLS57NpKh99+ZKYxkrFEPKFvqP+i5MTygdDMEnRi4pc9vpZ5wZk6YOQj9p2vu+hhSlSb15SJ9e2qkMbziOkYy/pbrnN/lJBjqyUXrmLknmEkVoIT43Bw8J6RNxgQjB5GKUej/XiZeCRnP5M4rknbXy/B09LlYx7wABWefRc4nnTKTnF9HL7h6Fv1sWoPodblsuBj/Fqu5a+TgTXB0GpNNMwexMrhC1xkeVNXN1DsNUM6pm2fRyaN29Vs9MPA3iv97cudNpgdbbpV5IdLGVvQGXKOfLFPAN22HXvhxu9Jdz0bSddJ50v0WYxNF+aUk4x9ag67HYm6/EMvMU6d/022CmYNXEe+0R04CQDrpNnOdm41Tb7IlJOO1gYWu7bjZ9so89U6m32QKPwIJdz0bG7ltNXOdyebS/2VSW8qXunoW0Tz1rjWutKn61szBi9W58zEJf4Nx6j1C5L/S/5HvEnOlN7jr2ShOvZfoByqU+0r/R8E9NRinDW6z5mzjjQAQKBluRoM1b41lerU1+/TWGKSw1LDS7YeTkmXnD9GrQgPaR7bFOI3ZpLn7MJmkQhCzVxvlQJmtMZqT7oIF4lPjqoQcM/XO2h3aJAzkQQdTEvLRDA6oQIBOP/R8qOF586EKsdoIDihBn65KaNyb3vOvcN5OroMgQ2QGB3QlHH31PtMao5gpCVSZqV+VTBJXJT8Z/aouH3I/xzU7OKBebc+NQiPK+SyUG5OPT253BgeJxKdModGJoPsJDrnBwWOjxyS1Goo6GKWWSzM4+J4HB0kejK4MzBUyvha1r6zOKwMeHEz0HdZ7tSWaWfr31d2CfFdrM4KDZRVcrisWZabAmEG+q/dNBAfj9AT9RFXeIN8NIzWnMwn6JFMzyKdA0PXaeHBAvS5Fgn7Vu0yPyewg3w0vH9TzXqlnWzxPkO+GVFhntjyiiTRnjB6TFORnB2xOAkDiHiPvldoRkQ0xC42qXQZsxOy8V+qvavaYfG4E+W5pTrshm0uFbWb+XaKje65yIVJP1XtG3msk2ZHpMdm0zl1zZ5Ohp1v1U+dn24XPEkH+EPvCDyvS7YroDThMEyfQO4wek9suON94IwAESoabADDe9lG/KuHcbeSmUE5WMR8motmr7dCOqGhRQA2ZNYfNcXPZ2NF5VbKsRd+VUk5UMc9KZ/XpOhxoMiYwjGSBVHG/66tkMHNV8iCgt31pyLrmcEtzRNNZbYcxgWG0ZUVkrsHIlXeAB5Sid5Y2htXPN9pwHC9uDrS4Krm/QKyp8tLdTC5WLOI+YCOGHhpXJdTOZY+ei0WTYIpaW9b14NFzsUyAX6jQyIrm9eDkbX72Q8cpId9L0cKFRvlI14PfGdeDewNV+rg3/9S8bTic8HqsTqznO/8x9jj4vZBvW+xuUc+iNcyrHy7WdOfBYqPHZP7keidsiV4T63ncPofVTPZ3u+Z3JVORoK/nnt49/ipTXFbMyC0iVQKLgHR2kE3YrAdcVIhRzLOo9YyZe7r/nr65ne8itSWXx+/ouafzDgbZaE2f+PE80fXE32kAGOSbjFHGbcvuwLXMyMli1kU8ZLQhWswDUir6IPmGHDauzyXZWJp2Q2t6+fpoVp/R4t63uvBBvRK5YVtnaotFG6pCTEUjxoSlwez01nbLHpNO2bpLP1CpXR8RxWV0oNLmoO9jtrxlxw+Ax+EmACS27NSV9tAkXWEL9eCzI41mohFK8ziHPdHYwQJtXwpx8zm9Lcygs/dFsBVKFzdUndjZG66WTewYYtv2xQnN3lmrtDniFCSZLs7pEalTPxnI79qHsMar1PbF2aQFKwdBu/XyWws6x7G5yMXKJY3q6rg4iG2c+KSocWzZFFclC/S2MOu/09iUbQEWL+KkyKRZIDBnjMYG12rsuotcrHxrm21Uvw+6dU0k5Ocbx+aU940CgWFNNVzfholRWcU+i3LCqPBJXM1p00WuZzEzm8XvGU6xGxuG6AUCzUNYGxX6tLq75u76vn0QhUcVx7Z0Tvwo0rkTY69vs5Zz37DlI+v1iR8WPd0crY0S9I2xXQtncR4sPmAjmmPofuS6O6hRY1UOJw3l/T0TnzON9gc9OS0mDeW+xmkASDR7EQ5vui9k21CgMtyOdOptNto/yTeS1NO02GcRzbYwG+uKn8lrkppPU7714y3H9bYvW4oP2IhUhVx3fAJbMKRd+C6nk4byrk3TD1SeD9HY6CUa2+XyMAUBIFAy3AaApLTPSWn5h2nPIWdVonY8vF0f1D5tjeY6FyuXVBgweHUHG7S6nW1reVTSs8jwT29p10+K2jZ0q0xzy8ZkhA3WdrCh2jZWGS7c9b4Qt2uLhZE8VDW8W2WancHIJ29qC/J04U29EvO8+2vpXD46elDIdM2E13lb/bhhuEpv0/GI69ztiuKDSZPrFujXhD/u8xd1tZfNJ3V6m45BG5rY7VDxDtTUt2ktDULfZrQfLynwID6I6c3IR2mbWJuLxP5cxm7cYh3fDmJLa74R+na5amrJa2sPPGbPR9cZU19K+1xRYHtx3Qm9zdDcxpL1o/Wq3v/y6kjrJrxOSbq/eJJeJLD0RrDktZ18YGxwD1SKoqPcr7sJAOlaekRTs9C31f787XTc8Ej4vn4tze2Sk6kvdoyk0+z7Dv3Uuariu5L1rab+OKsa2sqDrfaCAw0KyjQeZ4fnnRUyPb3NPufa0drW6RXoO6e7P0xBAAiUDLcBIDXe/WmaPrKrelXpAeCmmgibM0xj8/guqKO5uKN5k/7UGzbk9ANhJNefL93gLtVOGhXBDSUHCzQQfaG2SB+mHnKfP5XLV08Wsckdg9i0jiGWEyLyGYx88qbeayTP5yMbWK12uOS17ZijX49c37SFG8zSTnUp9+/kOF3f2o6U9izR1uO+HgAuGulzNJLQjg/iLdwZPxf6dq68uKtpk3Rq90PHGmNOcJvjua1WbI3eYdO0VULfbsbsJyzYMbBiCdNGDWJlZSOEQ16gTXTUUsmO2jn9qpU2HVoJwSmRZLj02zYh06qT60oOFo7ejLP732iZXMBSnkVXrROP6tNBNs8r3R7t8VWwQetbhL7ReMLcr7sJAMlmjGndJfRtUZvzLglWfBraIza3tMltS5X6Of3Ejr7Qi492tC8oeW2vt+i5nY83nxKNokt5lshdH9zBFg5tYc13C+ddF+KufXoxyLPhmmhM7uZ7EQACJcNtAHiuPMVGLuUKO9R9q5BctiU/ioq0KZt1I3m0QFf2QjwaecIGNe5ng9e0i+IUmhdb7LNakh1sEg+uhjZVCiNZFintpKI2fIBd0EawIdwhD9N2d2mb4JbJQJO4GtlZPVQYyRMOe7tZOQgahC5O2XYfEDk8pVxP11XpLX5WjHrN2s4PFYn6pbxvVPk7bYGWaZuQdtBry4qPjGv9Hxfo+nb3XGkniosCF9igp6cyfTBL2SRUxCuELEc2PxFrvFbi9fRj/yy2V5siAsAfA6eKCoxSWkRU/mrLhrEOrm+Lm/VTmYcWY70crS3V2Qet/M48Vhl0X92ZzTvn9GvW3T/c068L258X/SzqY0pNlzd8p3WpCC6WxwIJNrhOY/PH6PpWX0JASR0ERGP5i3eFvm3NUyzgJgA8Hj7IJnYMZ8Ne66eAtS47L2ST2lrd04axJdpCoW8/hQs3trd9XstDkdoyvX2wqAq2mn7k7FlmsUUbu1czVhSplLK2o0Zj+ZOLj4rOC6lo8TcmFMRTk/GzxgZXc2mPEAACJcNNAEjVj+Z4oudG0FBKTgX1XyPjs7U+KqqBqaKq2JwKqn4cY+ShrLvkK6pdSDb3hbYLZ7dGu64HDa3F5yoljTwUqv5dn1URXOzaaPoCObu62r2ZApWIzVzfbIORK2+q9qXWPiIXpWFT3uaprt635Xrl780jLcac2HGOr6hzSQE8FfYMX+tjtXP1iuDAzeIDo4VGYc+Rcr034Roac1fkFXVdMizkSAn5NB9Y9MJ8VVz+GekVjcESleaBp2KNVBRSbEDZWdgzmU0JHslbMOCE0QsXRe8/7exIIcs7bQfEGlcG5hT9WQg90At7amf42X1NbxcSdtlaKaO7yc4Rg1XX7mcqgovVj5vP9KbyS/YE2cvhPrHBjbcUa48+i16iJMtTx2O202ic8LzR1H5x8w29YIBSZnKa8jsNAKm9DxVaUHC129dhO43GCc3K33vBraIXJgWq4SLzr0mv/HdnCVkeadWL3fblNA93Q7O9T+OuVv0z4RtbVDU8kXyT6FwxXGNt9/Xeq+HnPxW9NjNn/fSBSGbspptqeASAQMlwEwBSd3JSWOqOH+/o7AuYdNhxv8uHKWsKA83HPLNTN5IXfiouaKNRb2QgFwYuiIbBtM6R632ica/bZ1EPKhpQPo3vaju4ozengxTTwoFI/dfMmZjVRvPU8b6DRRUNiCkIlwbrs3fjyUzD4CsOerzlcxBmY9TmTVHmi1dlTQdxv7bmuvd6vtMon6j8JWestwy5UdT7Zs5gpUpzGkNoNR3ECV8YrX1o7m8s9Uk0haa1Pr5VXEC5xZj6QRWQNKvVajqIE1YlXmSmMMRTH9h0Q9/Ki9S3quA6o7XPBXbtQ61Y55oi+mHS1A9tziCjwfcMluCBvDmNhtZczNrMqR/+KylWHzmadzqIU5LszAbfKdEweJzRF9B6jq0V01kjLe9VvclUaLbuKdIeGUUW1FOUPgs0j5rW2lLvPvigjcA0/zF9rGSiTfQDzG18T3QaAF7mekEypHF/dE1N3RcGu5iG0/V9+8CDqvGZyl9zBvqZrMb3bmi2kvLfmsp9RIhN5TaYbLHZF9DV+xb9LEb8kRypj+2zwGJ9OknsZlFrO79X7/tHvioV8fN1DuF2+JtMX0A3pJGWZt+/juAHVvejscF10cIIASBQMpwGgNljkczGqE1GAiuN7nL7Adhn9KLabPT9o9wKGqFEQ9yjYXfBR7aBNBujLjUGatsNUrfi4bB+snYovEc3mIYxdzOhJNtAUg+27MaocwJnxFpvx5xPATEZerajyxxUsy8gdfIvNJ8410FQtW/1GN1ARmvfi9+N5mcWGqRuxSPr9euRK4d1x5Qx5rfdB5Q0Fol6n9EVCfWcpJ2xOcLJapC6Hc0JCKeMvn9m02Ca4+lWpnR9T9f41GdSS6VEheZoYyZ1vtysQtwYXCZkeD16Rfzb7As4r8399VI05RcnzWXaCHHy/Ps//7OYTkJ92lpd5GbRvF9x+ndoqB7Ev9bHD1JvQlGhydfsdm1mrinNYCXdo+kg1KeNrg/jLlsskcw2GzNYzebeNKXByUScfKSCDzFScqtf3HTEmz+IE0BqHJw7/rIQU1lTP8xN45VDiaKaBhMfxluNtj56cVBti974fsxGH4sn3PUBJBthTv0w+/7tNWzxVhcTcUy2x+5npn7Qv83G99SL0u0GN3viRqxRD9IOhneLtZJNdrs23yW9oKdxmb4xMxvfF7PBJZ9Evol8lNn3z+wLGH7hLAUnmyfvJfVc9dO6Ppg9Md1scBEAAiXDaQD4rF43kJMMA0n/FzEqNMXRtYveW2GLXef+lXpFMM1XdPNhEsn4hoE0r80qXukVmjN2uXPw1IeKOtFP0Yaw9pQ+ZzS7keszl60cTAP5JDA3s45bPPDTG7medfUsyjfJzECNRjJG02wcXB4rK2gwsuVNpzDmWCTzNWaftucu+4J1tOhTP+h6xBzvJ65z7nyv52a5bB1C/f5IfqtOdF5NdZxMFtXItZHrGMmO5u6aM1jp6nftlEBRrUOOUK4pl9+mrGIecyrOdheNXIlmSx+auGHOYCV9G2/om9vWIZRrSvKr4Q7TlPeucJnr3KzIiRNM+35Q59SPlP45pTWa00Hctg5p2aafqrUd7AxEaRqO3hfTXWW82dKHZJgybA/NpNau6tfVyZC7StR1RiP5U/c6bc/rlfoGV3Npj8yWPjOy0kZobNgiYzoIfVbcPI9avuT2mVx0SN/gXn3ceYLtJAC8z20EyW5Vlj3qMG5jaDpIu8s+rBT4kfzIzgkZ0Elq4HRRG9xEx0tD3yZm9K2db2jIFpNNdtOHVQTKM/Rc01DFW+P/PmU2uG6Lj24bM38PrOy0PcmQcRtzdQTXPec3CaSvE41UqqpG/fOdvcENP3P2mUcACJQMpwHgMuNEjYpAsj9k5rSGYLnzo+sLxonaivauV2a1z94VlZu1IHBeGByaj5n5kPG1Td2u52ZR8Op4bUYPqj05Y9rOG2te3O78mo/enyeB2YaB7Ozrlkh/ZON8B8Waa5LOrzZopyl2nJVdJ5JUxB+INS/3z7INdrvOAuYG8ruuBlIYNe7g7xvNXKl7vtO1nd6hX+Gfy7kyo5Mjs5mr02clswxkZUOn7MQop2/0ma3mOEIn3GxMmTng77q2exf0AoK9S5zLlHJNzZ5n2bKjUU5DjEbkQReNr3eGNgjZncsJgE4ZM4JXusjNouKdsozstIy8m7jjpPWO1H7KjCMspLf+mdOYtmuQMf/0fJevn42cEGveFdrofG2B/LKja0M9N2ucq9ysPUv0XNOyC11P+KlPm5jW8HS742dZyY4ccTG5WfOMXNPcPpNnd8cyV4hOn0VTjXTZ7esyZeaBscGl/FPzM18oAKTXkY0Qo/1yCnm2G/nY+/3Or7w7ZTde3HSY/3/b2OBSIOhq812+VNe3+itdZc1tMa35YsT5hjn81JDd1ECXwwm6/qU103Ww02elsnJNayu7+pLgw9X6mhuuOX7e/ZdvMlNmst8f7ay+wW1c7sweIQAESoaTAJCutTpz6ro6NxrTJU6RFjtTWlJ4GnmVL6eOvmZOazCvdQrxlZFTR045njOd4Gy5foq05qQzJ0rtLcwcp5pE19YZsayk7pcOK+bMZPwK/szcyQnmKdLm0G1n71vqPfNdG5P3dCPJnz3fN0Ws+0Xipa3BMOVNQZ9Ixp8e6HZ6a3bPrw07S3CmHCcaik6nG7lFPGLdN8bruVk+Z+1IzCkblHKQ60Ayp0gOx8tRb0k62aATDl/O6UY89pktG63nZjXVOpPptZieU0ebjtyvrTutnyKduOfsxIhONygRf7o2nIVyrmfppPJbY1pDo8PcrOboZeP0dlU3eS83TpGomKDQcxI1jUybMsiYfTqy2+kGrZXWTGun38HJ2jpOGKe367tfgT4LLBLrbo05+yw01ei5psvH+IQMs79G+Vh0Qi4qNGPOAq2DNxJ5T2+7bHAd2iMz13S8MUYy+2uiiIB/Ruiz4nQ6jnl6uy/n9FZcMxvjCB8a00oKBYBmrinZitxWPg3GKfkYrnNOWxBVh7bmPb2lq19zHGGlw+Ijsg2ZorGcGdOvErWZHFmnLYher47kraylTQYVgriZVmKmi2zNcz2bSXO584PjYHfR4e6nt2JtXCfMnEUn3TUQAAIlw0kAuOW8nnRM11y5XxN5ZMYMzVhjYaWtMgzkpOb8jXjNxO5tc5zl260L3bCsqqWZscPX6om27Q5G7DyLPxOGZqmYnND9Z5unMrknl5a/a3C1kYx/sdvXfKm0yCHTW8IUdi6xZqPK8f7CvF83c7PsRjplOwgK2ElmvsvdcyS75pEVvtq4b0w82G9R5diZm7XO0fs2Z19I6BtVZXZ7H8w8Mu78Uw4KfEyZbbSYMX31SMJxCyKxeTEmbNyPd7/+NPPIaGJD0kFKxKnIEdv8pv1GbtZOB7lZdL310D9N6JvfKNDIljcVD9C6p/qPFqwuDh/Yz7RNegAYeZm/L6SZJ3sqcrTw2uh6a4KRv/mye6DdEX+kj4ez+Nzl0mzFcdWiL2ToyZa8J5f5WCh/k6rOxcSSuc7yMXNzTXNJlcBiQk6ez103OaTfsRE2+ZuXHurFR0uM4qNCAaA5QtLMNc2leXJ520HLK7P1C+Vw5svfNOcVU1GIk/ctWLHKUmakE0v9P4i1P3OQm5ygkaWUvzk8f/6mWbX8MrSpsO7yn71ttnXBGH3ufDcnO97gNrZ/yMw0j+VpadV2QK9abnYwYg4BIFAyCgWA1J182Gr7sW9t+3Slpcq5Qkq70biOO2FhIKm1w6oJfkd9s6jh6BDb5tNJAAAgAElEQVRuHGkYedAiiDKHbOcLXnNpVtTeiF7L+/VI1gzNQn2z6PpUD6JGWgZRG0L6zOLjkcKjjjIVtU358/xoUskPvlFi/c0WnfhNBxGrf98lGT/fa6liWQ9eu4+cyjWQW4xk/KoH+XPp9NysESJfplDfLDOIGr/ZL/qy5XtNppL0qn1wKtIAjGR8q1w6ys2ikU4Lh/HgpEA1+5NEu5DXFP8Ry5MIczwcVczbPYuS8Wf5xgl5vbZog0LV8ZQnSyeBhWYWa/EnQl6P/D/kvRKk/5vhPyHW/yBu3XYlzXVc+24c084O0uUVyZ+iQGumtc/yjS9YfBS4rVdw18/JL3tyohX+qUbwan9CGeYyIlkRSXb5XkPjCPVK0mkFA0o6hSF5LbKo4Ka+k9R/0ip4zWa7Ia8RWbmm3T5XD95mZhbbPYt4LvpCHx9pEURlB6/1be9tA0CyCSQvshFmrmkubxrFRwsdFB81Rk4bQdSWvF+n4JXawVBbmKakvV8w+5r6ro3i73f+z82N6NVM5XKhtZlBVMuO/D+XmkHf04bz9Q8RDfrtnmX2NSWflLSwR5GaM0bawdaCa9t5SfdH+6/n90fmeLgXXL/p73bPQgAIlISOi4MmfAqU2QaAZnI7nQJavYZ6ZYkd1wj7ijlqOWAmG+dex2Xz1ik94fZQgUase8PlwkDuDFsXP5jX17kVc7nUUiFxpfWdNsK2p96RQEKvmLM4UTJZE94tDCRdp1q95qVxfT3Bd8i2Yo6ufHUDOca2px41hCYjedziZ5oOonmz3sOx/bD1NSqdIukVc9NsK+Yaq/XrOMqRSdmceoWe7dRPlF7ZJ/uvNZLxT9y1vkalfFNRMfe9fYHPE6PxM/XUs3vd4bVG8VGBRqwrgleEvMgxW+pupR5QzN1v70Qfxh8KWa02qietuLQ97Kgx9LPAUuMatbPFRW5AcCVWo/eSC3Y/kTaZqHzBtEX66V+wYoXtz1wVmCd+h0f8d7F7HQV+osXFbeuguCl6ybi+Xm37rDtnddtw2KYQSOQw3p6hn8p0WMtKnOju1gP28mrrQqCO486Kj0zbsN3mxJY+I2Y+WeMr688ybV6m+I8KeT1NWOfiHrqpX19vORe1DQCPhQ8UbBpPxUejjQ3ua5u0A72zwQQhr2DCutCDio7E5KPwPdv3LfRsu24bqk9YvoZsMtlmKgghW235vtGN1OjC16g14T1GmssB27WRDyJZ3TptbY8o1SBTnGcz+Si7s0Gr39r/UW/d3GKpfLwcTrFBjR0TZMcRgEehXfxtmHb56Wj+XRDl+1Hen5P2Fq9XGFeKF6yd6GnjOq5Q09FIiO/yv9HEyYzVLj+UuR7ZyXe39jtMs2Lu+lNrJ2omth8I7bR9lmbs8qmKOWKxy3ezw5xttIS5G7fORwlX7e/S+sWKYnqJUVGayJNQT47hjx9+7txh+qyNkN4S5nujYs76hPLkVv067toxe2OV8DfoQezNSZYBZRs3inrjZ/tCCjFNYkqgYMXcWuM6jgbf263NrCjdOMM6UKRTjEFGk1u7Qgq6+qXTS9K3l03Wr9sUXC5kdbdA3ts9o6J0rs2pDDVS1pPxx/DAofP9yA0IYtxxj/btF79HfTL/iVdoJ3fGB/QAkCYy2K2N1k6/w6agdaBIp2ZiissE+0KKzgKWwaKAxUonN3ynV26/emJfuR2tu6Sfyjy2LlQxOxtM2W7fdLtL8ZFFo3r6/olGjvCrArcD147qaQcnt1rbLbOzAZ3a2m1efFk3NP7wx7wBINkCs3K7pUBhl9kSZq9NMUh7/EGms4Hds5zc0FB+qXZluOipZ3Y2sOJ+bpvpdyBbbfUa/7V0t84GefWS65h+Q/OtaJeU97NAtwNc5uSLyCfZPS/0eIN+hV1n3Y/1/AP9yn7lcfvfkwJXcUMzymc5Ho6maJGcfvtaC8uOIwCPouPib/cKpbUY10UVv6SwVAFsp7DiA/Aoq6ggj8HKvo5z0kqF+mWRkbxtsfM6Fa0UBnK1gwa3ZS+tiwqIVEQxm+9oybjUO0gMXmGcylyxCCzc5JjcjNWL32N+4Fx+A0kNbq+N1os/woWrctcGFhlVft1bfpBjiJ5553iCS0vshvg9Knmwku/r1BuL2r5Qd/xAgapcvcP/TGNcV/48HprcQnLacalwKgG15hDjulblN6Zm8cc3nEGLQD2zNh60rZmsBxb1Fj0GdxrJ+HsdtFI5fkc/ldlwJv97bBZ/0AQXq+u4Tt3sLD5qsDiVeRXaIeRUHznWTd65AQE1rqbfY2voTvf3gQcu2swRWafN9ps+Wjv9DnoxSCDva6joQ/QKPV64MKY2vD/Twibf1+uN6zhq/VKo7RQ1SS9UDEIthkhOZx3McabrRHEqsy9/YPTQOG2e6WBikL/dKAYZbt3zdEnwopATNbgvtDZzosThW4m8AeCDWLmwCeu4bSj0rNdGMQilusQtfo+ngQVCTv8/e+/VHEeypAvafV3b13mZ3aeZM+cX7K7t/Rdre21PU4um1lprDWoSJEAFSpCgAEhorQittSiU1gJsQXLunDmqu2PTPSKyMrNSRGbaWBvNKs3culEFBCM9MyI8PD7/voWEeWYPjGO0Sw2Uj4AkHrPNH80zv/j8GWXSIWmuTi/mzjdYtMMIlcNt1jjGwXAB3sdMXB8rClk/UXxwyjdiCjtQFu10j1vTTgF3oZk83AuWbf7TlO/e7x1H5K9v9PK8+//+OyXqzX1plbJvIjQqMCGP72BZGR1eNX4ct9PiOI7bWC+d7GHHr/19oFGBY1OYWAZTAcu2lLQigDHTft+V7JIlrqzaAmtnWZlDOlkZWmW2QbjKTEkrMp7ObS8x28wkrk4J9a010WxI1LuY/ErG1lM8ExRTWPoNKGECaxmtSC6usPV9Jocby8yA3sGoGCSW+EJWX6bZZlBysWoLoAYAOUC5Lk/uYmBV/KG1ulI62b/UCYwjkh/skCmDRNcKxvLvD+f27XXsuYpo3Mp4Mcg9naxMErPNHIyvfg56ASAQV0NWRq/4KNn+kfiv8uKPZ0J9g3uAe3mtCT7BgO4F1YJW+JEGxvL9UBQfpXSyMqU36Kaw7qVYlbVZMch84DMexcGRHBzNWbWVmGFZmTUBrNbUfn+RZZsrLLLN8jNlnKetH3J/fzodw/lgbeAhZm2t2gL8H4yb768FyN/+/mtOAMiJxlsFAjYwLplYrwM7iKRnZeqXjEDfOEsD0F5pWRrAQq2HGU9oj1DfuGRidzKXV9QuL20oNY730hHYrKKxAcNs8066KRwT4OWjsINdhrADCPrgGe0Q1AyXaWx0KIgWFcmU76b8//fvHUfkr2/3+m+R5l26FUxtFlkzPfOXU2LhGZ2A4JLgcZz8kmeyRL3aYhCeNTtsg0hZy7yutOusOq4p0SDUFmRlNrCszKQmK+OR2qA8U9a7bW5PY914Pzd1sjLAn4fFH3PtQm1BVmaPQVYmWMmY8W3w3k1En+hmZVCJYS8t/hjqFCNSXkylUTpJLyvDs83nXoj3jct1abMyymzzgCCRcsif1fnUZmV4ttmOnNotVjkPGC31u/MzOSgtnvC+TafnhNqaM8nKZLPNuWB8I0xYtvhInZUJ3Sgg/jffsWyz9cYKDMig4V4OYjGIeoEHDBOtaBTnveMydtqsDGabmV54yAIczy3lHzXMyvBsM8gMivYN+Nn0sjKAZ17Kss0Ri2wzNxgzMHZu6CjR8Gzzo2incN9OMWqR1rEvaqlHKaiG5wNzQlJQn7eRbXD1lGhAto9Svxgfw2qN87QChZJqLISZXnjdxhyaLMO+JeoZ20Eu7MCuMhXlaT3CsplqHDkv/ri8XSxhge+oDDu4kvMdHPvC84FjYNG+GWUzOZMGzHGwhv/eQUT++oavnzzvdcmF+QtrR0rNKCvjdzBBghllZY6zCcUO0zxgyuSsjKKaecHGcZzSSgyyMt3BAww3J658wbMyWqxMOuxh3FjrLY/jlMazMm9ipaoJBY7nMUPbJX6fcSmIVEqL8c+nhn/KknbbUIHRy8rA32+9TY9HeibESbtVWZl4tg+ixR85z1QnKwPFOXayzdx4VkZbfJTNNpvjp7R2gsEOlFmZjEaHVfs3RgGgMiuTYgvvYmyR+E8updnmVvHNCxhkzrVZGRUY34b+Lcgl0qzMFlVQIGebDY789cyoGESJbRbJNnOL9lCYy5jmCJpnm68LZpv5Oy8XgyiqiwHbzLPNCzak+4ALEO5nzz0I2rJ9g8ysXSk14AFcx4pBlLCDlEm22czak3P4vu0Plqn9OfjQVrYZTA07yHJQYvUszzbb0KbnSk1aYmhYc+xkm/F9U21ws/6Bgg872WZugUr9hAon7S4Np/JVwPnL3fX3P39ihK9r5QpTABZzZnw7LyzY/F2WlXmUDYw4XuGmjQkSDLMyDCvDiVPnpUmIH4/oHSmYGeczVIqov7LgYjOyWZ2sDAfjQ4WcXa3JKwwr8yqexcdFB+6bcrEZGc/KAFaG05Xw45Gp3eoFQsQ4VgYqNbUTZG2p+CIFJmdlGnfKwRlXNYCKTLu6vBwrE3ifDdpEiz9y7lOHoqMpMe1I1QBMT66Lc7E12hSk51mZY4qsDGCwqA6rvsqKWVUoyBDCfUE2HX5O1DcS/8PvbGWb5b7JWZksB6VMEG8BxteaSj1HgWPlVEOi2WZuesUgFZ3i2GZt36DyXC0vls0299uU7at9kcrZ4HL+PBFss7ZvHGPGYS6QkT3EsM2i2WZuHHZQrKhono69FcY2Kw3moI1M+YgXH1Fi++9tZZu5ZTkos4Gj9xnPNttbYwCy0+anMJc4CyhV2GbBbDO3SO9tOmcrcPUPWbb5rgC2WdW3aLb4KM2KIWGtWcNkVL2Zz/kAMH+5u2CBCDOOueQ8nXBfMx3WawYgdjNTVTAlvqqq40QVNJTGiVPbq+hi/owdl5pRvxjZGBNR33CdcsylFn8m+wPrGRebx3Z7xzXEqRzEPhkT39FyG0oFmYg6pYRZTP8g65pmYmJqC0rjWJleVsELEyM8l2TVz0LSf0oLpkaooklwOwa2UBFn9ziOmwor46cAd1BqgecCC7Pd+9QWHymVP6yKP3Im3EyWg3JmjL6rHIxfmxBTMVFaO4NR8MDWlwmzbPNq5G2005YeRQc/vvIm9Y8KzQJAqDpXwihCV47SjeCH1aZUQ3oG9wIUHXBvcI+YbeaBUru9gA3Mk2hSFR/NjIpRDek+U00xCMxHO+/SQKlLAIyvNWA5QEqYApqV6WPHcaLYZqVpYQcQKAHHJDyXPhPqFyN7yWAut5miSW+yF+cAmAvstjWn0M8GDkrIxkJWllK/TNpuryT2UVVEJRPbt4tLsnHjHJQwd8McruRqjAsq+iiNU8LwY+32SnNiezNLBSdVbAfA1biWcTUCCbTd9mavxlV61E1sIwgnAnkewPzl+oIFIjnbxHi/zlPC2CL7x3FKk4l6axZJh43qOD0baPskK4PA5L2FSQzBMZaTvh15RFUmgK+NV8ddMsigWBknTgV94EU8jltvW0OXm1JEvUVanLmGbrgjt5hDqG/xGpk4FY5Hh1fTo/m//fQP2wEgpYTZy462e0hLOZ0gH9s4jlMaHP9iVqbnJh7NcxoLOxq6ct+UxUc9P9ou/tBa1VOalQFtY28mjTRDQP0St6FTyw2ClS23afHR6NxPeCQPz+RxtNhR3zhFxwPpv5Ro/Dt857QAdm5mASBsMtax4qNpv0cu/oj2i8n/ae1xtEim6IiP/GQLjJ/btx8QcgDQg0QmSsoKE6bKH1amhB3AnAbPA4JAJ/MRHC8ChRJYWtoIXWXE9q8NiO2tDI604d5Al5oflYLajJO++cKURgmKqSDwgLEPz6Q+Xuuob6cUHJQ+aZNBqV/ECuW0xjWNoeAN3j2u+2tEbG9lMGfDvcEcHmpgai1HxNRatAZchlnJzi+y8seADX17bpTtYD9NqCz0WhKNWxmHHYzvpuvnGfZMQGc6HwDmL9cXLBCfMp+Iv2oVcjENTdJsDCxcItVKugOqlRH17guTsyxLVmnzOE6ecNNfybn1NCvTMOYV4sYyM1Bo4ES9V0InbVXHaS3B0vFwf0OxPnYcZ07sa2aQZYL7OxGqIKGWw0JcbEYWW8ygXisQp87VUiJeOC4Vkf7TM04JMxAqINd20wly2AaWUGkycWrVClLRTt83IIB26jf/a0bUez1uu/hDa6DXekQKlE9JAfOLQJ8hZYqoATUHPf6Jy8dxcETvpK1phV7raPQ5I7J9ZPj7VtJg9xiR+oO+p5IPWfFHxP7mBSxL0bGZzN1lROMOAzYwXmwwHijHZ3FER2da1JTFINffUhjImzZnARvYzCVabDBXkZaJ7YM2s83chj9S2MH1PWFyPlQtTP1i9LwvltHjxve9YRz7MAeYEdubWYuC7aAvdIoVSzQ79tthBjtoDfdnlT9sZpu5cbaDK1K/QKYPicab7AdsYErO05HRUXwe5zZI658Jb6WZcWqbUMcFsu8eJRqHokpHfQPO0y00u7kw9Amx9MBBG898yQeA+cv9xRcIkLGBl/bWiwGKk2twPnmj9udm+tLubqJSVnGHEyTY+0dJHJRn7gzjBPI6PuC4LaCEgSNglBsb2072Br4nSQfZHW5FDJB7Y6EGJxAIlJy2BZjGNUw+aaR2JQnUbrRV/KG1B5HbVKnh+BitJpMmSKcBIBSAtPhXkPL2g7T4Y6s1F5uZhbuu4Pu2/84UPovOUWfBJBgQWgNOZnCln6wYs1/8keO3MxR2sOdtoy1Bez2bC1AlmtVXvWTzwjJHx3FKO8o2VA8XbrLiD2Nsl1UACLRDcH8bp24SLwRINXtd9Q3ubZtnGRlc66Vwg3nn724oNYr39/LtfXwWD884y6CA8WKQ2YqVZGWBD/HNAQNZSxGLdNCsTPd+Cm0psCC2N+0bcFBuoRvcNR2vsBAsKlitq/e8+2b/nWY4H4/h2H8oBdJO+6ZkOyjz7kasXMbFXAmBLbxv5+Yotjk64CzbDAYVzTB3H+7bTonGN5gTjVsZVJ3D+1ZS2ILP4kOJtXSo4TNNfSL+6tWk4+V+fBZAQWYXuqA0UGyCe2y5GVEVG+UDwPzl+uILBFTJzVcsJ6svzeJLO2+iEiH00j6nL+2DK2Ji9qZtzf6Mg/Lg2jmy1FNMAhlnO1puHJS7+n2JoWyaqIEmMBaDzIySJt8qQ1Z5USuMNuMkWdKzj8RGcrnV7NhoapzsH95EBpf4yPCaAGJlnAaAYEORa+RWwVvb1XF6lvQOkN6yHTImM+1iggTjxSCnX9kv/tBafyuFHezZP4KYLDfBJNiREgo7WNd5mjS42CCAcdjB7rkm0h3cZ/q7VgEg2B4flRtrat5EEtPOM51gcG+Xqs7Q47ijzo7juHF94Iv7OvBZwDNx0x4Ug7x9UoDP4awNqiHdvkmBxgjj09zSIQWCceebFzDOdrC94CMWgzltB5V+/v4rq3D2kY2TG3EOcNO3J6yA79T8SzIaLXLVFgS2EOAu9d0hk9UrkAbGTXsgb/eoqMSUoFvUkpk4afSsICfWTOGzgDXH1b323yPXi17i+/a80XkyBfsGUqtSn3pW+8myCT/pZacb+QAwf7m+smLxX8iHl7fwhT3+KJf0167F5mgxyMc1fjIRdbajVdrFIx4cmKerrZUYrGzEQ3EZS6+PkjkHYGut7Z6fwknyTUCcG8vIBuJUAmr7zBWSjjrDOXKDwOX5o1J8DkO3Z4UCAjOb9feTY8vnydGlXhJ2uUGA9+3uw9f4HO5XuFsIwOYbKDi/4pD94g+tAezg2Dr6vj0cdp5t5vb6I8XUrnpaZ7v4Q2sAO1g1M4fvW7dFsCDyvEvb79Gq06FTjo/juMG9vT9VR4/jK929u2BdQ+9p5n/9LD4TN21BMcjhmy34HBp73AWnYEP36DF3yW2/Y6gMNygGOSyNqUMrFkhrwH4xmvZ5Xyinm/htNaWuNy8ehB34yIqZGeJJugsmwS57X1EOykFznWkRm0v6SMeGUVpsNOEuKQBWUfUC37dbR8XpxYwsHpgnay7S0415v7sNAtjwUVpUdfldQH7f8gFg/nJ9KReIE/eG8YX9UFnj+oVtjkmLwX4/PXp0uXsHO1LRSpVBTroPTgE/suxul6tCF6UVLzzGBfmM1xm2SzVxTNeSzbNXcZIccVjowg0m/76ts/gMnnc/cR0ANr2jBRLXz1bqKoPYMTyKvzqHz2Cw2X7VtNZe+1Kka5XU1hJjvVZRg6P4HUVtVAaqyFzLWcReBqRA99I8WXLBiyohrvy2uEjOzL+kxSAB875ZPW+kNbm/ETMyK7x3TDWOhfoW/EIGpUCmb8UcKffpy0vasbIiPz6D+8XPXB09goHONGb9L06T0IixXquoPeylOMDeDQFXUAiwqXSM7DzTi/fa9M55Zp0/74KRJzTjLG363AaAUCCxb67OFY5baS0DV2ihi9f58S83XiDRsLvLMY5baXdOzOAzePPe3akQWOsQxZofvNFKkvPihN5G9racnnC0Hc+uCfkAMH+5vvgC4Q0BWaWPrLo4Q+arN7vCnoFBZez5535TvVZRm00nyJK5YnJolccVGJzbxdBRsrbuNg7Q6++cVYtyA2mkWt8qsnxmHgG6oArgpr1g8wHyoPeAY6obpcUGKPdfy/Z+ssO3XFrg044DQJRG2kWVWV43HnVEdaO0Tsb9t/daJ/FXryKLaeebBK788ajAL6w7a2bA/bd88DHNOK8NkFTS+SIK1B5QGLHyRQXe7ztBJQAjA6WZN94duCCDRnDaZIG3CgBT41PEX/YdOTl2Rlepwa6BQgb4v+xCBTkc2CJzUDqxVOIrOb0mgM+ganCLihPQiXF95mtFrwz1WkUtlvmCQPya3fR9i3x0l+F5FOskaxpe471e2+0cvwrP+T9++Z9kuzTWl93up5uraXcbXKBIebRwCt+3/R53m6FMIk68H5aSDfPXDaUv7djcdZqFvfP8Fs7pbtryez6j/0+sniEN89JcmXaO+wXjOtOvH19xzOTADcb4pnE/6V7pRyaHlPez/Lx/7/ghf33jF18g5AnyQZ0tbUY980lBEBBVbhildAlDy+yxs2uNc0hduDXuig4CbD7to9JIM7sQDL6yIIDKAE7bG48+RPDw+YU+CpZ2SAeBAz00g74fbt4hk12nbJJdK23uJp0gK55V4j3XJiodB4ATAz+y4g8fafIucUR2rTSo+oX3razsDaWDmLZHjKw0rvxxrpnisoAWxs0CfyZcif4vOEaPgbvqnR8vcS62g723ZWlFp22BgcQgvG/7PbN4zy0x48DZKgAMl15E31e1HMT7BckuN32Dqn/wf1HTLRUHpRMDnyP903FK0TGgIJm2a0jWzEiSO8svGeq1ihpkwsD3z15Q+iGQIHPalkyS7L1Lzm+lGc+JQedFIB2fG2g1dl0V3i9IEjrv20+kLfA9afQtJRvn/HjPYw64XLnFx9+i7x9MFOL7BlXojvsW/0KGVwaw+OvY5E68Z4+LoI3TP5Xc6mRcrs8dtxWKfSHLgNrqkp/MfNgo3fMSqb/O3xGuPf/2ckC1wc0HgPnL9YU0MJ+kCbKQcf91tlL+ua7Ljl/Y14yLDZQ/gDAVlRoqnGU+MgoprvbhsGNCWG6ci+2ZFLiBEgDcc12vswUepLjaAutwwuiO+WV9RqfBR3TwEWWRH3lOjobeUcqEpLNjZeT+Y7J8/XNDeM+ng3vJb7/95igAfHUrK43UHdyP9xxIDTrqWySe5f7zTfYw+TF70mhKu8yVP6T3bmw7XZRjQ84WUZDlAxkukOPqaKCLQtEx55mKW+GLNPiO1pCNN2j1+eSCs+w6KBWA32FRropQcP5pr3FBg1kAuJj5Qvwly6nve1/hZgPeN1DacdI3kHvDasxNQVIXzXJQOvXbXcnnGHw3Jhgn4FIE6jtpC5QxwO8QBMbGc5VB7NpBTxh93+7J4OZ2mHECOmmrO7mAft8XLMOxBff8yoZ2stq+knPR/ZTayjcscwLGHWawfcmPsq45Lwa5H3T2fmAldsMO9P2Un9IrrQs8crzBDdZS7j/QZ34WfSBzUDppSynLNzI851jNiRtXmrksbXIjvYWMg9I57OAim9/qPlKVrTGmT5wPAPOX6wsWiIFpOkGClFAmmWLM+csROO3khd3DJkioVuKUCZOHnC2iXUmPPEHCS39jn3MOOvj7o8HtOFlMpKZkTsCTDkk6+QTZGzpOpZgcSkLRvn0mgdoNjIvNS6oSYzTrGa52NkHWsQnydBSD6COBrXjf4b8EbAeAcATKudiC3s8oCUcloW466tv7j3SCBAUQvO+6jfS+HVQFRqVAZgXjYoPiD+8LWn0+f8fZIgoUQ+D365FGvO8z3wccVwWGMgkVF9ujWlp9DlXoTvoGSgXg97HofRKX3rfVTBJqwQB2YBYAJnraiP/9d8T/bgmqzgDcAO77WcxZ5t/zIClLQCo5KMEHdttamKFV/+B7eAYjkVt43zNxZ4to4fsE+v1FU4rNb5SDcjFlf+M3war+N7Dj95mLbIP7wdkG92qkHv3+Lj6EYwthB2ucwQ4m0lM4xo8Et+KYP/2MbnDr+5xtcAelAB787knUyxyUGyxgB0aW8o8wCchdOFcecbnB5WIDwP03nqL3fQyViuz3jXMxgtwg/CxvcJPOCsAOPgjL1FaQacb7bjav2DeysFLZSBrnnPQe4D35ADB/ub5ggeAauSAlBC9dpJtytMWn7AcffILcNEeJpJWUCYkZ+4voZaaRWx6nRzZcheJJgf2U+lhqAieK40GqQwts+bBDBqFuwEDabW8gfJFNkA3482sXKhRJLyVHDbVQnjhOmbDMXywtovbxcfIE2Uj/9l2sDO/95eID2wFgbzOlRSk+ToP4pLSoQ0amVVrk0w6qWvkE2TFCg3gQg3fKC1bDaFHOMy62pIdSJoxIi2jG5iKKKjjBl8PudwsAACAASURBVCoprvL7Sce8YDVxevR+L3KDPhPvz45pb5AWJbCNSXHRKsWsKLz+Rs0sAAw+P0jft3KaeR1OhfC+twae2a5qRd5PPsan6RgvjlzHewcf2PUb5/0E32NfU8N436BGY3eBT0pjnNKi+LEQBD4Lf6RH36C2Y7dvxcznj0MUhgJSd043uFB0g7Qo/iISZNRWRcdp5rOvxf64KoneRZ+Xx8vw58b+T45VKFKZpOTzZcj9mWZE0vvZxr7LAe1NVo2FBvHVbIN7Plxlv29SoAwnGzjGE1/xnTge3IH3Pu5Apu7JpawaC/w8K72z8L4B7ZXdtqZ9dIyvZ2Mcxm2gbrPjDW4FgxtwrknfS0p6D/CefACYv1xff/nbr4iDg+MCf5hOkCBhQ4MR+8dyD5lc1SPFUYHnHssOPLGH3Yss/kCWSwEQBEFhFgSBDu3x5X5ybJmfRIL2UvRcRPxd7JX82a0Kmh141WIv2wnHUdogCNQAoBAEMlIRm1QkkZ4bdIKczC6YPPitiA/b69tCbhDkz0SoDm1gNUl+sjeBc7mqjupsJmEgfIEFv/YW0WmveoKEz0AMnioDrLNdfHSCSSM1K7BwU8epMkC42d4iOpoOo79BbpAHQXPjWR1au9We50OH8X3rS/bLnx1QZAfstMX1mLuCu+UgaIDp0BoRXxsFgJnkj8T/YgkNgiZohSL8/a5gqSPi60gnDYImDmTxjX3JPrz3CyF7c8ii4jhubuIn1rcvKNNFia9nbLXXPEiDoONPsgEaaJ5THdrTttpKK/SY55ges2qDO23v3YWiGyRGVgRBMMacyCwmpLmS6zEHFum9Jljwu0QR/IraXLyKZfmvy5+9Y8GI3Q3uYiqDGVeuxwyfyZyAUvBrl9eVB0Hzt7PZZTj+hfcN5nhb7660hsBacnyFH9cW+AyC3xYMfpeT1KK9deFxHcXS36/Orn/RoSd0gyv9105bYAdY0N3Jgu6Ujwa/AO9ZlILf3zt+yF/f+NU5+RVfWMDDyQNWcxwp+rLCormJMcdPpbKTYXzMmTbo+/gITpCXwjWqz59fpXi0prfigzO9+DPZF1iHk8RCOiB/3j9Fj793FdnD7sFxFEoHRW6pPr/A8BpVNigToALWX7USpfj4BAnWyY6/QSPYzqRhdAx6LXyG6mcm24TbioXZBLmcCtbL/wbTBu0L2RNz58egDzTHoKHWo7J+pvB9smIjOApNKp4daFDj8bdNMfcidgz6NNatGAtfZem78X7xo31ebASC9WkFzqm8I4sPstM3Lo02E38nf4ba2Gy86YHzjQLAeOt79LX/zXLVO/8q3o/3f9Om9J0ezhfuGe7dLjh/vO9HWRpN+flUrJRJ39nLEgPpM/i7VoHzXUxLAXD1GgbOF39HuK754QV1ts9zn21wbWaJj4fKZe1v/hnf4ILFbBTOtSda0dd3khdVz1t5/G2nbz2hg+wYNLt5AYYDlCKTzI6yE5dG0+LKr0Ua8P7fxMWxxPC+ju/KHoPKz0Ca0+H+YY5PG2hj61nTG4q7hDVF+flg+DJVdorXCLcF4xFUP8Df4/PZ8ZgOe+gGt84ertDo2B1gPXi6U7uYDwDzl7vr9At6/As7ZeXLFx0soQUJw+J0H7wac5+GLgAH7W5aIRjtE19EIfCBCaIjqU6dj3QzzMZ+8YrKnmQPThBaugAYtFtv0wKY0TmxCjeldiQcTym/a2UVW8cXxI+EErMtdILsVJOjgmj6BqgQlHwwnRYLGKBvY9vYBDmsvp/WZBP64Gb4gnDf2j6wI/dL6n8fKwT9a9EHiYzYcwCwdbYQQt23+GQ1Bef3XBfuWxk7cr+lyUhkYlAh6McKwbQgYTVw//FCiLm0eiGvf8XA+bfF8WzKYiPl52FFhSAUw4i0lV78gRVCLCHJjPo5mIHzjQLA4NOdNANWqX7ffKwAZrX/AYkL8u5B8cOwQaW/E3A+FECAr+vL1Ju7uLTA0wKYdVh8JdIWyL3RSn9pLCTUfYv0cXC+eOUzLzaq0GzuEhOsAGaj+AbXk0nJlf5JTSHEY3Yk2VYpvom8GT6Pvh782qV63rwAZluh+AY3ml5AX7cHNmIyQPndaZZxB0Ua0b6F2k4wZoku1ec9Kfva7vFRlkzYmns/F0JHWPW5+CYS1hAs/uhWZ+T90noBPuixkcHum6S+3lMczukbYADtVp8/YqdpDzRjG3CP4IOpY5F8AJi/nF//zzn/v8ILu/ZqgCQ1TPuAV7C7awGNQlTE0MEk+cqy2AWRtoAcFSYHCIDSmn8fAonzG+gxkUfw2KUocg0nh7p4Lq7xaQNN2xdXiS3wkdQ0Tg5wLKX1DWSi1rBjIq8gJ2C44yw9jpvN5f17EO2g0nCxj0JtRfsp9x/skrWTUOLTJ7IzAOD8ZSQsWO159yjFJA205R6njkWL0Q/TsTKhtj6O/WBIhZJJJjEDCplQ0NIUaY8XG/XpFN3MXqMUOP43YlliyMKAn6H6Wvsd8E7aAeeD348pio2033OOsMousQV+IdGMfu4P56onKLMEWuyeXgCYiWaQ+48uyLm8f6fDH9AP9QkxLBUUPyDX58XcDUoWnC/Guwe+Re4/Vmyk/b43dAz9AMVXIn1705am1FZvc+eclG/YFjg/xoqNIAMW0sl+TeynG9yIYHHai1gv+vlONJfAmEsR3hWsPoexzIuN/vLrX1TPG/y+8y7d4MJph0h7wPEJfp7QkcnkUoRm1edKy8TCNNtcvTZHaQYz2IGn6AeAX4i05ymmlbBeHSqwWmluh/etOCK2ifRM0WIjWEu0rBIQ+LYHNqAfICAWae/mO5pMed2aO+cA9hE3uL23xfwm+WYjy+5ParL7AOsZWUspYXr+h+9ffu84In99o9efzvrOwQtbVKkf+ASb97Ndi3WKHiWqWFWiXyfwSfkZdmE1Be5atfeQBT4Po/os6hycXymAK4QKzB3+FYaBz1yA4tLWXQsIgfOhChMmhimDzMYtBhQX4QQEclQ4ivJXrcJqTO33E+ko+gGocESIdTn3n68s99+GheFx+jalJdEJhLXGyVGBDDmdyvVLODWBfvgouMBfZtx/5QZkyOHO8ywQbrZsa1JTbKT9PtrNcGn7xBYWAKODnwGcrvd9EaMlEdGk1RYbab9vG6a4tMOPxBb4vtBp9LM3oX90z8H5Wk1avQAwWkfxSP6yNbptNSSm0A8nw++F+jZ5mOEt23P9YhecD4UPSLtzXN8v84l69MOgIL3M3nthpvaTO67U4Hxr+bVaFvicMwh8OAm2CCcg8hIGqQbzUCqY870cCH8nRnpfG69ixUbXdTO+gG8GP9wU4AQEvwAFCg18cosWoPp8JZvnRUjvOfdfpO+u7vcAtwA/FAmQ3oOW+cg6Gvgk53M3/spAWERysfIxpXmqeKC/GYYAmAbC1tg9wFuuuqzG0isNeABxnq9erTvPa63b4DRNHgt3aSA8+Cff2d87jshf3+j13Tm/T4tXUA3eCcaZ1WNN99HAJshTJjvDqVMMu9BgfnwAGb/1gRLTo8/ZMQrOvwS4QovgoyVhffR5RFqMwRftw+YTByVHpUefwMum9zt9DJy/R4A5X/Zx7y3D39kbpPqZcGRi2jdOjgps8f7cSQgWhun/GGPg/COWfeMi9WWF+hsE8DsEf7QydcK0LeT+u+TH408gStWdROcYB2XHWcu+PdIpNlL1TQrkgZMOwfkT5seZAEIHMDqA0gGcrvc77VX0KPyxTqZLa3rFRkpLpb/iZgPet1m/eQY7kYng0W+bf4307un37Q07Cr+uOQrXCwADTzfR961Of0wnFn/GI+Al0vvmzZhvYJKzVO8bFuVFA61eO+D8xzrFRkpLL2ZIi7S4Q3Vq0oJeZtzzE/p38039DQIYB+eLwFxOsaPPRgPi7XToC+UEXGHNCTiYCuB43hF8YTh3wZjjvJtWfbvAi41SfboBoE8KSCAwWSXACQjcnshrGtxv+DvX2EnPOwGcc7BpL00i+Ed0vwe4hdFRuNbCbfToc/KI8caJH4XDnG/WFswPsHaAj2fH9ecHs6NwrTX0U335U8+M1z9QBMEN7pw1BvuqhY/5Ubhk3t87jshf3+j1p/O+ew/qYLLVnxSgIEH0WO4MmyDrTLAhofosN51ZW4D5g0nhYOiN8QBWSJNZMefLxQ8JY+Z5OI7j3HRmbYEkFSdHNfodZTHMZMp8gQfpNzyO8xpnWQEkTbnpGszb4uSoZ/T9CwvDL7/9Q7cYxtS/A8b+heNfyk1XbNq3D4z77+JLY//Czhhk4RCcnzDOVqj8a6JMAKB88IfnvvlxN/fvNRP/qsD5Jgu8UbGR1gBuAP54Um+ewZ6OvUb/jkb0MyhgfkUxTEIRUGgDwHQgRPzvvkP+v3RIf/MCdivShP54GTNX8oCqfvTvPWP/cnA+LYYxHgui/h2O3EB/ABelWd+gChP8W1Jn3DcZ5lK/xRTmEmD+XaXxr9ZA8hKLYSywe4XRFvRvacwYqwYFR6h9rgPlMPJv5tPPhrQ/pwVJ74Hb08q/XSw7ZSUNJ+rfY6wYpjk5bdqezLlo4t/2RBv6A+Z8s7a4spGV9B5gAMEffgtVGxHOxcRME8N6m6vaRBVwg6BBsQ30Gaqgh/7ku/d7xxH56xu+rKTBwp0XLDmzRKvDUJ2CZ6hMwPmcHLXcgv6EZ6hem5D+BjIxSn/iX41UCUa/xzNUoE4RNshQgQ3K3H/m9Cc8Q1ViwpyfjizQCbJ2o/kCxDJUoE5hBs7Xcv9pjQcEzywyVGCqDKvJsTgUgCA4378Ws6NGv3foIcuwjpgff8h8YRPGC5BohhVoORCcvz5omKEC4xnW7pQ51geyf+ATyAYa/Q6XfrPSJh2bZxmqW8YZKmWGNZQy1+nVy1BpA8DIh9v0fXu1wbQtkQwVZlg30wwrVPmbtZcF5xsvou2VLMN6yXwDFkhaZ6gAxgE0Q+DfGZ/FBswiQwX21iDDqjU4BrfiBIQs1xo/LTZayBgH/0o6HKMMFfaNZVih4MaM95GT3ptxAgKdVStmWJeaZlihInUD24BNm2xwY8NPWYb1qanfOB3OeRPSeygwElFdUdLhBDPG75JohnWOcQIOMy5PPfNHxDKsRmwPWqu2gBtwy/MA5i/Xl1UAmJzvpBWDbcYZL84PdVWAH4oLeBuB8yHAgUBHSY5qOPAsMGpgVfEKnCAfRIyPWLlxfVrIVul9n8qkZX4oTo5qZJwQe7MBRo1OkM8pP9RgiWXfuD5tbUL/qFXmhzLBWPIFYjw9yTBqxtg9GWP52BpjCVQwiFFL6uM14ZhTFGOZ9A6oCLH17BY7HhHBWE4eZOD8Dv3AEwTpwa+bBTCWHJxvJg3Hi42sMJZIOl1EMWq9k/oZVjsYSz2MmjYg8D9dS9+3FvP3zQqjBhbtYcVGe3IrHnP6xjBqZuD8u4IYS4pR22yIUQMDgnHwK2w6rN6P+Pg7U4wamBHGMqdvaQVGbU4/MIIsF/j1eMha1QTIx80warTYiGMsp8yVXxSk93oYNTBPoklYd/k+2+A+CenPD4ixrN8iRIAMsIss36u+jwPvGcZSQADgfoRqUVfF9XGsiLFcK4axzJLer8JqfL3fec2KjW68s17/gOVAy/eqtWMLEUudb7B8AJi/XF9WASBUbgVq6MKRiekvBgdsMMTzhWNir372BqoPYYKEakSrtsDMqlTBzgYP4GQwIKBbyxcOI3D+fKKOMsSHrwj1bTfzi540HJ0gt9IJMmQth9SUoAvHCYOFAwJqrLK+YTwJ8QUCjvzNqlRVVdZT1lXWkA2lC4c+xvJ5I62yNio2UvtFwUEZ9eV8n1RIoIlUWQM3ndnCAUVGolXWVuB8AJ5TCTSxKmuoFgS/XDdYOMai94SrrPWqVJUBQWp2ivgrviP+cmkcJ6yDel6letcAnC9v5F5bB+FW4Hy7VdYTsaem4Hy+kXtvsJFTvevxCAPnr8mpUgWbMamy1jMOzgcuTr3vz1ps5JQmV6lu1Nc+11ZZmwWAYNdZlSpUR+t93xc6xTZyHZZ9G2Mb3C0GfpGl35r2WrYFBlyv4JfKxKju95BVNdvIKW0gOYh+gblf73u7Vdb94bPol4WE/lgA2hezjZzSsopPh/TfH2lOA7+u1XCb6lk+AMxfri+rABAs2n+PpvJHc48MOQ3FekGNSNXRkc7RBs90idJQyDx1Ogv8bHoBJ4KDgY1CFbSQnTID5wPuj9JQdAn17SU7OgLJrtwJcpRNkHuEKmgBnL/GBJzPaSii3cYTpHKByB4dPcz5Pbs8i2ZHR6iRfIfSUAAnmUh70cFH9H0bKc35rpnxLJ4QpKHAo6Pl+kdHiCUMPMH3bTIt1h5wASJP3avcZyBSbKQ05dFRQpPBXpSeN3DemRUbaU3LU6d83uG3FMoRfLVDqK35DAXnrws8yqVhSnxFJQKjYiM94+D81kRuhTccw5kVG+W8H+l59EtHIBdbJgrlUFqo/STF4c7nZrCfmvAs6llsiGVGd+Riy5RQjpggz+JNpn0+2pM7rrU8i1YBYPe4MQ0ThXLwYiPrvqFyDNM+H9DZ4EJGlfIsvhW6T9AEhvcN8IDa7+RiIwsoh/x+Su/EAWnOB9/MpXML557Y5FnkNEx6mVGRYiO135QiC7kb3Gfsfburs2ZoLR8A5i/Xl0gAmApO0sWjIVds24yI1nBAcXC+5mgjmPkkV2OKEtEaKVWAlcWe4yRQqsNnZWT3qpK64HxRrJvqPk12c9H+IhrkjIlNkGC3I8264HwZ67bBHK+nXCBAnUFPqQKs9DpVWmkU5NAD4+D8OY32K5BrIxHtbXEi2lRw2vB9O8+CnBobRLQcnA8KIcrPQe8X/LknKE5UzMH5euBxkWIjrZ18SsHjTQPqzJg/2Yv+7LXAEipNq1ShzPj6n6+g71tXLs+hkR0KvUH/dGqI2AFjikS0p8RVNIzA+cpiIztKK6ALTLGR6oxRdTetxrxgUmyktcR0AwXnf7yU07dtLMgZNSk20v4NkBTrYSPfxYcsi4201viaBselmsw+FNRklVYCqudtNJ+bYSOnY29osVG0SLhvRhtcyKQC7x+eGsXFsmwUG/kA/aPd4HoFio209iJagr55La0Bys9Fi43Uvv4kV5+nNJl9XmwEEnCifctucF8Yvm/DAu9bPgDMX64vkQAQXsxg4y4Gls7ypFlJURlPuPoBC2jewgQAGriibYHpadXCLvBIYCtOAlNp6yNWbhycv1UTsIAEl1U1pp5xPEerAs+hmiBj4momoNHKmfNVE+RTsQlSu0DoadUmE1/JqdUBcnSJn4QEsztgUCWnx5zPJ0iralfD9y2QPSoLZ76QZUxrOWpDigo0gTFgOaEOWHhADRJown1TatUqMthBVmwEAHSzYiOt1fTQgOV8qTpgAQ1WGlBb8zVygwz8OkZCPp/6WX7eqdFeJv22hGRS4uO0nI1HKMpSfj5zngXUteJBuBqcnw1mZh1qLU/H3uoGLCeeRHWVjUyfKWjVVi6nWrXJbPAxxIqNdhpoLRuZXB2tqT4/yALqj0lr3kFuMAaBGBvGZEqB7dXTWrYKAMH4BhfI7+X7VygbaQNq0/s02OAm5z9a4sb1jFeflynGIwbUW8SKjZQ2mZ5B/8AaoDz9caq1PBS5xsZjjfwZBNQbWEA9bVFspLR0aIZVR29VvVf9Nt+3fACYv1xfIgEgWGzsTQ5Yut9CjN7M9I4sD4fe6kq/WRknkC1WEMiOSBMZTAAng7tt9U3JnK88suwK7mPSb8bVgnpWyQpkLvmyE448Qbbb09FFrUl2ZDnBjiyV0m/ADWU1YSifd028khHIZivcehqpL+/ZyO7QfvxM2gPr6ZEly0gAbmkDk36b9opPkPi+jZbRgoWBLH/cB+bLAp+9yRuPLFerjyyV0m9m1Zh6JoPzH2YXeACcixYbKS2ayPIj8iNL0WpMPbvLSMhfhFLy8w6VHaMZ1Tf6mCgjC+pUn8vVmCv8JBMVD8LBODi/WkExAj4EX36wqaMrZ+QDa2VpOChugCKH1TpH6lYW6b5C2Q6ms5tPpS9t9Y1vcBXScHPpBDtSL8k5Ureyeyej6KOepmxQCwU1tNioSv5MJAAcmf0pRxoukp4zPFK3Mr0NLmj+an0pYr0sIw9V+fyz2KCxspGZwe/C3A8+GkllkxZAMg6+hDXDTt+4NByo0fDP+JH6gQfim3jet2Dj7pyECi9ueylQ3Maf9+8dP+Svb/wSDQBVYOk0DYwK2QQp+sKqBpSmaIFjjr7XwRxZmZ6E1ONoEQ7+ipgxl6CRgXA6DOy7H+jiG0172ARpT8wbJ0OWtVquyFqFuwrYBFlvu2+PYrRoAf6LE+Qw08bcbj1BaheIkBRcaMH5D8/RxabTRnaHG1dI4UULoMAAftx3z94ECZaOBuguuWadtIjSBf4IW2zaBYqNtKatPm9jmCM96Tcrm2fg/AubsuB8O8VGWgPuSaU03EKihWGOcqXfrIxnrXZImzI4+v31l1+I/+VS+r4N5sqOWRmXhmtgmFzgYBOtxtQaB+efC9EKbyw22ihebKQ1Lg3nT3bjz29sVGNqLenpZlmr4/T9k8bS94psqt32QIEGN7g9dK58HusRVrzQWmcNzVo9Okc3Zdlio6WqYiORABArvAvpBnd4lgb1UEwDfgQJOLt9q2KbsotsU5bNpi6X/t/eugCZOo7JnWICAFZFNWZWEXuN79tjxlEKawOsEaLFRuq+ASb3e4bJDeFnvKjmbbv99S829ppucPtpBjths7iNP+/fO37IX9/4JRoAgoU7TjMm81aV5u2C4AurNK00XGmsz1AbU8Re3aK4tYayNEkt/kT2Btbi4Pdl7AcfWmk4M21MEbugwK3BEVN2ghQXe+fGpeEobclXU21MvQlD+7xvSEEGBee3kGjoCzm21E9OrMjFUwq9HzJtyS5caGRtTIOqQysLtR6l4PyFXrk6DhbllM1sM5gsDccKWwoitejHD3HxIy+l3djLwfk/ItDcTrGR1lqHKEfbscc0gw1gc1p1aH8sqHBrqZ/IlwmqruJ/tUwKuOz3jVflQ/Uq/AwC9Cj9JiCJpzUtOB8KG8CHNwTl+rQ2H6+hVfmRa/gzFDeAHyEzY9tv0iYjUPM9g2WEcvCUdg2qo7n2ORZCBV+Y0uqYGYzF49KYhLEJYxQKacCHNzRFCSIBINgzhfY5pdXZYkqrY2YR6Z1azja48P8ynlLa5DrxG9c+fxzrUtPq6Ei/WZlXCtTAT7AWpKQArr6M4ilf3bKXVecGcAO6wX2TpdUB6beI/fWPayQDwwZAgkSUtLSWDwDzl+vLTgCYmG2RpbpaWDXmMYcTJJhMXNy0SHYFS3HgD6T8jtoa66Pg/Ot7wqQr2YUDv8BErcPKOHFx5+gi6QxsxYEfsYElVJqychWORegEKUYlo2eAAQRf9cdpZRxOkLPWE6TeAtGWaEVfXZcCwdYKWlH9TEDPVM9goesMbKNZmfiMzDvmM+Ads7L4ZDWTIrxOSm1Ux+n2TVpMRpmvgtOLWGgEx5vhjP1ABqyBgfNfSgv8a1ZsBMBzJ20lpb6tuUJ9NRuIM96xlXgU7KQ9Xrl6L5gk0ddUzztUfspRW1Ctyn3l99Ds38iaAFm0mUHh9iL6iIHzX6DvsNhIgEpGzwCQ34y8nCvJpJdm/wCTpUeZImIy28HY65yKatt989INLvhqRAooYbxuCz6zDZWRn+llinNufZ+RxupZ9GG7hpZENACc9dENLhSE+BOjOF6hqMZJv8AuMV8B3MWsolrExtJh9NWWwDNpnWHE2oedrzEFoePoq+5kN64NWGzUJ15spDTAR1Jf7SFNAxS7e9KEWNuyvbYTzFcfZSL3ehvFbfkAMH+prj/84Q+H/u3f/u3/leyc9P//u8jf2AkAlVJd5zy0+KPaxgurNajKhAE+fD7ABv1ToVJ63b5Jkz4cyWFGYeAeDvqGhD0MitLKO5g03Ot5NujtYQmVpuSum+i4SAe9p9tx316ybOnzlh6a1ToglkHRWyCU4Pybh6j/BgW4toxsUgqGwF+vu6vRf8efOJ+8M8kkAvN9VSvJznn6vg3pUE6IGhTJgL86SubQf+fCVY7bCvmy4Pwjnh22i420dqucZksfNfYy5QFj0mQrm+XUTNI7t/B6GcUaTQ05bg+KslCq68U0zWo5zKDg+8HB+ZLPTq2isA07xUZaA+5J8Fdx7TD6D4ocnLaVCoyjr+ab9udwKjqxqeM0W/q6bgD99yQmRh+lZzAmkZrpcMCw2Eg0AAQD3Br4q3zgDctqibMRaK2NbXCPzgdMORVFDDHYLBkweNlPpd/KnQXhYPXxWpot7b/vqNhI3bdstvTsCy/6D4q4nPYNIEDwvk1239SVcrSyfACYv+RLCvj++x//+MdH8P/Sf/83KQh8L/J3dgJAsEhvIZmsXkuWTvtsV2NqDUDkwM82sMxHVk3fFyLjNbP3jyigfN/dp2S7fzmJLjrLLIAFIp/J0gt+sqLAQ+o8K1CT1U3fbjKA79OOQjxq4rg2JwZFCzBBvijopri2d2ITpNECcS9yk2wb2oy+O7suQNICXFtGFkt7cYI8/KweJ0ig5XDjN9DN/Fi/B323zUGxkdLiIxQv2bF1lnznu0saE7kk2Has+ATFS+6sPGu72EhrQCKL4Py7gwzX1uOqbwcZCXlD0zHiL13lqq32JA2YW3ZNUVybwwwKGPjoRHAX2fnhHC02Ouk8gwIG5LxNvu/Ixlvj6D+gHXLTt0D9NvKu9ZKQFJeVBatoxvTN2X7033TaWWYdDMbkme8pCTmM1fvSmNX+jp0AEHBruEF7+R7ft4QDqAw3gGSsZXCg4ZpNJNJX6MpvQEK+fO4e6V/hJUNL/SQddL7GRDJpaS1YhmsC+A7WCDd9AxLymtk1ZOlFLxZvQRGX4/cN8JJVK8jjzmL03U0BJS3t8/6vjSry1zdzSUHfUSkIXM9/lgLA9iNLtAAAIABJREFUuMjf2Q0AU74R8rzjFr6wV2xWY+oZF/g+97pSmIzXyOYnKaXEoQ2j5HbQGQZFaaee0WPg4rYLwmS8RtbDwPm7R7pItL/Ydd+OL5STnpUeMrjEZ6qrrJ0w9J53f7Kf7H54D3335q7z7A63Vs9RaYL0kGUXfUjM66atxFwbud39jAbPNqsxtQYL/Mg2egy8r7MMybXdtMfB+ftPVyPg3E1btGLaj+/bu7FDWFXtpj0uz3ixr5xEKp3DDcBSi5/J3r5XNFu/MeA4g8KtXPLV/lM1tNioxt0GAeS5Xg0eRr9tLwy4CsLBgHz82GBDjq6yo75FvpBBaXPbt3yBHJ5znmHjBmMTfAZjtT85kPO9nQCQkpBLm/iCGfLR5wweoDReEFjSWSStEeYa7lYGBYGnKt5T6qbTzk8QuN0KXsI1AXw3P+luXAFOsrDpKj0deuVuvQIL91wn20f70Hd9Nk838gFg/pIvKeArlGyp4ufYP/3TP/2vVn8HE8aPP9KXScQ+ffpCdo/14gvb6ZsV/jsj62/24UCvOTzmui2wY7uGKK1EV7/rtsq7R6mm6JMO120BAH7D5AT6bcI34bq9xtpJ9Fvj8Unhv4HnrPe8gVT28Dbqt+5Bn+u+vexop9mF5z2u20qnP5F1E+Pot5lY1HV7LY/pMeaHwmHXbUWiP5LDy+fJ4WUeMh0Mum7v5oce9NvNqmbXbQVSi2Tp9AJZOTVLol6P6/Y+3B9BvzUVi79vRjYdCJDDSxfQd+BDt+0VlDfTjVpdr+u2fGEfWTLtlfw2J20QPrtur/HsBPqt7v2467a6Brw4Rg9vG8Qxq/3eaHwb2YGSPnoM3NPpum99AQ+tPh8bQLULt+1VnxxFv/XUuH9333/sR78d3z3kui2wPQ8/ot9qB9yPhcGFYaoZPzFGFj99tfW38Jz/a6OK/PXNXH/84x+L/vCHP/xJ8XPqn//5n/8Xq78jNq/oX/5K8UXSC5uZfGr3z3Ouh4kO0rV6HjNZf/vxH67a+unvP5DdT+7gYC+/l3Ldt+HoXbLs0hxZetFHvv75F1dt/fVzmBR2P0XfvU7/4Lpvc5cprcmFd9XkP3/9m6u24oG/oM8Obhkk1T+8dd2306UUX/So8zL5xWXfJv/9z+izvSOd5LO/3nXfLoxVo9+GNvjJb7/85q5v/3OE7Dv3geImW764auu3334jlRMXKQl5oQ9/dnP9e6yHnBisQ9/1fP53130b3kqrMc8NVLru20DzFwrVOP+eTP3HiKu2fvn1N7L+BsVjNc4WuGoLrvofaLV5Qd9b8ufFKVdt/e3Xf5CzVZXot+mzUdd9q/7hDTm4mW7UEsG/uGrrH7/+JylquYZ+u/w25rpvn2bKyMbxEfRd5D//6qqtv3/9hQwu9ZHeFQvkbqTFdd/eSWsBZk6lteHnf/zoqq0fvv4dfbby8jSZSj1y3bfHSVr9e//jA/LXr/afw39tVJG/vpmLHQF/r/g5KfJ38BLZyQA+CCZpNWbXY+Ro+6SzExW11KfPZE3gISm50ikLy7vZTX2IvyNbRzaSI1IwCeD8dMrejkppmU+UjPfw8w844D98zLjqW2zoMemq342+2zoftL3bU/UtQsl4+5d7ycqZe6Q+KZZRNMoQvLtHsZN77j8gR4PbyScXfcOjJZwg50i9ZznxJz+68tt1hp0E2EGo5aCrtuYzlIy3du+YTELupr27kStkR80pKix/NOKqrWhmDrFsmwoHZRJyN+2FO8+R8taL6LszPneZ0zgj423ePoXYycmMu/buHKFkvDtqT5KiyFVXbXUxMt7txV0MyxZw1d5+hp1sbDpKIr23XLXVmpwhy+eLSe+qBawITgecZ8ZgTB4NbiN77j2kG9z7yZzfsZMBXEg2kdq5VWTZxQUkIQeohvO+fUFVi6KuEvTdo1Bu3+xY4D3FTr44340k5IlPPzluC9YALNSS1oStoxtIZbzcVd9et1Ls5Imy10hCvvjJ+fqX/pTlmhys3YJrhJ2/z2cA85d8SQHf/wVZQPj/f/mXf/k36aoR+Tvc1fwgiGlZ/Eo2MOm3gc4rrJrVeWUbJ+O90dpIq1kd8oFxOx3cSylNjs07YntXGifjfdXzGAf8kUfOsShQPRao20R8kr92zfkMBdRFjZPxdl/0oP+ArFcUM6J93pn0V3JuPa3+PT50Cv03lppw3DdOxnvpDaVMGApfdtwWVMSt4tXTDXuYgHquuLuocTLeitIhWs163T5hMLfYYobs8C8n2z0ryem1fvSff955NSsn4y2qa1ORkDuxTCIh+Wopmateh/6Datagi2ItTsZb/XSUkpBHnVF8gPnmKYn2me/96Lsd/hXoS6ftXX9Lq6cfNNWrSMid2DSrnt4w6ydeyX/AeADMB07buxiuoVrKV+dUJORObDQ1jmPz+CDdcMCYzWiKtfTGt5H1h8/QatbSSRUJuRNL+UdxbPa3nUX/bZLWCKdsDmBA+wL+KmpoVZGQO7HeZqpsdP34PPrvdHCf47bA9t6jpxtvBu6oSMidWCurnj4irQnICVi7EY/PRf8envN/bVSRv76p6w9/+MNFKQhcIlnBv/7rv/5B5G/sBICdjBz1gLRLzvLZOV/gZTLe6CjKJsGgTzhQBACbTtMBfjiwhbRXUY62Ept6j0rjZLyz0Ray9moAB70n6GyBT/mGqBRX835DAXU7xsl4fdJuFHbIwNEWyFiD6fUWiOEuSi9x60CYlEuLJ/jwSfSe475xMt7O8ThpQY625dLGwdni0sgmyNPeqKGAuqipyHg9ARUJuZP2mhIN6Kvb4Uvk9R0Kzq8tdVakQuklNuP7Nu71qEjInbQXn6yk/Im9N8mdGC0GKXfIZ6ck452YiahIyJ20V/siJRcb3QpfRB82JxodtQVkvKsYGe9UYFJFQu6kvSeMP/F+MEnCHWcY6X27o7Yiiz+S5f5iNG9XSkVC7qhvUUptBQU0MFbBhzB2lb8jGgCCvGCzfwlp9a8izYNJFQm5EwM1C8qf+JbsZRnUXocb3KS0iUKuybUBUh9Rk5A7sZLzlD+xvTpDDkljDHw47YDwGmxqgfInbroZJHMxTkJ+1XHfLij5E1sO0oSKV1yXPB8A5i/Xl50AkJOjwmLiRvIHJw1pggSC2WXSBAlkvJ4HlKMNhNSdDKaX0Sc4uF/FnlLm/OXSpLbMT2Jh+5mPJBLMZsl4C98ncOC/bHa2gwdaBBjc8fFyQwF1UUOCWQUZ79VIPU6S5XFrnje9BeL5NUrG2/wuQxYyQfThvsA6BJnb7ds0I5jlZLyDUnAEk6TH4QJ/lpGj1kUXDQXURW2UEcxyMl5OQh5udpYlvhKi2dLOZCeZGKQk5Fd3OqOpAX1pJRlvloTcWfYp1HKIcv/5+snEv/8H+hBoYRy9u50/qMh4ZRJyB4Tt4BvwEfhqUvJZZ7IDfXg1dNpR35oGPslkvEoS8kh6xnZbENBuYacbY8mfSGKmiW5wOy846lt1Ygz9dCFcjVXTnIQ8MWN/XIGKxd7A9+grrzRGm95RwvYX19QZbNEAcDZeybgmb6pIyL0h+xtc4PvzV69lCiphUsY2uLdsUppw85VSBZV5aVOlJCEPOSBsj0pzP6wBsBbAmsDXCPivk749rqMKKg9rkiSVSTES8hWOCNuVEqGgoCJv2rqvCbeRDwDzl+tLNADkkj/w0oZlTVtnot9gtYkJFRlvfIxp2m61v4hChe2hwCYc3DNpD3725BLd+bV9sJ/5mItXq8h4+6coR9vuIvuLKJ0g1yBBaiZOaQP0BNSFJ8iytIqMtzNJj4EPhaw1j7ULRCL+hZxY6SdHl0rPlFHJXAwdRT/2OOChe8okpjgZr1da4MGPfQ4WeCDghaPLlZLFpf9XCagHxm23d59JTHEyXk5CPnPefpbYn4kgGe9u/xopiP8J+3ZpCz1Gnxmzz0PHJaZm4pQqhJOQX31jfxFNR/lx0gbp58/kl99+I+tZYDPrQNN29mpcRcbLScgLHUg2zoxSmqZLbIwnpU0g+BB8GcjYp9Q4XxpTkfFyEnInko0DjKZpF+OaXEx9Iv6qlUhEDoTkdts7Eaqg5NlJGoxyEnLvU/sbXBiLMCYvhY7hzzBWYcyeXCltIuPZuVI0AOwJHUY/BZI028RJyMta7W9wQcUClWbaT+LPoGMLkI01Dja44PfxXSH0U2yAZhA5CXlF3D61TOsHGig/YbrVM+yUCDKBdiUboW9bbgfRT2PzdIxzEnJPosl23z4wmqZLjEqNk94DL6CoRGg+AMxfri/RALCSvbAXFNx/WQH1Y7YHwKnwexzYnIwXB/9ONvgH7R0fDKWGcWCfUeA7Bto+yeB8u33rlYIgiu/opYNT6tvmm3TwT3jsLfAgiUQnyCzXllZA3Y5N7AmryHjT0kS2LvAIfTmXNl+otAtEVz3lsXtwJrv41sVr0JdFEfGdKH9+25jIPCfjzUgLfKt/NR43JTP27rWC+eiKIpOQFVC3x6OIFDyBxyoyXk5CDsU0wNdmp70P8XL00cNIYfaZPknJ4Hx7ffsZweRKMl5OQr6yIEDiNiXXgMcOfTT4SH7e91jh1jObPIoZaYMwLG0QlGS8nIR8beAh8gPaaY8XG1UpgiDwIfgSwPl22grHvmDxgpKMN5peQD92SJvBRZsLPOexA4gG/wyyMZi5n6qx1ZY/kyFLJB+t9j+QuSY5CfnYdvsb3LuRq+ij+ni2Hw9OUxLy7oYs9EMkAIynA+ij9sB6GW/GScgB32anX/gcugpYEqBe/uw42+C22Nzgxsepj0YVah0dyXl8346E7PMo8mKjgfZsPwADCL4cSo3Yamtwmvpo193s8/Mm2tCXgKe027cjzEftCh+FP16ylVDJB4D5y/UlGgAeZi9sm+KFVQuoixMl0wmyiKyCCi/FUaP3BcXKzNskI9ZbRKD668xaypzv94gvVED4DIO6LbBORcb7qJZiZeC/tiZIeVA3yJ9pBdRF20pM/kwnyE1qOaO7UQqWBgZ9qwlD+bwh8AP/QCAo9zeTJNv8yxg4X5ykd3j2J1qNeUe9wI1EblEsZfy9Lb/x960jnj0GzcRCCgF18WxWT8qL/tkXVBcIzFyiJORQVGOnb2fkRSSblViYpsUN5zbY06IFEDn4pzd0XPX56WdR9GdDv/gzwCxpw3aaJQ1Oy897NPWTIyWVUAPNkk6fVmfnjoTeoT9BIUS0LSw22kCzpAuKY9DB1BDbvO239QygaIGS8ao3Ft1SO+DPYEo8Y5RUKFkAREP+fKGXbt5aj9rq25v4IC1ui2ShD+B3CP7An/Fh8U0kjEEYizAmI5ls4Mw3bw8VmzeRAHAq9gr9Mxa9n3020vu6iW1wAecm/EyTaQUMKDuGQB5UmywQsYWHDAZUkp1jYZMBmw3wJxBEi7YFBVlYbLSWskHwz/nm7VHkjq2+QVEW+Ke0KfsMMos/UBylzQ3uPCs2ggrglGI8QkGlnYRKPgDMX64vIcwIe2HXaV5YMFlAfVS8+u51fCBngsQBMEcDHACdLwrKkcERnNExUlkhBefXlYofbUAVIZ0g1YUQkPmDCQAygaIAeMBG6k2QYEoBdeEJsoRNkA/VE+FgimopQ5GD2QKvXCCMjpHAODi/xcbRRnEVnSCfNaqzTIEklTbrCR20PUHC+5bW3E+o7bhtLeWbkSb0D7x3ys/DrVRsHopqRNsyO0a6uZ+C80e6xbF7ACIH/8wrsjtgdb1UbP7sC/Gj0VRgghYbNdJCCP68gUJkhxT82dVSnj5DcZKhenUQ+j4+gv6E4znRtkYUxUbKz/XgGyIGRQvgn9ZhdZZpRlrgwZ+jNhZ4Xo0J0Azl53SDu872Bnd/6DX6pzu1oPrc+4xucD3F4htcKJAB38CYVH6uhG9EWHbWKgCEdwKKZMA/YU2l/4MausEtqRMPsrKFgGqlGScbXMRJbmI4yUl1gHwn2iK0wVUaFGTB+wYFWsrPOXxjD4NviLQFxVhQlAX+mQ+oA+TsBrdCuG8vWLHRXU0hoPJ9S0cDlu3kA8D85foSCQB5dVyxTuUqF1Dni47IANgTfIUDujfly/lu8hCtcAXwuUhbAMKHCRJA+drvJgYYOH+XWOaDTpA72ASZSz0AGECYBAAT6GaCBDNadIQmyImfcvq9NfAMfTqWNj7GUS4QzQxI/vxaLs6sI9FOwflhMeyecoKc9f+s6dtn0h7YgD6NpXOft50JUunTSLeYvFlS+vfX+B/gkZwvow62M8mvWEwDFcFQXCPSHhQZGQHJm97S6vMXgvQyAB4HEDmAyVMZdeAcS3whKy758Sg4FBNbRKMD91WbMeXz5j4tEqw+hyNfOPodXuGXgh/1vw+AfADmA0A/JriIvmDFRk06utWl0cesgOuZUFtQrADvGhQvJDUbxYS0wENGpk1a4DOCfTPbjEUH7G1wZ9JxHIcAOdBuEJKz9je4UCBDi406cr57fpUVcDF8plUACMUxMA47g9tz5sNxtsHdZGODa7YZ4z6tEtzgAqQFfDO+J3f+GkoF0afbg8+F53FebDShAye6EjqJPv2YFKMz6hilXJOHdajAgqkh9Gm3IL0MshGYbMaiAw8Y20GpZVv5ADB/ub6sAkDEvymq4/Re6Oyx05TlSzueNqeS8JdTjjsAn4sMKKDhMKKSgKCJg/NnBcD5sCumVBI7dSealy2U466wQmwRDbWdMORKVB47edLWwUe05wdTrkQobgC/PojmLhTKCYM/79sHGZXEx9xAm4LzV7OsqvXRRvuI8QSJzzz6EP06FXvpeoI0y6rqGWBMwS8Aytf7fu4WLXKA4hqrtmBBB5ohIyoJzKpKweTJVVJgIkAvA9XR4BcAk+t9f7mMFjlUdFrfp162Svm850yyqnoWqGDj8LL+84fiLfBrTcK6IAcyzOAT8E1YR7d6Oj0nUziJgPPL2Di8ZTAO+6TNIPjVm7CmcLHKVmmzqlbtPY11o1/uRfX/bXmD22G9wYUTDVpstBrHpPb7oU6aVb19KJLzvPXaG4+WoF8mY/pUSpzjrmfCeoObhWN8rwvHsLvBnb9NuSZ9r3LHIfgdgj+kcEpZZ2KhEAuLjaS5X++ZKSmcRPoGxVgomdeROw4phdMWVn1uDYkYTprDMdRsB+ZjIR8A5i/Xl1UA2Muq43Z7woYToAw8H3hoOQB4NebjmD6BtJx5WBkgmbj5hBvJpMl2Ga+mv0hW2gDnj0WLGZnsa93vF4I08wC8gCmLHTxQIoBPgCIBKoH1fucOA56Xhq2Dj7lrcVMy2al0DP26USfzoJww4PLN/mxIJsvtQeQ2w1VaH20ADourpeh9H05NscB6h+UiOmoxQWJ7MvC8wbJvZ8KVVP0joU9uHe3JZh6s+jacGmFksnuN3+9TFFfZ02gNgO8LnaCBikEmooMF1kALY9VWcqEnB6+mDQj0cJVGNnkwbBqoNCen0a/HQ9bFG1CoAD65f1r/OBv8foqRuA+nRk3bgt/lmXgoXtD7HajKpIH1ecu+cbyaUUGWcoMLi7NV37axQGUkFdL9ncAHGlgD/tSqb5U6xUZKg7F7dh3FOXtnfzYNACGYaA9sZJl4fTJ1TuIO5NpWfcsWZOlzhsIGdw3b4HotNrhAZwW8f+CX5IL+78LxL/j1jkD1Ocz1WGxkQCkmk7gjrtJ87o0nv5CVBTQTH4zqz6uTsWfC1efFbM43KsjC961pD6NxMi9UyQeA+cv1ZRUA3mBSXK9NgpR01M+oJ9abgvOhYnV9oIRVYxpPMgA6R+xRgzkAvj5eixMkSHIZ/Y5HEJwPx0VtfnU1pp4dKaHYo/Zh8wU+Pv6WHlX23TX8nUEWXO+0AOerqjF1Mijc9rGjdS32SDlhwFX9jAbFUJVp2DcGzj8bPGB6n1CNuZxVY4KclNGkxo/WQynzjBGvWH1qUrGaraw+adoWLzYCsuy4wXEgHq1vpkfrcYss8aPIXfTJ+7hxReLHOgbOP2uO3csWG601PKqEo/X11yk4HzgWzdrTq1jVBgR6ldV6lphmxUbSBsHoqJIerVNwvidjXl38UKfYSGvvY2/RtyUR4/ECBhQciMW9ZXxUCUfrFJy/lCQz5vcqUrGqrKw2a0sEi5sOSxtcqD5fbl19DoUx4BMYi0a/87aY4pxhTJsFgIHUIDuqNC62UVefG/eNUjLtsqRkusWCnTKLDW64jWJxJ00YGzyK6vOkSfW5qtho2njM3AlfQd82JMxxrPV9FIt75rnxeIaAmlZWmyt5QOZ9HQuK50womYAvlhK5F5r2LR8A5i9XV6P/u62xL82GAWBcIcXlt9jFhVoP0+POhT7D3+GcdQdC+hk2bsE6Vn14xnwRBV4sGMTdFnI8IuB8yMJQzjrzoAKyXHrVhzn30LSXTpB+44zGooZ81rCt2kVZUN7s3+TVh9ci+pkxeM6//fYbKdhG8THTo8b/JmQRD0oTGvh31gSc/575o6DM3B+QVaXgfOMFHiZIEc46Nbei8aLBi42uR8yJqIF8HMH5JgExAMYBOA7+ACC50e8lpID4xAo1OF/PstWY5qor96utwfmLqUXkD9Ny1mkDAs6tuEKymAk4f+ERLTYCcnazvomA88EH4AsoWEgYbBDAfNKmC3y7R9qEpUywe7zY6Em9edApAs7npOxWnHXpiFKqy/gebrFiI+BKNOubXH1uwlEKBTHgj4OBTabH4tMj9Ljz8nbIOH41DACHIzeYP8xlIyHQAf9CEZKhP+Rjym2mG9c+tsHdY0FCPnPR2h9gkG0G/7YkjTOxvNjopoXqCqwZ4N8CTfW91k4zf0AgaPZ7UOSm5FbUsw6mpHXI4lg8E4/h3GYlRfghAcVYd7b+3nFE/vpGr2b/n6I046WPq6hjxyMgxWX2woLFJ6vprqXnuuHvcFLPcgtST5rxYuB8v37g6WWqFcCQn7JQrWh6Q8H5pSbg/IHwRSHVCshyQbYLOMiMwPnp8DybILdY4jh4gQ1kvox+h6tWhJrMs47BzKIMzo/qYIZgYYj6/oK+uLLDujCGg/PLTMD5XLWiw0K1goPzWxGcr39016WQGrR63yCzStVV3ul+D/e2h6lW6BUbKU0Fzk/p++Rj8iP64rLFBgHs2RUKzm+p0F/QULUiuN2w2EhpE0pwvkEGW1at+KiuFNXLCJ1j6iq1Uf0FDTOiG/WrMbUmAs5vKWfFRgKY3suhE+jjLsnXet8D7OJ7Jss45zcf8xyc32UCzn/FVCtuCxTGZKW6BvWfgTQHrWbFRl6LY0U4Vleqq+j2TRpz4ItSi2NF8DsEf7ihk4JBvQAQpBhb/Cux2Ahk4Mzaa2TqKieeGs/50cGHQoUKSvz4pMEGNx36glycwwIZUcCbwvt2nokH6BkUYGGx0VvzZ6BWV9E/rveFP6PMoFVGFGxOVlcxWf9YYUyFQGFMuOMshbnM6h95AyUO+OJP/jvR3zuOyF/f6NXk+67YDJx/gi0WjQKEnlkm85XIop8zaTDpN1FZn7kbcUNQMBhoYorq1ob85uB8qo25DCdJEVkfDs7XAwXjvQ49oRPk8FPLtrgAPWS+9MD5qYXPGAhDtWpGgBT4PAPngxSV9jtYGKofU4LsmhfWpMBT6Vn08ZHAVt0sxAyTfoNjShHd2v7waZwkFxKtut9fY3CDdwITZMo/QsH5TXt1vx9j0m+bA0+Fqhq5AD1Qw+h9XxguQF80Juot2+Lg/MJD+gt8KDVmS7d2HwPnd4/rB9lGurV6ASDXVz5lsKmLdJkXGylNqa8Mx596vwMFCuCLIYGqfjiOAx8XhvX1xVuHaHByxKDYSN03JTh/Vrfvu1mxUb8ANU584gM7lrtl0HeqWwsE95Z9U+grw+ZD+7262Mi6sKDmOYV0vC1K6AaA89I7C34YFCh6AH1lM2k4OOIEqA9iIiPWVf2PGKTjkcEG1//OvNhIaco1JKizhlgVG2ntcbQYfVxhgPnmRX8331lvXqh8KJeGy91cRTNfMPMOGfiQADVOYq6Vbuo69JkYeLHRn7x3in7vOCJ/faNXo/e7/xNpAQK5FUdKSZ+EIC0AZCBwIZrJ5Y/j2pjnw9VCbUX7GThfR18Vfj4hLZ4weEctMGXc7pmA87PamDeE2uoao+D8/fdzF0nwI2T+cIIMi4mOH2AC6l064HzfS6aNWShWedyanGXM+bmZMcggQeEH+ME3b034Cn4+GdyNfh7RAedzbUw4phTp20KixZA5P6GAGwQEqqKt/AxVmErpNysDMmgE51/IXYiii1BstBwtalBspLS0Apzvm8v1MxyD02Ija/k+sLftaUNpuOxx0eqc4yK9ADBhAevg0m9+HboWPStl0nC3I80533lZsRH4wqjYyI6fufRbVbdY37g03Hg0F7s3zoqNIEMlskHIJOKmx3Jc2QgCQZG+cWk4Pe1zKISBMXcquEdogwDvGPfzL//4LScA7A0dQz/4kmJj4XYF0z5vyd18J739FH/bckiorQkLP8NGA4uNusRov8y0z+Vio1Ni3Jkj0kYM/AxznN4as+NOyBbt16B8ipQLwalhp2nnBcmxF9M/GsJcULda2tiCH/7Hwp3/4/eOI/LXt3v9t97oPsacrx5QpTaOR+TJYb6DgfNzdy3HBPAb2gE4to1Jww2pB+BkekbOTIlyD36sNQbnd8v4jQGhtpTM+VppuGxmSowXCuwdA+df04DzncjjAXN+VhpO/ezkzJTJ0ZPWKqQgBcH50aKcSYjL443Pi/GtUeZ8Kg2X0ODoeGZKBG7ALTb8jILzh9ScfFQejxYbzabF3l+Uhluhlj3jxjNTdwwyU3oG2RjMtD5XL/BUHm+Nrg+MDKoPAZy/QiF7xi0+UcEyU7dz/s6oKOA6y7S+0YDzzXxgZHDcqZU948aLjd7aID6G7J9eptXMB4bvR9qnkD1T9+0hy0yVmEAvtGaUaTXzgZFx7XOl7Bm3El5sFBOXPytkmdaF8f9QPe9Y2s98sA6wkNMvAAAgAElEQVRlB0XaGmCyZzvv5m6+Iz03KPRislK4b3vYBlebaZWl3zbl+sDIukxw5LzYCAqxRNqCTCusIeDrKU2WeGiG+gDkLUXXGJ+MIz+R8x0/TWu2IY/HYS6xMfVGkSsb7Q6+hCKQ//Z7BxH56xu+wj/XsuzXTfkFU3KxDdpQDlDvWrILuWgFl9ZkaThN9utZ9CEO2tfSDl+0LQ7OP6YB50fTHkUFl7gsG4Dy9bJfVtg0PYOMFxwNrJQsrjgeAMko1A/dZk/Cyyj79exKDCfI1vfi6iMcnL83oAbnA1cY3P+eYnv6oUbZr7NsgqwzwKbpWTrsoVjLOrX2K0iUwf0ftqkfOntFP/tVYIFN07Op4Sw4X/ns4PibZkHFSLa58exXdbfaP8HmA4wyIhebZhQAdjOs5X4N1jJYxbKg5+1JeAHHolLXG0yFTbMhfZbFWqoX0XftGcMsqJn1hI4wXe8e+TPYvGxk2LQpk2IjrclYy041b6NZFtTIcHPHdb17s3NsCouN1qIPfCZsBFoDvCkqX9xOq563WRbUrG/bbtPs18hs9tktpj8hxMf/YSnJJMSDeo61vKVJJshZ0MfiGtVpha73VDr7nooWG2kN1hDwNawpys95FvRFk3jfjJgklKdpZsVGWkv5x3Q5KHkWFIr+fu/4IX9949df//EZ6RIo/o0ufEOsemu7Te1QHIh9d1gAlOUHs8PhpBoADP82vDogTTi0H1CNCcEIDFpP2louR2nPLsdywPkTsaeMwylX2cHMOP4NFDA4/g0nyOpVltWpenaGBUD1igAINJFhgvQ+F5+EwPTItuNRFgAv85NYWHyCBMsGQNmA8vo7So76uk1cZg8MaGC0ZNtBVp2qDYBFLNi8nwVA2Qz2pXAN3v+HuDmnXM67q4N/E61O1Rrcm1xtrQiA+sNnGQ7S3lhoYfi3oyXZ9yodWWABsP7mxSgAhHdiAwuAphUB0OQRcxykkdUlJtDfp8PZClOjANjKkgYBEMdBdhngII0MJPbA30PhLFVUDwuA9wkUG6meaYoFQIpqayVJsREO0sj8rym8A/DO/LMugwDY8t2VAqBjTNoxwYrTKA5yszBJsdJA0hH8XVSZDdoSs80sALbmV1QaD4BWSwFQnL0LUGxlhoM0s4eMS7Yklt2Q8WIjKMCy05Yn7VcUE9JxCjjI1ZeNcZBmpsclW2YQAFu+byqRBQotUGHpFxfzAWD+cnfBAsGxC/OME4kTFL8w4WIzMiCvVB6B2mVx19rUSTUnYHuiTbgaU2uDHWpwPp0gN+G9R23okHID5QuYJNsYJ2BiptHRBAnWoKm4xgmSk6MK4PW0tpdxAsJxAfwMWT+495fXU5bSfzl90xyBUnLUAFbIAXeY3UktK7dHyZnfsAnyqgU/nZ7Fx/kRaCH+HM78QJb7i9Eii/aCBVUFLJPbq2DFRtojcBHTHoGCYDythF4lbbbs9U1VAcv0SGPDz9kRuH6lqBkv3H12BPqEjXFZh/t740pow2cgLZyr/PeRc9HP5PaU/HR2/caPQDk4f1ygEtrQb5m0tLldjpZi1bk3DI7ARQxYDnCDO0GDXbsyZaq++dkGd1WW9J4fgVvx0+nZ44t0g9vG6FREuP+MDDRvweffK0jvs0fg+kVcZsY3uDVsg8t1uM0qoY1sMh1Fn2/CDS4Ndu0UG2mNV593MOUYzv13yqQS2sj0Nrj8CLzPxmkat9joKxXhdmViVMbS53kA85frCxYIf7ILX9re0FEVg7uIRJnWtOB8NxMkDqh6yoEHgSD8zLUx22xmUMC04PzsBGlOdmxklV30WOrCS3oUEWo7Rqki5sWPCrnBzniloghCniBNyFHN7C3jBITjAviZcyFqMUIipgXnA0eYFTmqmU3HyignoBRUwTuxi8ENeh1MkOoiiB9JRXwY77sgUuuobzIH3v0kLi5HA9tsFRspTVkEkZaCqpn4O7zvEQNlByuDbAz4/WlDilZj1m1mChW5Va5gZgHgGAPnb2LgfO9TxoVoA6+ntBuRRvR7Wbwf79WsCMbKwNfg86PB7fgMRLgQzQyyf+D3uXgNFsGsFuQ21TPINNMNLi0cKIw2432XmnAhmo4FTnovzXPqcWY/OB36SDe4txgHHlCSiHD/GRknvW+VNriZhBg3nZG1MIzvEcaBBzADuG+AHTjp2z7FBlc1zgQ1lpXWKq0lSu1zoMCB+27oF4ejcNNSPNktNtJaVnKPKkodCr3B+25LzuYDwPzl/oIF4tOnnxEoDS9tXcSLL+xxQQ1HPVOC80XIYk0HQOIrHgHDTtkzH2DHcWt0tTFFjIPzITMBuEc3EySA0QGUDuB034JXSA3FzDg4/204jdWoOEFW25+EwJScgKOjNPt3YVOQ/PprbpWgiHEaFMhM8AkSOMOc9A3wMZAJa5OeY3884xhuwA2oEjhn1kE2QXYkxSqwc/qmUMEYkIJooypBYb8dppmJ3uZF0iW1QwuuzCWejGx0jmbCttwOkriHSb+1HDT8fStt2P0sM9ER/UTGtjA1FBNycDPrS/lkYHpv06LtYiOlKavP+xJDwmooRgb4P/B7T+gwQizgnk/aKDZS9+2LfCwX8Y/I3H8LFmooRhZq/CRvcK1ocET8dmkLhR1MjSaRkoRy/zkLnKHamm9w4xPvTWlwrCylUMGY8v5I5T5X+LHwyEl7fIN7PdLgqNhIabCWcJL3IT89+gUqnITNTDg3Jcm7k2KjnHeEacqPz1OicVDTAixkPgDMX64vvkAASBhe2qOeIVWq3olxbNJC/WaylslFzTuchMCgCAQmycYn7ThIn0bvO25rauhHnCwKtgdJi28lk4tyNnGAcaHwl++adCtS7RgH5x8aDVFyVBcTJBgcE4Dvb96ek4NeK+k/w74x5vyTM2ddT5BgfSHKCVjgncB7fungOI4bVGWC7wc/nlZNkE7bmzxEsXCljS/wnqsdbhDAOln1edHJBWJEuSRqmC0touD8tqpHTPrNONNpFQB+YNXnRU30fsd3Ow/CldQUN0/S7B9U3jv1G/gcpQh7S4X1kI39lt3gHvb48J6bbFRjag2qMsH3VaOFeL8nBbj/DP2m2OBemTgjpGxk9rxb3tL57entYWHuPyODDS4nvZ+pO2JKhC1iPBj68Jy+b7PX7EM+uAXYBnel7z7O5Rj02ig20hrwyaLOd10Hvm+F752vCVzmscW/jmycC9guNtIahxYVj1/H9+1+tEN+3r93/JC/vvGLLxDR9Dyp8n1Plsx4EYxvJhUlYlCdWNW2FV/YYwKC8WYGNDAwYbRvGSZbfLkl+3YMFjhQwYAJ403zYTIQvuCqb0DOCxPGrmu9wuSoRpZh0nCXnviFyVHNDDgBl8wVkyOrFsgRaYEJej87DgDTi59RGm5NdRHeL1TJuekbFEHU+laR5TMeLAAR4f4zfKaZn0igZh0p6juomiCdWuA9rYZ9d7YKReOtBOPNDIjHT6+hAVHV0GYyFTNXT7CyslbKCVhw5y3xV61CGTij37UKAIGcFsb60wv0fYOiBDd9A3La5UOP8V7hnlM6pOuiFsmk8Ch05bNqvF+QYHTTN9jgvvFux8UYMlEph4EuGD0OXUqOTZzH961ekPvPyOZu0Q1ucUkRSr+lbTAlaJ/3z4t/x7F+YvUsaZhbQXwOg0lunPS+tOQGCdQ737yAIen9tJ807KDvW7TH/lGy0s6GK8nq5jJhZSMzA2qxzb4lZPnNEbzf4VnnwSRYb+g4ebxwXLfa3q5B8dFC1Uqybv4Gvm+AgeTP+/eOH/LXN34pF4hC7wt8YS95p129sGDxqWpyevS0oSqFrQEgDezBHR6cNArbjKV2RK2RScPdOP+eeJPuggXkBLzuwUmjt1qMSNrMgH+xeg+dICMf3U2QwAm4rbyGHsedCloGBFZWFn1Blt7uw3sdnHZ2BM8NiiBue25TclSvvepJPQsPlZANc3SHDFXQrvoW+UIGl3lJ/zIPeTBX6Lpvb4qoPNW94kckbrNyXWv+yGey5LyPrLw4S3zdxaa/K/K8b8/GSM8K6XmayC6KGvBObi5qpnQkRc6zO3LfvIXku4vSBuGiFyUY3bQFaiBn55/h+/Yw6G7zAjbZXUCW+O6QVb4iYe4/I4sN0A1u8/Y+8ibqfIPAn3fxKR8t+Cq/mcN/aNc6R+kGd9+1jhw+OidW0EGpbwY2BYS5/4ysKTFNdpzrptJvb9xtXsAODVzHe918x+MqmAQD9ZUDc9X4vr0XUDayssbhWzi37Vt4oHrev3f8kL++8Uu5QOycm8EXttxvLWFmZcFkjCz1FZLl3tskHPO7bq/8aSVOHB+vmesIi1ggGCZHl8+To8sWSCjgLsgCe/CsEieOu2XOsF1KW5igVCQd6/wknHS3IIOdPjyDE+TtuiHXAWDHND1+XHZriMQyzo/3uO2cG6VHQkFz/WUR+xgewAly18wVzAi6aQsm/8pzDfgcht5Nue7b4EgvzYqtn3IEUlf37Qs5fruFcgK2mWfCRZ73UBUt/nh/zO8IpK40uLcj6+bxXitH7NGO6Nn9tilKtfSiwfWCDMVtq2bo/DYUdz9On3up8sfV8QLXbcFYats8RDlPh/R1aUWMP+/a2jp8BtcPu7/PVCJF1hVM4HOYmnWGm1RaZyEtenlVbJ8RQms+/4/k8FIvObR8gUwHnWEwlXbkNc3+HapzDvng5kml8DRt+cwsCaXcbzgu+GjRy6uBrIpSPgDMX64vGQPIqpW+nxklzb4VJOUQ1MytnFVjnh85RWIj+lrDohbKJMj+sU1kYImXDK+UFiqX2QAgIb51sRwnyXoDrWFRy8TCZPDN1hzKBKe2UEKrUItuimnimrY1TavjDn4/SzYtPCWLn764CgDvfqBVqGuq7juiqVDamPy+jZCOgPMiC27XIg34vj3r2mMooC5qIHt3vu4E5QQ84O74BgxwWJf2t+Oz6LfJsac1kOJ6//Q8PocTT8wznSIB4NRxisc68UZfitCO9bVQnek9+4fJBUHJRzM7cJ9y/63rPo6yXW7a4sUfu+eayEjEWSEDN6UGcmvTBsMqbFGDsXT/wX0aAN51HizAc/7tt19J28I2cnLtJK36n3GXAQS6m8Lip66qsGW/Jb+SYUZttalL6psL2AdY3Ut6krP90kfyMtbn7j6R2spPvrvgJVumN+Ka46a9p6EULTaaLyNzcXdjIZT5RJYBtZW3kExXLZelL/MBYP5yffEFgvOCXffWMcoEcamfnIEuTZC8TL+udTNTanA+2Cvj5QjQbTnZRytjXYDLKQ/dLvKu7QBOHpe2hlwdRcRGXyL27/CdYZwkgbDXcd+Ah24Trcbc1u5HehQ3gVHFwyQNAO92M8qEBccBYFIKbNcyHrqNE5vJuZBx9amIca7JK55SmTLB8TNY/Ims9N8nS313yUTNCqyac9O3+5GbZOvCUtK/fp5yAk45X0S5SPzzN9fwWTw47S6LEu66TOYrlpPVBQtYjLNgQlRrFQAmgWgdjuNW+8myCWksCOqUGvrtNJXi2vi2ChcsWLictjW1QHnoVl+fJ5u9S6Vn4i5oO7oQwfft3sJ5xsPovG+c2mrrQjHxKTjanNrZ4AFyYGgz5WFca5+HUfm8f/zzFI6nh3cq8FnAHOC0X0hE3LiL9JTtzPIwupiPwi204rn1ECUhf+6AZ1buWwYqnmnxx6r2l2RnsNTVXFnTQ6mttjzpxbWmMl7huK20gmi9zLsbeRjd9O1dfAjft4tz92mh4WCJ/Lx/7/ghf33jFywQmU9fyXr2wg7Ehlxx44EBIz68sFAVGGg5TKvHPGJC5HqT0AkpYMMS/YZJSplwzDnGK5gaZtWYO8i13bQYZFhQiDy3b1nOw8rWeZxAzr1wvsAD5g+rMfeGyTbGjafVzxSehBRcbC/GRvB5XIvUOw4As0oUYXIosAmfBwCnnfQtruBi64lUMMoEczybmdUkxvH+zoY+YDEILcbxOmoL+Nd2+FeQbVLQNv2A4pWAG9Bp32aljRRKv/lukVOrAwjQ93ucbYYyiTiqUIAaxe1yytFWaiJVZRUAcqnF6dtxskJ6Fm6Kcfzzn/He4B4LfFSqqjw+5KgtsIc1lPuvqDqMz2KnfyVyUDppC4sPWPFHb4iS3nsSTY77VsiorZ6HWhg33hpH3HhgE6lpHEuHApvJ5FH6vkGg5KQteM5T6UKqRzvagGP/3PogzgVO2kv5RynnYcMOsreYwj8+jjnPEk+fo8e/w5UpV9x4YMOM8/D6nhDZHqBCA0BF5LRvxx6z8dQ3ic8D1hynQVsr4zw86AmTjsAWfB4hBzyi3HgypSPUx6jGNmBCJR8A5i/XFywQHZx+RNolK9Ux7MoHcbscqZNJYWV1jI4zjtripLDHgjukBfCLK3UMsMFwgcz9x/UzSy44y3zAcRxOkM37STT+GY8QljpQx5AnyDN0ggx8yMjyQU7UMcD4cdydIxESzHySOQH//MtfHQWAnPsPdspvYy8dq2OA1ShUTygn4HfICZixIbWmtCOhd/i+NSenURWD7pLFtU+VVhuvklVPEpOME3BDUFrgnS0GsJGC+wsk+8nrO5SDsuqJs8xHbOytzMUGRTjwPLbfMc4SmwWA8Ddj20N4f1BlzzkoXzmk46l8QrnY3txNkI9JDz6P/cEyR22BtOIGxv0HmUCujlHr8CjtHjvdABoSb6Kdkd4fc9QWFHysUXD/hTvOUg7KGWcBJVc9gTEFnJ9K0nu7lvmUIa2BFaRFCphTmSSOfXgmfQ4DSln1ZLycvP9IOQHPOtzgpgKfKfffSj9JRz+TvYyD0insoOQ80zWX5nDOCXgxXOOorTmmegInHInUF2mt2e6Y/B3slEL1ZCb+Ft83IOV20haX9eSqJyGeUFnozQeA+cv9BQtEgS+mqlaajD1jAuIPbb+wIAXFg42wFHjAzthfvZZmZaL2KyD///a+M0aOJEtPp8OtIHOQftz9WR0Ou+Mk6I8gyAMyBwEnaAXcYXV77KYZcmiGHHJohmaGnhx677333g89m2w2m812ZHtfleV9Nz1O5la3q1R8YbKystJEVu2ImmM84LGbVdVZURUvX7x48d737Y9tpzfj5cR5+n+DH/eo/0VUABCzI6Ac48clDgkk4pGg/6AtWruBOcgOtjBtPl8aPy4UfJj0CGhsiNY4gh93JJmTUUQjJUDyiOM4gcW2mmMCVr/p9R0AiuO48RsZ9p+Wi+lfku/xK/I9Jks4SpvPj+OqOBZbfWQptbcAp2Lyo63ZqIH9lya74mw8yJHzx/tuBkFQtCw8m9pbAwnY8Fj71ywrEyuBYgpUd/hc4GPFxqqnjfHjriIBZc5nQGkGIM6E2hjF4k6WlWnotM8SuwWA8XrWedrG4TMaOf83Ms9+szJo/sBnwmfrJZ8RCxUWLMzL0xLoH0Xn6Tf7Wf1lPZkLitEWnuM7K4Pmj3EcgLgn84puMqpDE/kG13/t3p1UJ/1cSyLsiDDdV8MAuR/4DygTg4P0HsK9hHsKmIBig1tK2UF/ipXvNMVYY4rAoCyl7ABcx9rVUVTxO2rkgP2JsoNezf/YDN7jzWxDe5FjUK4roewAcFbw2fDd8OHgxx3NqQhLAeQGs46Z9/hS4hy1twMlMPb08mwz2LTAOoNAHDSEDJDb/2fdE39A7e1wgp2gAV2DbgIfb1ABoJLy5S/+6lc0yIBGeaCRyAapI6kOTSAO09/NfixRx8BgY/nOznjTgZJAkuEgcfQzVRtBAiJ284CpAI4EzAV+a/faE0cNhHbx2OltDKLj+nF/jiOXSvHjuE/1wQwL+J50sKzMzN1R3wtV/948BZl4bD0PzM/6zMqEBvLHcWmOxQbqILpwJS/5DgABimotAt8aXU2d5K2kP8q1Tu4gUXIgsNhwHEePSTkVkx/dzCnIYHfisUj1UoMZxM+12jLs+GdB6EuDYzR0iWECdq3wv4g2xzZxYvjzxmPbvmGUfI0P/AXOVgoyPIaNBuZlzSn7hcUtABRMMwL7z0zJV+ez7ACNLbTTfG6+YQZF+ZiXDTH/zUKgGMTnulTDNqSYi/mhKXRu2jL+urJF88cSE/NHZ+IUp+Tb7ntsCPxobXOK8ViD9QfsP6WUHdxKXqefaVt0jfGYaALr2+m/CQFUnvhcWoZh/6WTb42yA/gEP9dC1o8GGnX5zJWg5Nt7zV9JBGwLIOMU+6+e2VaMrDVYc7DJDfvc4Armj9Pb8t+RYJw6lPBHw4nNzuRtLNvc2sc2jCGy1iAox9qDNcjP9QTY9V4T8wfsDPMChhA/1wKM1/jQQfq5erLss+bSWSMwx7rzruMHJT9wqXr5hmH/WXZiOCKB0QbT8jcUDHZi6DA1WGRmxONwjCwrM8FXVkZQI5kdJHUms6K+gURzZJf4gAS0+EyJbN5Rd7W8NGjS/GRlkm2XuIPcWuBMQNMFZ9LcLb+I5hJvDDYA89F2Pc/KTPfZDCIc5FnTIgJmDGTJGE6efGcr8NcE3V3A1HBQl65jTA3hb3yNTTQbHTQ5yNzgczI34+ncxLP90tcCG8AobQ9tOAiZYGkEM4jfZpCDsZ30M11I5I8ujblB2UGP/GYolYtRlpkqsoiYO+qrr7GygwM+A8rY440s29yeh6jA3IxeF9KHk7npCxUv8E4BIGwMtvZ0TKiAaeYcLztY7zMrc2A5yzY/NNEWIvuPUwCcBgRz8rV73UGWbUa2CVkn8fgFsnhibg7Gdvkam2j+MDN/pHNJekyKzIwfFiAA8OL+GRc6UID9h42tuThfRnHPLA9/TT/Tk3SeJjMzYDoqjckHRrFsN6ttjkzSQe0pHhdlB/AJfsaGuj+abdbyUDI4KkUG8LP1hXPjpQLIv9XScLeRlx2c87HBhY+Gr8Zn6jbRFnZmE3RuEDClfTQcCiD/WXsKN+1YcwT1pey1kG0ez7PNXSbmDzE31aFJvhIqVelu+plQ4mJ+HI1gdIPbdUMFgErKk8UhlmV6aKnF6E/d4lmZldIGK45H5kfOFz0n+AxTPfelr7cqMt+WGkk7z44Tun3U7vWn7jhmmbZ+zbMy1XJZGdEdZ3WQ0FP3OFPDGfmxiSxT98p40ftM51mZJ5JZGQBTr5nMHWRrYbB9IlnHm0FuS4/t7H37z2POyrRLZmXMDrLHQo3UkTjOszI7pMcGfmm7zyOYQfxkZXCUbT6OK7Cd/WnfEB2ijKLFErCkSNC2lAReC31kZdhx3Eh+HFe4kOPYCvOD7Iz175wCQGSZabbZwp0a5VmZUT6yMuZsc8oCz7Qtdrfg+EpGd3KoITSBmB8vpezA3PxhZf4QPOBdCfk6xa0823zE8nnyZQfyG1xkMnHv4B7KWdg1utcWZmdl9GlsC6s1fVmY4e/mG1z4hJzkiYmRbb5T3AiBJjdzdlZGe9axzxM8Vfh5xAbXD9oBMuf4PNts4JlEdhZNYbJjW3WSMZ1cqC78PIL6cjVZg2SvJbLNiweKmxTrIgt8l7ksi16xJVJICx7w+wtVAKikdBnWOfCPxHFc1nIDAibhgTbOV1ZmAQn8YLC3U8UBQar3Ac/KLJa6Vne2j96AoB+zUiMha2FkzCSyMnAuohjfjhqp+irPyiyXy8qgBkt0x1kdVzTB8KSQlekPey/w2BG3zeDHI4+LM5oiKyNbK9Ncw7rjENRan4uQOf00JJ+VwYIxhR+PNNowf/jNytzh3XGLbBwk6mP8ZGXM2eYWm4ym32YQu2yzMTZkZYbzrEzUOzBiGc0JjvfOmR3+sjJ2x3FCezQOl7I+pCdShWOzCwC97p0NPCsjW3Zw7WhxtlmoyJghKyPDliHuHWSb7eBtRNmBbFbG3PxhfS6W6fKVlTFnmzWbe8fY4PbKLfB22WahiYYXvspcWLYZ986n+i9/9bYo4N86h21wn0oyC6G+zJptFlrLM2YzdskFbek+ce+EijKatI6Vb3CbJDe4+3m2GZl063P3eZkLmo9kxtYTzGc045Z7J0ts4htiG5ijbtn1j2eb79jwTA+k7vtqPjJnm5OW5jhz2UH/uf/2ybuOI5T8QKWiW1sNg91n4yCpEfIshkxWxlyMn7FJwdOsjKiViXrfUMfjB+jNd5qMwe55IysjUSuDFnwG/WLPZYnMhR+IjtiTHbw7rjjTCRVZGZlamVgth36ZYe9Qoz5rZQ6v4d1xl4sdJBaG/YMPpWtl7j9l0C9z9trXNIZycVqfiayMTK3MEt4dh52y3fMiK4MaLa9rgX+VHY/Yz4HfZhDgGsLecLRt97zIygTPeAdGfbwY36mmEZlZ2bIDlm2eYZttNsbOszIXHxbOuV0AqF2wzzYL9VN2YD6O62m1/45FVuaaBB3k6Sr37LnIyqyKzPO8lrX5w+41omYOi7PX9Y4lHrtmz1FvytAOvOtYE4M5o7Y5ZNMYgO+9fQ6HhJGoFc3XNu+2zfje52gHh9d6byKN2maabS62dZS5TOfNRzg+9bqeUdu8x95Pn+Ib3K0SaAdmqCFrtpmN7Q2FHsM8AYrM63o7L9tnmw17JN8r7O143HsT2WFT21w4tle+mo9Ettkpe46NLewteKVy1buOI5T8QIUYbBBG256xd94sKzOKZ2XcnYc47gEhvKPje3qMZWUa97leK0N2PLND4+nN15+1p5EzamU+1fRs2D0wEsX43cmLjq8BfAWlsDrsnpUZzAxSHDaQwQOXze41olZmDNlZenGYCmwsHAM7vWaTJERHNPRaX4TuuE9Zd5z1eSwMyV++pPM0ViveWVp18ZGYAf3i9Jrt0bV0nm4mr7teS3THYVFOOwQW+VqZzz0hYeZGztHPAT5Qp9fkm0HcF/hO4pBZtvmLomyzYbtNLCsDoG43SBgs3rXhWawY3yGYhIqyg6aH7osogj52HDfDMSCra2dZmak7Cjt4rQEgskmtU3m2uc4+42LOynhhUDZWP3c8jhNane6l8zQzfMo1oAT0C4CG3epnMTdzOQZll6XeiI0AACAASURBVAdElV3zh1UFJEydxzEfasom8PrZVof62cHsCwPtIJdw73y+mfyOfgbcO06vCV/nkDBL3E8lzCc1iVzANgBMxN5QnwDfEPPwlQbUkKm22ao4/pXBPEXGD3Wm1tpms2rZ1xR/cjTRuMcG98qhtAE15PQaQI9hntZ7NB+F4/a1zWbF2oN5wlqU8fBHuziw/SGHZAq0M3HStiyk6DvJ5Rjzh6W2ueC7jfTQeSIaeNdxhJIfqFR0B3YfTA+6doUi+wej7XDIxEHNBd92xyNC4RhlgFOrUnfpjbc+4l7E37MxySBhXDp4EbiK45FMzjmA6m1/mQdOdVngk53X2U7/kbPzhqIzE07yzH3n90z38mL8z0Ku9HZNkhAdt88waqSTm+0DUxEQLI9epU7yUtKZV7lj4CWj4dpEAjYXINkn6Xo6V8s9IDoOc2qkPSH3jG09mXMG1OtcpyiYGAA1krXJ6AqVbQY5Et9LP8PZxAnH1+CzdcxlWZnIHeesTDjDgNQfhafbZpuFPuBlBwcdMnFCY3VbDCw2t7Gh8xzzVf0sf19ZA8BoNWNiQBOV21wJDMpNHlmZAyv5cdxVl3uevM/U8HHORONcj3mngWWb5x1wB3k/mzhO5+po3H0Tadf8Ufy9vTIwT92YaFCDhfEvjjjPARQbW8xV4tlx17kCnA0+Q33amb4sl36rP5vAIWE6nI+oe5PX6Pgbo6tcu75PbGZoB7ddMtgM2H6qATXk9DqUGuDYFJvcvpDz2JAtp9lmj8zjKgsMmZ0CzBq+GZ+hr8M5GJNdi47dYdAvG8+52zjWIMpC5QIcniSBqwC273MBUk/l4qbGMOd5wOkM7A1JFVd7a9ija5cqdr3rOELJD1i8mCFQw8SAesc50ieJXde6mDckSLRmJe9guuXpIGs9OpCTrQwSBo4SDtPuNfld107Pse2Yz4BTn9yz/5y09uLWlwyIM9Doei0B1IusRtahjscoxt/rflRMF3ielXECTsVxnKBGam90x4V7QhZizNc0sjBbC9CFbr/EjkeO3HLPiBZCdNgvohkTNVJ72n0nraUf0/mqDc92DFI2cKBxL/5PmWaQ1OBzfZY2ljYYBHIR1+tFbrOsTMc85yClMbpaikoxlXijLx3NmkGAa2b73RqQDyNpI4jb9b57PMj5gfMBpTUgELy/4e/cj+vNGJRRh6wMxWIjY0dDCz6L2/UEldXK6DVH+567nwWwCATdrhXIhamtYc4wd3avcWv+KHpt4pwrUC+998KnGIZm2j3rCI5WWnZwcxL1FXavac20F0ENOenAYcbU0rfDftOEgK0mPI2OHxsPtwCwreGFQX3pVHZgANvfdb73hKK8xan5iI4tm6e1RPbc7Vq1nIjgS+LjrLXoQuGTBbC927WgW/lp1DGH0yhgmWJja4Z+cdJHZA3y2uBe45iGy12yzUKbYxtcT6NAawmgcYwfnc1u11I4gErKFhlqMOwuBXuG9TlWd3GMGmxjxv64tsDJ9D9mWZkqey7ZJuLIGPPHNE8HCRWLWsgmC1FYd+HNavKIA6fucTh2Adq/GLuXg8TzyGbAydxuKF5wkfED6DM9Hun1LkIXwKlrHJpB6u4OGc0fXswQQ0Nv9VmcXgj4gNbXoRhfHI8Eo941kRcTZ1yBUwXzxwKb5o/i7+0NzZ4x9oymoueDFqBxr+vlm0HsIToEFtumqDdTTcGi1ly8qCWzIQ40PlaKaxY4Zm7NIMl2DjX0eKPntcyLWnv/y4L5pkf/bd6bJbMKcHgniA4Di227dw0ugHo/4+wZvdnigEFms2RWzJUbBuU+l+YPqzKg3k8dgXpr0wOmzZL32AAI7cYMgnsEY7+YOOs9toCpzMWm+SiYruW0nSw48WJ+EWUHThvcaO06DmxvH6ibVTQfWeF6jO/hlvdmyTy2rzkzyE2H+mD4ZApsf9O71liwZ6BJzK4e/Wptrmiz5KRYgxZyZhCsTW5jr3bJNhvfS6aF16NPtT0hEKwmK6LuG0ioCgCVlC0yAWA488zURFF4Q4kan9kkoJDpvMLfh25OZscM4a6i57eQYJPRPnk7ISgYGowmCsviMZCq4p1Xcp3HmdRbfdk4xp8bsHRIUiYGDv2CIFbmevea2LHW1/uKg7LQZQ4wLNl5DOBUwdeqWY4ZcG0BMFzncjxpXiBupNrpvC2yOdY6w4vx10tC2aCQHQXtdnyt5uzlAwkHCc0faxVDEAGCQ+Z4RGhBM4il7ADOXdA+CeYPLw2eZsdagLawPgfmHMagI9d5LDAocbSVsQRlNNss7hOH5o+i7+YWO9baejFZNN+9W5O+GHREM8hkG4QAjFUcx3W1yMGe7I1X03nDT+tzaPqg5RJVcp3HghmE0kNaFtGkRPOHVXE6wMpciksABBSHW7mEWcF57pRFixvNHyMNYHsvNSBUbI5u4dfMvMZe3M+Pbw8aNZvWseWSCVrXjPrmwYwcxIsA7L7yqPieN5pYHIJNqwr+3Bk2ZS4D3a/ouJcT35xJycHFCHrI26nCUwlzEwsYZ2SudT15ldrbVrI2WZ97ln5Jx/2FzX1ip6xGeI5tjTDKWSbzJhYZXmMVACopW2QCQAqjEpnLcYweFDz3bfSydJef0ETLaZbZqC88lu3NBvjxzjhprC8Ko/IVK2yPWQrqUdxNx5x+KD22i/tYofHFfYXZg3TfQ5Njl8NIQzZDAEPXd+QzRhTMWoy5Vh7MeitvBjkaKVzExfEOxfpyqV80LxBpM4xKJlIwZoGM32QD/eKkOzlf6+VEYVduDT/eme6DYqygsN0E2s2K8RkyPmASZMcmyg6SHYW76kfpGt8UY8jEAA4GmZmMCccvOzio39c+oxnAZE6e/mz3IlZ28MCSwU713ONYX/Olx6ZFX+sj12j6qLUaLXIX852LvNGbR5ExjyRj1uSwB+mxLM9sWLu2H1xh9Yu7F3tnd4T25dI0A4hMIDKC4vGB8GsKmQT4F6+GKfPYBGXfI0uZyAWeKV8mcRwnNJ7ts20+EuDCdlAczmN7Y4Ao40jV/JygGMO9Ijs2o/locmHzUTTTWQRj4xUAorZZYITCZxS8z7OT3CfvkB7bo1bWfPTV7sKO8fgTe+BnN82ZNor3LBtFJ5/spmgOw9zNi5wreBw1snZjdlOsRViTMHe92cJSEuGTT0TkgbbzKAErCh6/zXF0v4mclRqbCgCVlC0yASAUgR87bsgzP3Rnk0ZHqQzOl3GzJ+PGbhOwA+JxQYzuBP3ipAaJumlBEg4SRd6DPsaGzJ+AGkhw3CoKxXFvDsf5euBrbAAYtXbMAe/P4GH1QWfXxnebyHAkTLVZB3kx/t3z7hkU6wJxkgMpm+m6qlyylq5j4zRqX5NFNG1a4BfzYvyrLgXedtoeP8JqN+O7jccA8GrmYZVV0UkbujXFqM3CZxNA4/dT/ijjAD2E+Rs4kF+QUB5BeVhdOjvtVOA2rp8WMYB6qb2RjQYNIvr8UVttOsf4qE/czRjzHTzBasl6N3lDbZi1imdlZvXnbQFjxFj94MoJXRW9RucPNYHisf3XWS3Zriv+qM/up+4ZQL1ibKj3m8xrTb06mK0q+KgBGC8e2x67R8d7MFHj61rJzhsseK/+1ngM9wTuDb90djSbxvmoo1X5wChPM5g/SvYKAKF3z7FGsYOr8hnIwcyQHrrO+doj3qUyQnMmPmp0oovHQZtIgawv+Lvnb/NSkTkme4MPRp0pfLL1VMZNkU2bZLPBXXSYleWgZtbP2AQkzCGTPwq7nMq4j+25aYMbNOYZ+IUY7x0bHF07VQGgkrJFNgDE0S2OgFnBMTuSEkTV++PyGTahorsR0DD4fzSX1qdro+jxCPDl/FyLdsx9zmqzkvxI6llsm2+kf6HAy6L8wCfYri49UGcCfvbHW4mOOdTJwOmA5gqPda9ixzqhi/4cJHQFx9ITQL0DXex4ZNlY72J86wIRMXXMBXhXmnCQN574c5DQDWQRZZAw39H/t/CAFdhYTtAvTpqnUvuU1mnBQc52qVt0t923euT+goLarKeZFoOJIeuT7zrV/YrV041l3duFxfhyx7XmsW2eVViblR6oN0G/+LO3ll7WvT1xc5h8b2/1X//v/6O3WO4NWc2ZIGFqePORKMbfMts/3/WTTJDO31TefGS+N3qC/uYAcyaaj56RucRjotZ0Ptl0+B1bvp7ua2YvNveG9JxmX+QxTyPd9LEbHPplQ+RbX9eChm/wDe6iGL83orY0gzIBIHwEfAXmEEereEwAjUdrVvseG7AnMX9g1KDX7yq8N0q1N8FMBY52jPWIBIahVQVT0GbOS/+sh90bn5N7I+2D9hMKJhqsTdOJP8JahccO8VpTr255O22LH+LlIgcK7g3U07shG5hVBYBKyhbZABAqshxoCkG3kijs7sv5IweHZmMDDMfou88oqfX5xCnqIPfFnPGn3DTAsxw96xOUSSKPX+ifVF0A9aLmJJl4TY/hWPBwp6SxHeBZjh2XU3lkfEC/eARsdiogYSbyoApF+Bjr5YPec2C3QAgS9QPxGr2tr3QHCW1MNxkdjsBsW88bCfwcj5gVnZkiy9GQ0eg4vyQOUqY5yKqi+Sh8ZyYNqrbyWtNrycsljU1kORDE5zuX5Y+SzWqtzTJYJbrkeUjNuuAQC+Jv1Q/qz2vfsmL8hfLHtWa9yo9UF/OgSjQSYMx+r4W/F81HqB0WwYMXnpyTXkte4rVZq2nwMIMHDzLF+MVje0ML8zGPKNQXwcPGmD1agZcmWs4Y7C0IVnFPYKyNmeLGJi81Q8Kgmac9fpgDP+8teJ1MAAi9dIAdqYKRhgH0T/KEfnFSMGgA71TwUaNjmWbHJfyRnX7Hg/h5xN7ge5fzmmwnoHE3Fewt0DAJ6NfzWtOTd0vzR3vJ2sTYW07T7vgxHPqlU7LW1KzWhjEBzWXOjnupCgCVlC1+AkBzbdZpHjg4QTvIqCC1DrecMI5HOiVQ0m3HhtqsT1ltVkfnZQ7tUFowCd2/jB2r3jzaWXR86FcBNIqOWnTWdu1OuSLjy+gifqx6vjujLx7FAF4jQe8jCLsFIn+Mv1/fdIEVdR+9XZqDxAIvGDWuxB8aAK9OUCKe9mGqc1rNjw/PJf0voGxsb2jwh7ns6L/qu9bUqvE6dozfOi2i14fE8aE8x7JZzRA+zVVdzN5uTJTmlbWqOMafszeid8+LFx0f+lFsMj7nx6o3a3KeUCJeamDqhS9R4Gp2fOjvuFYoq80aS+fyEtlQCl5Z2VpTq/aQgBLzWB9ZTxmNrMeHvuY0nTEA4+9FL9Mx4t4oZYMADRzhG9ytMRo0mI8PhcoGgIDwgc+A7wg03JLCynRTwXx0+ELK8MEZB2gjLzUf4x8/yTa3+yUb5ewUzC30lKqvkfpg1JpGS9h4QwVgPNaqIxFW+7dWkqLTTgW6xsP4Bd+1pmK+33X8oOQHLn4CQCgAoW9pI/Tx2k5qtE8kupWcVKCZn3symt5YGyPeNEpu2reLBVd1O05zcFf5WhurAkuPdmiO69T7L47Sk53flTU2AI6OWa7pDXCQlXIcxk4qcLNm7WK74xMOwM92DsNuvhHEV3bv10esCVInqUlAvzhpDW+smNx/mY5xtwfws5eCO/OSNoZmmkdr+woaCPyqgPHZ3TaBjvGMz1pTs9JGnlmsNqv6xlISpE7wZC9x06qLLLjaNecJK41otae4k9Es53CevUDjxfhynLJOKui6Fi9k9lblwlrjOQeDr1gjz6PzNGiYtcf/UbJZUS88OVipT+x9Rsd4wwFGREYzgzkSXI3Rd2kzOM3ghbJsF8DQQTKXS/rH84YVf7WEBWMLMkiY5lEBvapjHAkeijmrZQNA6IlNDBj63KpTUrimborSFlrHOZPZW4/PWlOrXorl9OHtmr5ggsZwTT1wBN30GQngMZefXqgpqdbUqlijJgdH66N7+qm9tXngmrppOPOUrlNLtBWutG9OqgJAJWWL3wAQWFmbta85hMg5XwZrpwOPluuz+yupg2zJ+D+CKBgbZdYI6k2je/TGPvlOOyfdOa+fOqAbm3eXnI0RCsDR7dOYg+xcVfquEUoLhp9F9HkkmERxdJ8LU4DVYdjNN60/uXCfOsgN58obGwWG1hYQ59inD+8O6n0lHI+YNZh+pC/TFlJ72xXz5mx1/d5yr/S2e5P0qYFKfRqF4ihvoRLNR0/m37OFEPGj6dRbffn4ILW3xqNzpaE4nPTsg6x+aiKzN+2cvxo2qwKCaMJ9thgvGx+iYy3nehTK50CzJ82g1BwQfzRpYBFdjCf1alJQHG7aEttDfNE6am/3fdaaWhXMR3fuM9+2OCSHa+qmPRtZ7XDtjqO2taZ+AkD4jAWVQX3JqB6997ulZQXh0LXH43rNSM04pi7nWinUAh5nm41NC51pBmV1aeA7vXIdCdhWBSlNZ1n2Qdaosf07ead5+WO7F16mj9B26COJvbkxl9ipCgCVlC1+A8AkRSpn2b+bscNl3wDntd2sOLp9FC2eLudamcGs/mT5DdbxeLqv7LHVnTjI4FUm9bjSw8loNvRarycOsolc79bV0o5Yzbp7Fzui/mZVSPrIy2mBGAiTHfyagF65OqBf7Ctv0YMuDbRQBzml/2bZC0tvNkkc5E7qJFtScviLbrqnbx4DrW6bXPa14omA3ji+nR2xNpdWY2fWy5uvsyOvhaVnY4RqzS+ordWN0PS2dn/duna6chnr/F1+oLQjUbPWdLOa2MqNPXpbsrwNB/TLviaWoQyWXo4i9GHqKfVtn2ub9Hg2VNa1YPsr+lhpy43WpWWPrb+jTm8aMaA3jerX0wPFgYyfABAlEYcW3GJZwK3tZY+t9TQ7or40gUEQlXMt+NqlX7AAcOmt8oOs3fcYrNWIY/V6rIwTBCiC01E93dTe9keulz22PTGGM7lUWy4FHm+d73cdPyj5gYvfAPBkop4BP2srXOnhZDROAjZRw/PkthwCvZt2JI7rD6q/ZrhZX4T1QRcOW08nFOnWg5cr9c1THlNHVHOjvEwF6N4wrqNfaPqMXXnIj1I0NPBaX0yCyflkcR9Vq1G4DlmHYTff2zjtW+WZh/qc8JmSa6igAN9F7V9ld7/+RXCi/iT9pKzvDUX4FBlfW6A/iSwsK6DszvYRWxuuTw9U6h3XK/VMUL7g2k4B+fLo0G4DgqicsWXCnXrPuc/0ZaM7yz72gnYtY7V/26ZrFLC3nGuJcoi5Y8ki+kyj3d2lXgvfkeg0r7x+S18dvV7W2B7zcogR3e36lOBoMsf9ZY0NuHGwt63arLJqiKF16Trq277pq9QHro3Qs/HSA0oEbIDgerzxDKOHs2Fg8RMApvtq9NbjU/SFwwdoLaATHaHU2IDFOoPhms6fq1GauHK+txrOyPT1TGIjXZreWoa9ZUgwCYYZam+NJ2n2uZyxCUamUb13aQ2xFfjej5pp386Ra4GW0M/fqwBQSdniJwBE/RUKVSnwc2Qt5zQsvU7mbOIEdZDbg4vzHJrZEovVcylav4POqrZ5wZJhVoSKBpXas7cNkGVZFPoiJ0QCNgrESwK2RZtY4TvoiEod2+ltrH5n+1bWDDK1L+LJeSochnW+Ab8hGlS+7GaLH1hCSh2b6PxdEXxK53ZpeCbtCC7lWqB0Qu3fGG2fflubzkG9S6+jQrcoxnSqjwFDh+994xtmxbCPTDvjyO6fSDYbIVsgclmlnb/VS+mYbux7SOcWvNSlBpSiQQWdo1M3hctqtMAYdsxjYNXbTjIIoiWBeMlje8iBeCdtDeljB1ijRXNGHjjbrNiozOFg1Wu0u3Rut9nUxsnqvXQXh+I4ot/loN4AiS7lWrD5JeGvWPavfbnREVzq2MD2AXt71LbQ8CXWOmLZABDlLOHb0+iYTm1oY5R+20qvjQMNJ7U3EgSOIHM7ao2mD0RKbAJJ5cGqd99MlN1oITrNZx8IGXXEYQkKSTtN5t4YnOYrtUN0bs8lTpY8ttPJBmpv30bOMF8SQkJFfl1QAaCSssVPAAhybRjsquh3xgKIjrRSoFaApfQVCdi+JE62K9OnRx8uY8Xvz0qrpQL9luj8jdczJPpn40K2HJpemo32c4iasXoundV3LWQL4I2TpR3d9m5jNFwAEK7l6PmAWgGEgt9rAbtrITr4PiUBLgneBFuDE2er1WFY51vQcAGqRtD6fUEWQD/A3kJbOe7fZz0hPZx9RRk23DhbvVRAIxxL1BlA5DWUI9r/2J5lWulY5oQmkEU9bdD6gXHD77UQ/AgaLpC6h6+zWkCwuwyWUCoAxgi2AfpCTyeHjI7g+hI6d5GNEcDBoBu8++y1AexdSmYXYxCdv7FUfgGsTfoPdtGcAgYGgTN5hi+AoCMsJaC8wSFDAP8SzWXp3DJcQHlWImMOSMA2NXzMAOLtTJwyIK9KsV3BMb2c3AOZVJLCXTFcQP8lFrnB5xTQXtCH9e9PG5BX5tfJBoCCYxrwVuHAK+pL4FP8AC0bY4u/MTBYwWq08zI7TcCpQinf240TDPdv16KYHs2+pr6kVKgVdPuO28hwJhs6XxinCftKwK2FHolkqL0tJRsgrFlYu7CGRUuAQQNEzWc8+4cNUBPZuGB+YXey11ABoJKyRTYAjJJdkzDYdk7DJXDaWmK7fN8AJ+OHqYPcE2O74my0jzil4bp27VM9l/BX9wHQYGD+ARw1yet2utcmSoZbyYNUH2fXAmfrcHLjjw7pEUkqLWNsAA3mhO6ChktwaB666d9xHF3PQKovcRYKgQs4ljhKL7gV6wLRynH/Plsfos4Si/BishhjjoGD5ndsyzhItcD9E7iAgE1IDPo7Qhe4fxNCh+hRCcYmqP2AR+nnWvjbNZGFBbh/AheQwvv4rD3V0k84y8wU2vlLj8B4RzAaQ/yN7U2eZaaLYc4JXEAwbvitPY3cHjTgaYbIuP7qV/9Hn8bhVu40+Aso8d6C9UPg/glcQGTe/AaU1x7njM5flEBgk4HNBua5Ju0v05YywYUI3D+BC7g2ssh3QAl4IUEdhr9FaQs6uwUuoJ9rwdYFrJXA/RP0l6Al9HtfAcyewdOwZo1s5A3FEaUNFyZ8PJkAMJdO042tGfdP4AIeW+8/0zZwKF3AaR6MvqanCThV8AvuDd8KHwtf281By8sBW97D4WnWnmafqzebosDewAUM+my46CfB6CgyDgSjHTwYxdpFTxTiR3yPDVzmZpzJWLbXSKiYwb3dVAWASsoW2QBwB8f9WxfLZ3MQeN3XRtOjkpgP/L5+EqQBUX0qCdj6TFhW8Ya97Kjk8UZfN9Oz2PaiQDTd98o4KgE6vey1srEAD0RHU2cpHj+5mR27ntrqzxEJMnczbVhngB27grO1PywfUPZwgGrQ1MVNmc11/Nh1jwfkinWBWMYD0RMmYNTWbNQ4KsEuVXZs9TwQnUAC0aQpEN0SXUmd5NnEcelrYZGbHzlfBIyKhVgclaDhR/Z6j9OPDdaPNIdqYYDLrPQg2SYPuYKArTY8u4g2DNkPWns6MaznkvLBR6qnigNUf0XZduh75PKAy/cvyy9UqHkF/yptSrk3ZMz3PY4LOHV7hNZEyV7v/iUGTYOxCBgZdNlO54DLVo5gN02m3+oTt7Dj6Nq2fPZQ4ALOCp/y1SUroGkWmVg/MLeCHQT1d7LXig0+N0pbGsnGw7jfOPC939rTM8TWMYYtpuwhpVvj7CAZTT6gBOqCKG0x+9jA8UxB4AWVCQDjjfuLfGycBJTwKX4Bl9P9r/WnNj5W0PvhdEH2WnROtzIfe3JL3scKujUEXl0+soBdwseuYQDV4nEReG2J+QP1Fz52l8nHYu1CFhBrWb+PhiGzjzWzzDTHNnCA7z1S11EBoJKyRSYAbMqE6E0Dgx2w7E7E7hRHYjJOEq/ZGF1GHeQxToMjlO1Ox/lykgJL6b72GQlIC4vdgUZvdZLuY3tDgoJFPPt3tOA57E6XjGawK92STjJW89ygRcKu3fwc8KjgJNdLOklkTLbzWixBUWc4IuIYR3FOym4XJ2leIB48ZUHBhE0hSsllft1mDp4KLlSZsWVNtVgXLJy/Pdl+w0mCTknmevlarKP0aK7AFqPr6HyDDUHmWpnBV7QOEfZWlbpb+Fy403TUL5eNRdDHWD9mFdQPwq47l7LGi8AJuR08ZWG49SXDYesvLE5vqWMcwSs/D3tS/AkF9ypl/ZjHgiIx30NDb/W5+6N0vlETJXMtvOeKCSwoaKkrzJDe5xzBU3xQ/GGTgff/9mjhvQjaq6/CJ+l8g+tZ5loICnA0iDE8szQI3CPzI2pPM5KlAqCyxPuvsTSkILuLLC+rPZU7NoSNw9Zh8z3ZgYLnku1XTLWnchs/bGrx/qC2LBgbmR/BDhKtZhlQrwCQbW5H6NrVURSixvzcdX70Ch8j26AmNrfAXzU/HknkKf5Q8iJzLcq+5HDKcpBnAReSYF826+x0yoLMnzjJqpfEsG0wnbJELKcsWMNgb5uiy6XXP+BL2p2yJHMRnlCppCVWXtdSAaCSssUrAISDnkl25zDYs8lieIrc4Iu8k0xVexrt/VQVvWHmhSbbsjAUOkn3hQ8O+lGYNQf0Jos7iAvqUySI60G9xY4Fp+qD2eLXCye5e5F3gT54MFunsPdGkbT1eUAlCCfZ3O19BHn3AsvGbJge0TPp4vc+wJ3kKpeCabFAIOCbxLMxdpy/2JWCB3W4tlvvyHoHzyIbAxYGu4AABOqM5m+b57VQaiBYGOxI0cF+cE8bSY/8kxK7bkExiFosuwxT7PEmOufxxr2e10Kt64PQeKMWq8h2ySKG+X46JkQbf7yuBx5sVotln2ESbDQX93kHpwAKxkYD7x9veFEw3/hZ3/GCzjdsTgboG+/pxMJAM7ScjeawBM0fGgIoXRh5f5QdWJ8XtafjQwelss47Qyn63uttbB1zvJzXnoKyy+tavdk0PRLE0WBPtjiDLmpPq0MTpY7m9nG6sMPEyRvtswAAIABJREFU5ou+NzRfcDYamawzGlCQ+QPnr3VzCxUcwS2TwtTXeQWA0UdrmK03Fx9ZovlCHPffu+C9SUg0vXDc3ELR5AZ7AyB5Mu3ux2FPqPmjddY2m6ckeX4KP+6/GvMeW02Le531xWQztbfp4RNFG8xie3Le3NLvYXCQrGVf0Dl/QNY2r7HBp4nNrV2dNWqK2QZzNvle3DcwKgBUUpZ8rv3ZH7z6qxeuAaDoVJodPu1IUo3AL18T5RxoxYgDFYXaOJazdQa5V/kC/S53Hk6A7+J9URvmFCyGr+XyBfo2gZNxo6cSRm2MEyp+2tShVnfXvZ5KwL6AwN2JheHs/axRoJ912XVr/Tz7iM/RYB8sAqx3PM+KOHGhigViBy/UXnbMuZuTgvXymig3cvJunn3EEU1zyn5sERI4oVga816fbnD93gR1ExqNnMbWFt9vyjo7j62LLKAgcEepQUe2237eE2FO2eUOC4OxiOxjc8y5REE0/HQuibuyb7Ds43BduzqS1r/a2lDXKwrRgcwIoFjcxoYst5WFwRoQbDqXpPOO7IjbBgY2hvfEe/c7lE+0p1/qI/m8W7NwBd8veZ8lR1g2ZttF5/IJlJaILJzb2Oo47AuOBfuy9os35hpzDrDvbpcuXgSLIhuzJ/7AZd7XSFFL1qfrqY3D1iMOjXGZUDuf91F6NuacgUKGsC6ygDcG2Hea0nn/ls07OHjdAkCj5vX6BEeQ8bZ6BveDLFzIZQODUgPRaKSdtS/FyJngfvZ9576Bqbsz5Im0INiPkIXTHOadfs7sW/2rXazm9bvH9psJzPtcDvdzNOGOLfqdqdHICWS8Nl1r1DrHcs6lKQj4JvOaV5xy2M/pK8opLoOwERqM6VjD33UcoeQHKpO1yuCs8Fh9IGefSenLpXkmaJf+1AWqwdwVicXZ6XUHYjvojbKDLKRuhp0eqM8fzSXsgWfj2X6aCYK6QTXQrsg5zFn1u2RSBOxLrM7dySPwo4wI40KO2FnJpy/1ZrKAoj7GjfKNOiveFXn4pn12Ad/tvm/jBnm729iuc2eFOryQjZPEwtAT/R/0/UavC+kDLvWHAPyeFj7u2hACJ7+AZ4L2hd2d/O3UTYaJFppENwJ2r3mY7uO8xAdcUfFRoF8Tmmp04dq/5pW+IvyNVP0h8CeNhhCHxVFsctAYkHbp+kMmpmUyz/w6UKaZM0GJ1rPu3xtZYDH366ZG9LRDbaFgJEEmKBvLB8TWgCCWfGPU4TkxcKTIa/BeeM87Dou70BO8K9Ip8wsVMByTt7l3vYdzg4wijsz/3VSX7WuwyfmCZ4IueWSCRB0ebCDrkEkRXcjo/nXjYEUd3gPOv6s54FqiExS2jfeErbuNLd50kPPvLnLcwHQmGJ3lo/AMMn7nTTWtwxvNMr8JEsDZBYC5VJIGfnRT3X3XdWzwMZj7fcucNwmi8cNrUw2KONQ5D19NNgk99t8vfCh8Kd7zyT33TfVGzZt/F8Em48GOuh5lo5ERWd+R2h69M2t/vT7ehYz3rPHoet8eXcsA5ska5/Sa3fH7Ul3vDGGDZX6TOft1FzWHM4lNYg1/13GEkh+oTA5U7BYk5RmLA4SBLosylPJdcW8KLhzNifqFoE12rznzjN4gM7XPpGrBYk928OOxBTQrWDi2N7QwG+/VIcHnmup8xUjKHY6CzbtjmVqw4xtZsfKexcX1MoABER2hwZPejQptfS9poTKOx3BMZ33+EQdFXUUW96QHwj7mbC0vVl5mg9WWJjv3Gbtj0rVg4NGEk4Q+zRQH4gIUFTiEKY8jcYxF4PDtjK4vGhsQ+ieFDkvXgkUybdxJjrLdAFxMnKXv9W14VpFtF4/tjQFDFHtSfEzNjn4nSNeCCRw+2JzdBgD1pdS2q+Z61oLBvnYuYMdj53YVbwBw1Cw6QlFzan7OLiP0kB+PofM7YIPVhvfAe+E9vWrBkBH5mh+PHbLZAKALFB2hsjiECPxY5/dBGhBan9/MA4BviW171YJhzkXt56VEcZCNAABHvyhzQI2z19hE7SfgWKxYbRQrkdi0wCH0Kg9BeYnA4Ut2FHOMRzMdFNEAm9tYpstzbNrFnNH5/au//HXBfGMs6DymHci1GzzHBh8DXwMbeHSzeA4oxNZwjTbYyVC+neS1n+j8tp5ywL52L2a2fVyCPzjsccrxiENswebQaOd1vYOJGmpvaDiz2hNsex7f3G6V6EDGmiZOOZ7a0PSBVlDU0Xdnva/XGt9L7a0hurJozmDbYnOLNfxdxxFKfqAyrGHY314Z/5oa0vH4wQIju8DrJCaSRTkuSZ8jnCS6NFOmIA8Zn4WhqfR9rievSl2LOkl+FCzgWISKOgmGCSc3NmCi0ZqVz8OUls1wQiTgA/6aH0w4OEngosFx3TxVGOSJ7jwEgbKYcOcesKPgyVvDNEsjHo+ScS7nu+PGajkIj6gpS3LRkiUR3XkLDsoXUyP7BztANtCcJQEswmjujJ84HP1aFcdiAh7D2pAhuvOw6ZDtuETwz+pl5tB6UPE4Gk+mkcAQhfjtmeI6QjvNJWP5EoC+RwXPNUc38KPfDVLXot/P7hRryJhfWAJQcAQYlWOtCPa+MkoA0Bxi3CNoPOFHgL023elOR4JbL7Cj4G8tJQDPHrPGE7wX3lNqDjKvjKPgp6ajYCz28w6wzQbgOGS/t7XRG0VoA9Aq3niCI8CAyxGgWdvI3MMGYAs9JoYQ1H3N4nXNhxKPpK6F76khutwW9gq2LI4AnY5+rYpyA3bKMaYA9grZbVHX3GUTuNqOjXzXsDNa/3nyecF8JzuuGhiTwDSVuV7jA3bKAd8TNflKZJfBsOSHXxpd5wj+YAfH7xRm/uE7Bcak1+ZWqMB+hI8LmxoyQrHXtOYP73PlkWSj0+ArA/vRWt8u4GfQ8Z6U9EdY22AHC8m6ZD7lQOOk6DKXBdnHJqM6NInDXhWumcd548my8Gwda/i7jiOU/IAl88ukPkMbXVCX9zgzQLM+2B3XpuWpleAkn8a28PqsRTS7geOX9ZGl9Pr46QfqAaCpWCixYIr6LIbBNpzukO0I0d3G1r06YXQFw2niKE50/WKX7AfqoaP5BQVPXUS06ylb+KL3h9jumDyWfCoPp4BgDN2RAjoB40AtjOj6PbrOH5yCuU5KAKjebWRdvziS6faBz4X6PwHJsiPOAmQ4xG945meHB/SMVQUkCzLBgRzLKt5OddDrj7HpMnf/3l7pj3m9TDvH4kJjkWgC8IvPJSBZANeRS7HPJRgY2NGv/GfNkflDRoZmgvkmAcfLxqam1R/tUxWHZEGdVIIf8+KImR79TmZNANa/cQoAcRQr6LEu1bDFEtcU9a33HY6unfQkbwJCnVScL8qn7rFNzfSdET3lg5IRmb/x/ChYLJYoZ5jANxt+oGfoOIgNsCagr42mswNxlvmZEz6tZ3yw1KRyUQ7JUqkPpNipSCAXprbsVtfspLH6XflMMG86E12/zH/K+0rAsFDYKw4BhMcooL3Ff8rqkXUJoysYvgg+SXT9ou7Qrb7Vqk97XlJIFpxy3H/KxtZJ/CP8J7SzWR6Hk55McbxRlJ+g9AD+U0BarT6V8OXH0Qks1jqBRQn/iQ0NapvbfNDQYW0Ta90G8hNrX5bWmTL/ifpmP2MLpRtMax2bP+E/sWb35QKqCURJeUJxwjh0wuzQeL0p02vsVgCO6sdpUKdj2sGiePlwfI/trkhWRVcwaOJiyVYK9+LU9es5tmh+BxskO1jU+zEMthlkcZbHlRMquoJRMxWuf64/Hc0ccOiKf5o3dGaO56j1V2uz+pG1zAFv/Ep+d2zW/XwHO4sEarUdz2ngh2s/bH/ri/sZilpQBGewiZvJTn0ld8C4dtwDfNpOD8Z2UptYFZlPnG4PrcPBtW+RQNDvtVALykDAh5Ng7QGFYxALfton8Ts9LuO1oHRjkKzldaYoa/BPQZdofmFsCCJVWYPuDQwMsjAgxtjIgrtnSdxgSQhXDdHrCgYGu79xawoAFh/sAQvzfbI5EGw3ezyaV2zvK9Nx2WLy807TEK37gsp0uFu1Kt1N7QEL84PUgFFnivIGvwDPsAGxIdgcXaHfITaGmmYc/8p0uFt1IHWP2kMVsYt+shmFDePaB0sAwx/MDOrhu7PZBvTRGnLtKgPSyqn2y01FLShqj+P1GXLtObzrVw4yqcB2yYYAvgc2gWDQoHsbHzIA7f0osnKs9ljTm4jtiTpTu65fL0UtqMCiRFmAOEHBpiYqCZlkVtEVDHiYhnTcYLux6/r1UtSCitOuI/G9RjMdTlASHqUodtqdvGScqvWkW8gaPY5eG2u26gJWUrYInLC9sS36ZOLUxmhbqcFujt0pme8zlu2mDnIvMVSR7ekpkaSd1bCs0ge+q9Sr+0ZxoMy9pfOkPuGL8vCg3rN1tR66Pl7PxrWSroUaFiycy9EVPFLzbDTxUoHN9+U0zcCAQwdwKddKC/iCRrLIb2DB35FbGWmyeKveTLXrlcFdemXfQ+MIRvYozqrIxKA+a6I2jizyO0pmHhHal7yu3yV2sYYEgbC3BaEv9VCuNP7QXDpDs3Q9d8giHxheNt+1wOZrHjGg9+1dQGu/RHbRr+I4DlAdG1ESMFzzPIrzggWhC+dKTZ85UTOYR8xHfn4UWTrUglZWk8BvDbO3C9Vl8F2jQSO4Wx/e22QcxXkx3TiOjdgCAKInaJNJ8LeT2tuVpD92D7OiQeMWsYsl2ggDc9AO0krK3pIxejzb8YAs6sFKnl30T08o5jtxlsGzPP2sWx84MYXBaeX8Bx7UdvteUx+0i1yvqZJnFx+U9jmhaNAYvlzTv57A7A2+UxZz0Ko9mVf6OGSFbxNbW+1cQy2jWEt2gugguE8f1dPGuH7L4LvGWod6wPHadGpr2OAC/LnUsQED8gaSKNqn1N72xrYaOJ/vOn5Q8gMXsUBEcllisBt4F+Ymsrj73x2b9U78gP4lDwBvxbwx1tw0k4rptV2sweRx5xg9m/JPC2TWwLGnbFEeHtC18/6zTmYN977Sq/nRy52xIT0hgbHmpnt2s8zfPLLAX7xaGvew0K7oS33kNrYYTzjOGDpKDQChK7QO6hwru/v1i3F/1F1Wbc0E9FF8szE1tElP50pz3kIPRpbwo5FK/WnKH8q/VePxFv1+Pwv+mttJwJbzz0MqlB6dbbnH7G1Urx57XNpmQ2h/zXP9CV+Mb8+MuGbrvAJA/O3q+SwTM/dTsoA2lb64Q+91DOqVPNP8zbVoyQsoNENs9cv+Tmpvw3u69cYy7/mbyUZia2yzsTxyoKxrpYitruLYb1+TILBfolHDTQPhq0bw19G9uuTrYJ5/9cv/qXcsrOKsNE/1dKC0jZDQtpMZvZHb2+MN5V0rHnmtL/qC1TTPG6fpgYHS7yvooUespplCDFWVZx9a9pU+ppfZ2+ieLrL+lRY0C90bYzzm0APx0rjQhYayEX0+D/4WaJ/pcY5CoAJAJWULFghtMGfgIo3StulfEGNbHJ6uB3P+dy1w+jeS1yj+Ggx2l1ZZEn+rUNTd1EXmsg683lH6wLVKemxSShYFY6NHyldH6t0bNvEg0D9/q9A02SELPCwEgYtRMzM3atRo+R3bnXNZWhMDBzn+G3Y8d6/ERbk39IpCIdCuuL3ESXZo+pJATP/LX//adwCIGpuzvM5reHdQrxw4S4/Q/NSHmhVo/AJcfKy2FlAGtHvSCa7D63u7mrxIbW0aWYzP0CO0MbRLuFR7Q3MRrcNq/VQPcmggP/VY5rElnp3Ug5fJwr70FDtCGxfSUx2lLS5pstkA1Ryuc2kks5Pze1KOgZZbAIi/wd/iGgtHExtZrFGImF6ttEW5Y+ClAWw+8iyxty5NPxrJlBQEwt428Y7fUT19emXgMC3W91MfalZ0+Y7mJQzjNHZkezV5qaSxgV0EtsqCv0/1qxy01w6oWUZR58VKGCr1Z3XDOUj0xZLsbSj3XE89Xq4HL47UW6c/onYCCKy0ZEOPVVFLKMoMDlayej34qFK+N/jEbd9EjeBv5Ldkk7A/WkDT5keB8TecB3+VNxgLEo5sSxkbstczeU3zqB6cdOzXv4mcLdneBK80BTfXZtC18EbSGdfUTbEGYy2mZVS4Dse9hb2pAFBJkXzyySeTPvjgg38n+/qB/5kxmBewKLdlw/q6yGKDO9XM1eulqLcB2wP+Ft13lxLn9P5kFYc0qKRHJ34cWyjdZMBvwMnGk916pGqewZ1qpTNyU3Bxxh5vYJ13V4ZTJ0tBok1HaX5uUNAvCeaFtplRPdz2Ut80M2pwp7oBqRY5x+gb/eBKVt+1kIzn3sWcfr46a9RoAVXfz9juNAxRmA8Bv9ARfcmO5wAPE07qWk5+bHCOougahdHAGjyWqKP2AoxIFOr7GRvwJCdyuBc42c7MgD6XZ1NQvyfbRQkFHILAloS9PUo90tviB3gd1RjK4uDH2aKpqJrbW31kqZ6OdNMSAdYktJoeD0vbW/a5wTKCQvz0QLPeuyVpsCegYcjP2ADxguARf49mps6mFxSwFzZzmPzfrk7UKQDEa/E3AvS3vfkFLZ6HvYzbGKJwGn7GVtU8ZAR/Wy4k9cfJ57SAHjazgQRysl2U9L7KvTFqTAH50Zp+ri+OXOLwMIek6buE3k51GvWre+PVxEZqqK2wur2dnhBBZoVtihpT2GxvttfYnKJjE/At0vZBvhOgJlSRIFL4xlT3HdYhzpvS/Gxyc8m4HnmwhPnG29OIvcUMOCrABEXuyNsbxkZr/njwhzIG+CT4JtjMwVUJ6rNkrwdfKLit4SM7ul7qM3dHDWaa6qf+xiZq/oZzsOczZHM6nNsbOHsTPkoFgPU3g/tGNLa1ZlLG5hTNSGiIlJ4DMrbj3DeifhXNbVgDhb3tJ2ujn7pkrL2C23pdZIkeyvRQCkrD3rJtKgBUYsiPPvroo6kkAHz28ccf/weZPxgW2D5aFOCvjl43ilRTg89pwbToNrqcPO+ZnQHvpcAmQqGqmfEhmH5EawJFd1siG/C4kV5SCATWAQUE/s0GGCo6KUGdRRfWa2MozIEVJ9Cq6CYW3Zfo8DR3xIWvDxpBINgb3ICb6djSb/WBAwwIlcJvkEU9x9HrY+E3+uZZzNGBXL2aONGcBxQMuolF9+XKiWG9tT7vIISjg644EffcLaPbcvullPE3+F10YAZEjRZxdKidAZyCE7K9UCzkn/OCaNT81XO4FzhhUdwsIDv6PXbLgJA5EH9IHaNg+hD21kvsQdApAUqjOnXfs1u8KdNs4LzN0sYa9oaxiSBQsDekPHAnM4NZzi4ywmD6EPaWRRB4cxJvRJqsp/seem5iAGQevj3dwJYU9gZYIMEUQm2H/O5VUJ8lNtW3M2XYaO+mJLVBPAfGDtRoCSiNBhJUmoNxawBIoUzIawSEEf5WMMsAI1IwhWBh3XklRekK3camxV5Tdg/jGI7Ym8B6QyelwGxD/Z4XkC4Wz7uJIQPCCIX4LbwDE7YjmEJgP2DtiLmAI1N7z2UNVhnB9CG+GzB2wGZE/V5Txr1DFrb4gNikgDACjWUv92FoehNMIbAfcFRnPeoBwfkqoIVEs5wYW0Z7ZsBShW5M1NMB90Y8NBMB3Dl0nXGox+7N0AdTzN7hl3q3pQx769ueMnyVo+32vda7VsSNv9HO52tM4Zvgo0Q3eodH9y58H3wgfCH+Br4RPlL4qs0X8rZz4Hqa2qDb9Xq0VwarzHALjSV81QSTvXl178L3IWM4mgeOaDQSDW2wt/Wxm9Ru0B18MvHEkzKuK5swWGWwpgL3TzwH3zRLG2cAk1s5oovH9oquudP5se/m6Eq6JuftbZ3RiHQ3MGz09x1YKPkBCQn+jsoGgJXBXVEY7MnkkyJcOOyMj8b3GbuXuWTHcY44qpZMGy14TpPnAX5ZnXpgoKALbKIBG45WZFcEewMCu8boagqqiyO3HG2XH6LHdtgJC/wjdGDi6NiaYRrMDunxht08m8cW5kTLGYqxhswLip6BrZXqvW+AoArOVRRdW8cWf/zcYG/AQtu9JkGPP8CvisUWxOsJslAGjmQMAnaA/NodHSO7cmorA4qmC/OUMMW7AlQMmByyxMkBY6321qDR1QnduzRuW4APXsuJHN8K2cANZ5N6VdMQxb2CwwSkR0PnC/3gjbTRRYzsH7KARZ+TLGQ7E1lex8cAnLF7biXOEvWBcIoorkZwuIh3XkJXk121XQH+A+LkBGQHFubNZMGF4wOfK+A1ornnekNGo5kX0VkO54hdstXe0CFutiMszDimA5UX7A1Hb1h076Ru6WvJJkK8Dg7VLksN5o77nL0BR2wtsZ2UvxdQLqBbApsHbLKV2Dg67MTrgDFptTdkYqIPVxh2FL73tZ5sv6RnYwPUFmFvoPVKdl7Pb04ovMf8Aow34164MWh0jOMnaLzQyZsh848gET8BJo3AT4A8o7MTWJbWsUVIACl4VKE4ZgOX60D3K8oZ/cu//LUeIJsaPCaO4EQnccQSfOLagIURHeOwo52XU3pd+3Nqbwju8LO29bm+gwR7AuQZnZ12nNIDZNMxlx+tQcEffIUsuqAPRJMSbA4wReeIDc4xvQ4Z57DF3jA2MHeM4htW2BMA6pERDOeGKNwG7A5sMsCUFK9DZ6cdswhsRmxYobAp2BZsDLYGm4PtwQbFRkOwGFnRDLAhgN8Sm1zwRbfFDxJ/1qJnSCCao/aWohthFPSLznJkmzUb6BhkmqOP1ubtqHopDfKy8SDd7MLmsKmlpxgcUJqxGG3Rf/XL/16U8UX2T9gRungHDqapPwN0EPwb7C1aNaT3bEgaWT+UGliBxaHwUfBVwo7gw+DL4NPg2+Dj4Ovg8+D7xOvgE61ZaswpMnjCjiZsCtFGNfgz8JXDvwWjr2kZDDLU4sgXeKmP24rHhk3uPJPfWk7s6DbxZbBDam9EQVcJBhux0YCCWzppY2/nk03GhhWnFvBbKCdAgAj/hiNiULqtjF6jneWCVcYuS401EWujsCP4OqydWEOxlsLesLZijZ3LGWWw9h4jG9NikoY3elfiDLWhu8HK6PcdUyj5AYmfAPAXAzv/hfa/cvqLFyxbYKdt2XZ9TWShYbhOClqaM4ljenroueO1BslzAO8VUC5uWh9ZQlPcTteCYrcMSA3hAJ0Uu+NEy0l9iDhix7GRIG9gf1p/OiZk7H6dtHNxTE+1v3Qd29NHzwsWXCcF2OqtM1mjq8tOo8k3+t5rZMFdpxk7ZiddehSZQvvPiXmGVKeGChZcJ0UG50ocnZzOYwsPDlKKI7Hguuny6FW9J5d0vBbe51G6pmDBdVJwSt9KXSc29cbxeunBOAnw9hgLrps2EYecyoVcxkYWpL5qPXxnure93ZhEj/OGXMaWJZsLgDeLzJ6bYmHOBF47j43YzuPbg0Ym2U3xGrx2yMXeBiKv9Q3nkp62BpiXrReTdJF2vuff0rKBiaYF10mnkQ0JsoCDLvYGSKLV0e88bQ0LNzo7Ud/sPLY31IYEP7mbglHmEYUCch5bMhckG9uVnraGjUYb2XhkBt3vhRTZUAgKNzeNkA1JZuCxcX/b+fNM3yu9a2nc09awse3fm9JzUWfbha+CzxIg9W4KH/i01nlNgLYPvNQXH4l52tsYsiEBmH0i7XJfke/tGAnwxvFsoJsiWMSphtvYmkngBuo2L3vDRgOg4ukh5zUGayPWyJk8++ymWHPbsh2uY4vnOvVbA7/4F993TKHkByR+AkA/Mln7xT+bHKjYMjlY+XhKsOIF0SHye5QY64UvghWTJ7UM+/uy1/pu4E9/9y75m7taxfl7wcrwPXI94hhz5P8N5PH1t4K/+Nd+xqZdrvw3wcsVW7UrFQ3BK5XPye9DwcuV4eCVijOBSxUTO0/8578re62an7f/g+ZhgWlNFcGLTZVarLky+Ly5IjhEtLaxIri+uTLwT30M7be+Gab9x3kVwa3zK7QWooMLKoIv51dqwQWVwdPzhwXHzhrWII3kPmyB9vsVK4IzKlZqV4nGK1cGn1esCg5VrNIeVqwMrhu2TPsnfsY2rDv4x5XdwW0V3cEOopmKLu1NZZfWU9kVPF3RGRzxs9va35K92J8O7PxxRXDHjIrgzpvEIcbIz5eV2s5cZXDXg8rgzlW/6Nv+sfTnvDDst78YGPZfJmuVOydrFV2TgxWZKcHKt0Q7ye9nvgj++Z8N6x32I9nr3egd9od3tcqZxLaqYG9k1/yW/J68p1VUE/32tvbzD2Wv1bL/n/9O4OKf/4zY2D5ib11kAc5plyveEFtrD1ypOKldqviT3gvyY2v8ef9PGocFZjdVaNXE1sLE7v6iqTIYJf9/2FihzWseNvBT2WsNG9b7owUVgf9K7O0IsbP2+RXBF1D8zh4L/Fe8Rvp6Kwd+SuxsHuyrclUwSmzsL8jPMHmsetiqwOyfL+v/ifS1LvT+qKJT+5OKrsBJYmvt3NZy5GdXRVdw3593BX72z1tafkf2ej/XdnxYoe38lmg1sbUksbG3xNbC5PcqYn8zh/Vu/0PpsRFbgk3BtmBjsDXYHLU9YoOwxb+x7G/8Tdnr3ej7xcfExlYRfUD9WrDiJbG/GPl5806wYgbxfz+WvZa242d/K3ipYgTxZ6eJn+uhtna5IkO0g/i6bcErw/6YvOy3ZK/XNEz7J8SXrYN9Ub9G/ZsWJ/+/SvzbjJo/Cfye7LXgu+DDqC+DT4NvIz4Ovg4+D77Pz9gqVwT+KfFv64md1cKvwb9VrtRi5P8Xh60ITPv5svZ/IHutYTW9f4/Y2kRiW2eIPwuTn0PE1z0n9tZAft9a2an9G9lrQX4R3PaviW2tJ/bWAL9Gfn9B7U3bdZ78PvlPB9b/ruy1sFZizcTaSddQspZiTcXaStdYstb6GZuS90Q++eSTf0+Cu0aiDSbF/y+L13xfAaASJUqUKFGiRImS/09FBYBKlChRokSJEiXvkXz00UdTSPC+Ika4AAADeElEQVTXQ/QY+f2P3vV4lChRokSJEiVKlChRokSJEiVKlChRokSJEiVKlChRokSJEiVKlChRokSJEiVKlChRokSJEiVKlChRokSJEiVKlChRokSJEiVKlChRokSJp3zyySeTPvjgg39nfuyjjz6a9/HHH/8Z0ZXk9z94V2NT8v0JmXcwmvz27//+7/+9Dz/88KN3PR4lv1lR9/D7Jep+fn/Eumare11JKfIjYixTiTE9MwNHk8f+LXnsIH4nP/+hmWVEyV8fIfPaTub3BdGrP/7xj6Xpn5T8/y/qHn7/RN3P74UUrdnqXldSlliZQ4gRLSRG9bnp+eS7GZmS71PIPI9512NQ8v2IuoffP1H38/sj5jVb3etKyhJrAEh+30F0hOn/CRwrvJvRKfm+hDiOdR9++OHPyM8FP/nJT/7xux6Pkt+cqHv4/RN1P78/Yl6z1b2upCyxyQDuJjuKCtP/Mz/+8Y//zrsZnZLvUX4L//ze7/3e75L5b3zXg1HymxN1D7+Xou7n90QsGUB1ryuxF2IM/x7OgGiDSRvNdQIOR8DjTf9P/78et5LyxWHuoZc//PDDn5Pnt/CX/k3y2P94p4NV8hsVdQ+/X8Lv5838v+p+/msuNkfA6l5XUprYBID/CrsK/P7BBx+Qpz6+/u5Gp+T7ELJg/Ccyt/8Sv//0pz/9R2SOq971mJT85kTdw++XqPv5/RJLAKjudSWlCdk5TCEG00P0GPn9j0yPryFGNZzXlShIgb+GgsJh7BzJ3K9QXYN//UTdw++XqPv5/RC7NVvd60qUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUKFGiRIkSJUqUWOX/Akc97iTdsv9fAAAAAElFTkSuQmCC\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# And we can plot multiples graphs on the same figure\n",
"with replot.Figure() as figure:\n",
" figure.plot(range(5))\n",
" for i in range(8):\n",
" figure.plot(lambda x: np.sin(x + np.pi * i / 4), (-10, 10))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Advanced plotting\n",
"\n",
"We can do more elaborated stuff easily with `replot`."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot with a label on the axis, and a title for the figure\n",
"# Note how the legend will be automatically added when a \"label\" is found!\n",
"with replot.Figure() as figure:\n",
" x = range(10)\n",
" figure.plot(x, x, label=\"x\")\n",
" figure.xlabel = \"some x label\"\n",
" figure.ylabel = \"some y label\"\n",
" figure.title = \"A title for the figure\""
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# We can also pass these options directly to the constructor\n",
"# Here, we force the legend to be at the best location\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\") as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")\n",
" \n",
"# But we could also not constraint it (best location will be choosen)\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\") as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")\n",
" \n",
"# Or just say we want a legend (same as not constraining it)\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=True) as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")\n",
"\n",
"# Or force it to be in the lower right corner\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"lower right\") as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")\n",
" \n",
"# Or explicitly disable the legend, even if labels are found\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=False) as figure:\n",
" figure.plot(np.sin, (-10, 10), label=\"sin\")"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Passing extra arguments to matplotlib plot command is as easy as\n",
"# passing them to replot plot command.\n",
"with replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=True) as figure:\n",
" figure.plot(np.sin, (-10, 10), linewidth=20)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nOx9B5hVRdatzozO6DiOAWYUEAlNUElKEBREFBARFUERUBSQICaCIqLkhiY3dJNzTk1uMk1ooMmZJkMHsgHU+eN7//tn7ru7zi1om759wwmr6py9vm9JI7fv2VWratc+51TtfccdDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8FgMBgMBoPBYDAYDAaDwWAwGAwGg8HwJEqXLt2hRIkSNfP7TExMTI9SpUo18TPW/3MRp2xjMBgMBoPBYFiLu/3B3Kf+AHC/P7B7IdiH/J+p4f/MFPrZ/2dh/2eXOmcig8FgMBgMBsNy+AO6GfkFgP6g71t/ENgux+cvOWMZg8FgMBgMBsMWhAoA/f+W6GeLHH+/WLBgwfucsY6hLQp999gdhfvO8POgn5fuKNxnyR2Fe9dAm8VwKQp9V/OOQn0m31Gk75U7ivQ57ufUOwr1fhptFsOlKNzrJb9f2+z3ayf9f57y/znijsI9H0abxWBEhDCeAI6LiYlpluPvVwsVKnRvqO/917/+5WN4E1MXHPT9pewgn38xvo0ffbXC989//hNtIsMlID8zMGFbnmPt7hIDfBPn7PexL2JYhf/4z//ra9phYZ7j7f4n4nxJq46jTbQEVsUXDMUR5ivgtjn+fiWc76VBdP36v/l++onpdpLOUu+EqbtuOsSWny72pe3J8h07ccXXZ/gm31/9DpL+f4tPk3w//PAPuN1M83oj7fjxx3/42nRdJsbUXcX6+74dkuI7ePSSGHOf91p9cxx+2X8dvM90pip6o3nt2q+++i1niTH1ULnBvqHjtvuOpF/2pe7M8DVuO1/8/z/4x+HCFUfhtprV24rYgqEBcgeA/mCvZM5/9wd81egpIP1cokQJ/0dLJYfzveQwaDD9+CPT7SSdCas2nhQLMTnCCbP23va5TdvO3QwCaVFG2800pzd6fo+YkCbGEj1tXrr6+G3/Pm/pEd8fSwwQn5m/7Ai833SlKnqj2eqLpWIsPfrMcN+ho5dv+/dewzaJf78nJta3YetZuL1m9LY2ymAoCX+w18kf0B33c6b/5xf9/+tO/8/n/T/fn+tzcf4gsLmfQ0qWLBkTznezw/AOSeeff/kvX8EKQ4UD7DFoQ9DPrt9yxve7ov18fyoZ6zt87HYnylSfKgQEew5c8N3rX2hpvC1cfjTo52SQ+OBTg/NctJl66I3mklXpN2826IlfXp+htxqdeiaLz5Wtnei7cuUXuN3R6m1HvMHwELzuMLxE0rlL33XC8dVvMUs4wvw+L++k3+2UBLedGZ3eyPn9/ff/8FVpOFGMobbdluf7WRqLTdsbe7YatpoD7zsdidYbTRpDlV81xtuQsdvz/ezVq7/6yr08Vny2z/DNcNuj1RsdPzA0h5cdhte4a1+W2PtCr3/3HrwY8vPpJ6/57i010HfnY319W9LOw+1nRkZ0QDBt/gGxwBavMcqXfeFGyM+fy/jR98CTg8XvrN10Gt5/uhGtN5pzlxwWY+exqiN9l8N4qkdjjD5PT6h1fOrMASDDNLzsMLzGei2MjdGffbcq7N/pHrte/E7tt6fD7WdGRmRAQBvxy7yQKMbOpDn7wv49ehpDv1PjjSkhn1Az1dEbTXraLJ/oJUzZFfbvtfp8ifgdOqSEbkM0eqPjB4bm8KrD8BrpxCU5uofLD/FlZv0U9u9lZl/3/a3SMGMP14pj8HYwwycyIKCgj8YMBYEUDIb7excu3vAVqjxc/O6CfPYMMtXSG82p8/aLMVPy+dHi9W64v3fgyCXxhuO+MoP8fvE6vB2R6o2OHxiaw6sOw2v8+Btj0/NXsRsi1nvkRGOD/hMvjoloMWdiiQoI6Mld6VoJYszQwhzp7w8fv+PmPlV0H+pErwaA5JNK1UyI+GmzZP3Am5Fh/nGHbkukeqPjB4bm8KLD8BovXf5Z5MMiJ3f6/E8R60131PJ13viZt6eNYapJVECwOuWUGCslnhstXs1F+vv0JIb2Zf3+8X5iHyq6H3WhVwPAMdN337xBjWa8Ueoh+v0n64zVatsBB4AM0/Ciw/AaJwdex9G+qmj1lt/xQtNp8PYwwyMqIPiwi5H0+Zu4jVF/R7OPF4nv6DtCzxOaXtIbSQr4ilUfJcbKrKRDUX0HPUEs+my8+I5VG0/B2xSJ3uj4gaE5vOYwvMhaTaYFnt7tiXqBoL1Zfy49UOQG5KcyehARENDTZnmSl/ZXRfs9y9eeuLmHUKenMl7TG035tJm2HJgZJ70DyaEpFRG6TZHojY4fGJrDaw7Da6R0L+TYqLLHxUs3TC0Q73Q0nsoMSkiFt4sZmoiAYMbCg2KMVH99sqnvoSc78qkMJSVH96UO9GIA2KH7SjFGvh4YPKl9ODx55nvf3cUHCJ44/T28XeHqjY4fGJrDaw7Da+zce41wkO2+WmF6gaBKDvRdlGwV3S5maCICAkriTGOEDg6Z/S6ZgoheKaP7Ugd6LQCkm4RHnjZOjO/cm2X6+97uYCQi7zU0Bd62cPVGxw8MzeElh+E1UokjmcJla1qG6QWCvu/hckPE9+07FDqRNBNLpwOCM+d+EEnGqa4vJXU2+330CpnG2v1l6en1z/D+VJ1eCwCT15+8eXjDiu9bk2Ikhi5abaQW2Q44AGSYhpcchtc4c5HxOu6ZBhNuOgyzelPCVPrObwfrcZfsZTodEAwLpG95vfU8y76z1lvTok7v4TV6LQD86MvlYmz0NHHYKCdpD+FTL40NWbdaFXIAyDANLzkMr7FecyO/VfyktJsOw6zeyRtO3iyijm4fM386HRBUfW2SGBuzF0d3GjMvjpuxR3zni1yJRjm9kaQndPLtxp4DFyz73v7xW8R3ttagMggHgAzT8IrD8BqzLty4ualZZri3YoGgfTdFqowQTjJ1Zwa8nczgdDIgkIeNKN9kOHVYwyXVEKYqDVSt4fAx/eq1ulVvNFesM06Jl687ztLv3bUv+2Y9YdVPn3MAyDANrzgMr1EWRs9Zw9eqBeKz71aL7/6i9xp4O5nB6WRAIA9stO223PLvbvnpYj59rpjeaLYObEWx+sAGBX0yr+D23ZnwdobSGx0/MDSHVxyG10gLMTmxAfFbf+MwrNB7847z2twle5lOBgSyFNe6zdanbJGpZWhLA7pPVaZXAkCqTFSgwlAxJujJs9XfTxkT6Lv7DFc7CTkHgAzT8ILD8BopKHu8upFDLW3PrfQIVi0QOWu90sk5dHuZedOpgODQ0ctiLNCeLDtuCM5n/CTKwlF5OEo0je5XVemVAHDp6uNivFWsN96W71+44pj4/ufenAJvayi90fEDQ3N4wWF4jbQpOq8ndFYuEN36rxPX+NL/J7q9zLzpVEAwevJOMRYoj5pd16jWyDhgsmzNcXi/qkqvBIAfdF5q6xM6Sjkka1HTzQe6vfnpjY4fGJrDCw7Da4xLTBUOkhxlbodhld5yEzYtzOj2MvOmUwFBk3YLxFgYM323bdegSg+871QNvZGkG9q/B07/7j8cfanBUHylpZFBYeq8/fA256c3On5gaA63Owwv8uV3Z+ZZHN3KBYJexd3jv0v+Q7H+vszs6/A2M2+nEwEBnQovUN5IDn70+BXbrkN7C+049ekmeiEApIofNA5KPDfa1usMD+S0fLdTErzN+emNjh8YmsPtDsNrvHDxxq3ALOu3gZnVCwTlZiMnOX/ZEXi7mbfTiYBgS5pxIKjMC4m2toXyvj3w5GBxLV1qtbpRbzSHjtsuxkCrL5baeh25r5UOm9BNDrrdwfRGxw8MzeF2h+E1yg3MzzeemqfDsFLv3sM2iWt16pkMbzfzdjoREPQbaSTObd99he3teaPNPHGt8TP3wvtWRXohAJRjwInKME+8OEZca8PWs/B2B9MbHT8wNIfbHYbX2PHrlcJpUXCWl8OwUu+NqWfFtcq9bE0tTqa1dCIgqPPODDEGKO+k3e2hijZ0rWYfL4L3rYp0ewBIT+JkLfL0k9dsv97nvYx8p5TjEt32YHqj4weG5nCzw/AiY2qOFk5ra9rtVTqsXiDotdxfn4gT1zt1hl/LqUa7A4Lf7APNsn8fqN3pZnSn2wNAqjxE+lMKKieul7zeKHv59CsT4G0Ppjc6fmBoDjc7DK+RTsWRw3rk6eF5LpB2LBANW81R/rScV2l3QEApWUj7ZxtNdqxNMuF0Xjc4XqfbA0CqBEPat3GoTi8lnJY3uMdP2f/EMRq90fEDQ3O42WF4jcMCJ9eodFYwh2G13oPHbBPX/LCL+sXTvUa7A4IufdY6/oqM9hrSNfuOULtKgxv1RvPVwM3mtPkHHLvm663nKXuDywEgwzTc7DC8xldDPI2zY4GgSiNOpGVgRk67AwJ6NUbar0455Vib6MQ5XfOFptPg/asa3RwA0v4/eQrcye0mA0cbTx07dF8J74O89EbHDwzN4VaH4TXSK1+5QfpkEAdpxwKRMzHr4WOX4f3AtFdvybPnf/Td+Vhf331lBvmuXPnFsTZlXbjhu6tYf98fSwzwZft/RvexSnRzALh5+znhY+hkrpPXpRPAdN1K9e0pO2dWb3T8wNAcbnUYXqMs/5bfkzi7FggqAUbXTpy6C94PTPv1Jk5bcEBo3uC92Y63i1Ic0bWXrEqH97FKdHMA2D/euXRDOUk3N7IsXJZiNxwcADJMw60Ow2ukMlyhUmTYtUBQ4EfXfqcjp+dQiXYGBLTnkzSnsoNOt6tbP6MO9TdxG+F9rBLdHADWb2GUZpu56KDj15Y3HKrVoeYAkGEabnUYXqNckKmEUX4Oww69ZXqOYKePmRjaGRCUrZ0oNN++O9Pxds1bauwDrNd8FryPVaJbA0A6jfuXsoPElgPaeuD09bv2NQ479VTshoMDQIZpuNFheJFP1hkrnBTlysrPYdild/Eao8T1d+3LhvcF0169MzJ/EosxLcqIMlmnz/4gxtpD5QbzDYcDeqMp9+Gh6kDLg0dUYx3dF7n1RscPDM3hRofhNcoFmTbkU3Lm/ByGXXpT6hneB6gW7dKb9t6hT+LSXleygfa+ovtZFbo1AESXnKSnjnR9ygmoUl1gDgAZpuFGh+E1Lg4syLXfnh7SYdil9/BADsLWDiVpZYamXXp/OzhFaE2vxlBto72uZMPY6Xvg/awK3RoA1m0+07Fyg8Eotzxs2+X8lof89EbHDwzN4UaH4TV+PXCDcE5f9l8X0mHYpffmHeeFDRXrqZcuwau0S286+Utaz1mMW5CHjtvONxwO6Y1mwYpD4eUmW32xNOQea4Te6PiBoTnc6DC8xpeazRDOaeGKYyEdhl16U7oEWRf24qWf4X3CtC/vo1yQT5zGLcgyLxxqX5iKdGMAmH7iqtC5cJURUDsSp4XOsoDQGx0/MDSH2xyG10h7Uu4va9SrPJeR/wk5uxeIao0mCTvWpJyG9wvTHr0PHDHqTRd9Nh7aNjoZqmp+NjfpjaY8gIHIN5mTMs9qseqj4H2SU290/MDQHG5zGF4jpeEgx0R7VMJxGHbq3bFHsrCFyieh+4Vpj96T5+wTGr/10Xx4+557c4qwZcW6E3BbVKAbA0DK9UgafzXAuXrTeZGefBeoYDz5Pn7qGrxfpN7o+IGhOdzmMLzG+Elpwim9//mSsByGnXrL4KBJ+wXwfmHao7cM8mNHbYW374vea4QtvYZtgtuiAt0YAL72wVyh8ezFh+C2NAzUWp++wPlk1MH0RscPDM3hNofhNbb4JEk4pYQpodOv2L1A7D98SbnXJF6mHXpXaThRaLx2E/41/6ykQ8brwfexrwdVoRsDwKLVRipTZ7zviM3Clo+/SYbbIvVGxw8MzeE2h+E1lqqZIJzSzr1ZYTkMO/Wm1yQPlxsi7KFkvei+8Tqt1vvylV98fywxwHeXIgd96FUcjTU6lMIJod0XAMr8e+RTVNCX9jaTPZVfnQi3ReqNjh8YmsNNDsNrPHPOqIjw4FODw0pQ6sQCIXN2LVx+FN4/XqfVem9MNSoyPP3KBHjbJOkwCtlEh1PQtqDptgCQau+Gk9/UKV66/PPNG6ALF/EHjzgAZJiGmxyG1yhPyFHQFa7DsFtvmZOQ/kT3j9dptd6DE7cJbdt9tQLeNskm7RYImybO3gu3BU23BYD9Rm4R2n723Wq4LZJyC8T6LWfgtnAAyDANNzkMrzHSIuVOLBD05C+SoJRpH63W++0OC4W242eqE2zFJaYKm9p3VycodYveaDZtb4w3OlyGtkWyTddlwqZhCiSE5gCQYRpuchheo0wAnZR8LGyHYbfetPdPpX07XqbVeqtYf3fDVuO19DMN1Hkt7Ra90Sxdy9jfvHt/NtwWyVGTdwqbqDII2hYOABmm4SaH4TVGWiLJqQWCTgGTXXQqGN1HXqaVesvA/qFyg5UK7Olgyp9KxipzMMUteqOZfeGG73dF+/n+XHpgWPubneKmbUYFmkr18SUvOQBkmIZbHIbXKEskFao8PCKH4YTelAdQtVc3XqSVei9Q+NU+ncok2+iQCtoWt+iNJqUZIk2fbTQZbktO0kEQutmgwyBU/hKtNzp+YGgOtzgMr1EeAHml5ayIHIYTelMlELKNkgaj+8nLtFJvqsSg6uGe1oF9WZQUHW2LW/RGc8jY7cru7aT602Tb1rQMuN7o+IGhOdziMLzGbwenCCfUrf+6iByGE3rLfFlUGxjdT16mlXrTjQZpukDB9D4jJhjVcNp2Ww63xS16o0mVjUjTxKmhE9w7zZafLjZsm7Ybrjc6fmBoDrc4DK/x9dbzhBOasTD8skROLRC0F+sPxfqLvVno1yReppV6F64yQow32nqAblduUkoOvuFwVwBYIfCUbUvaebgtuTl4zDYlnk5yAMgwDbc4DK9RHrSIJAGukwuEfE2SuhP7msTLtEpvmXC8QHk1T3aremBAV73RpJvGu4sPEFTxBnJ1yikxH6q/jt2fyAEgwzTc4DC8xozMn4QD+usTcREtyE4uEM07JSmXM85rtErv5WtPKFWRIS/KlCEqpajRVW806akfaVmxHv6kbV7M8t9w3PlYX999ZQZBbzg4AGSYhhschteYvP6kcJDPN54ascNwSu/YUVuFjZ9+uwreX16lVXpLLT/pqa6WsiLItPkH4LborjeaCVN2Gbn2Pl8CtyUYZQ125A0HB4AM03CDw/AaByVEd8rWyQVC1vF8UeGnRm6nVXrLp7njZuyBtykYew/bJGyk6jhoW3TXG00qNUhaDh23HW5LMMpUV1Pm7ofqjY4fGJrDDQ7Da5QL8tjpkS3ITi4QMnHw3yoNg/eXV2mV3nI/57ZdmfA2BeOilceEjfWah58WyW10SwBIh3lIS8oFiLYlGPuO2Cxs/LwXrk4xB4AM03CDw/Aay708NqoF2ekF4tFnhgs7T5wOr1IJ01paobfqG/Ilj5+6JsYajTm0LTrrjSbtqbu31EBxqIcO96DtCcalq/FvODgAZJiG7g7Da6TSV9Fmond6gaCqEZHUKmZaSyv0plPcpCE9BUS3JxT/XmmYsPVkmKUR3UY3BIC79mULDcu8kAi3JT/Kk/HImuccADJMQ3eH4TVu3h59LUqnF4gveq8RtvYbuQXeb16kFXrTvj/SsMUnSfD2hOLL7xo3HItXpcNt0VVvNCfN2Sc0fLvDQrgtoVi02khh65H0KzC90fEDQ3Po7jC8RjMn5JxeIKQzf6fjIni/eZFW6N2pZ7LQkMr7odsTip0DNxy0Pwtti656o/nZd6uFhv3j1b9pbNhqjrB19uJDML3R8QNDc+juMLxGMyfknF4g0vZkCVufrDMW3m9epBV6v9B0mtCQcgGi2xOKdCKTbG3aXv2nR6rqjaZO4+2buI3C1u6x62F6o+MHhubQ3WF4jc82mhz1CTmnF4irV38VexVpz+JlhQ8QuJVm9aa9TVT9g8bb2fM/wtsTirv3G/vHytZOhNuio95o0nh7qNxgoeG5DPXH27ylR4StDd6bDdMbHT8wNIfODsNrpBNyVO6KstBnRXFCDrFAUDZ/cpJb07gknNM0q/exE1eFdkWqjIC3JRxeu/arOEH6+8f7+S5cVPcEqap6o3no6GUx3oo+Gw+3JRymB+ZHYdD84ACQYRo6OwyvkbLOk8OhLPTROgyn9W756eKochYyzdOs3guWH4U+4YiGVRpOFDZvTD0Lt0U3vdGclXRIaNfow7lwW8KlfEJ+PuMniN7o+IGhOXR2GF7j1HnGHicqexWtw3Babzo8oHoZMbfSrN69hqYI7br1XwdvS7hs3XWZsDl+UhrcFt30RvOrAeuFdj3jNsJtCZfPvTkFlrSaA0CGaejsMLzGbv3WCWfTa9imqB2G03rTZm6yuTaXhHOcZvVu3Ha+UV93gT71dUdMSBM2t+22HG6Lbnqj+UrLWUI7evKMtiVcftjFuOEYPXknRG90/MDQHDo7DK/xtQ/mCmczd8nhqB2G03rT4QGyuUCFofD+8xrN6i0L3u89eBHelnC5fssZYTOVE0PbopveaBaqbFQOSj95DW5LuIxLNN5wULokhN7o+IGhOXR2GF5j6VrmFmTUAkGbpMluKteF7kMv0YzeVIaLynHRoSM6fIRui9vtRuuNJlVvIR/xd81qhy9ZlS7spqpHCL3R8QNDc+jqMLxGKvv2h2L9fX8qGStOO0brMBB612tuvNpZtPIYvB+9RDN6yydpVV/T70la8RqjhO10qhRtiy56o0m+ARVImaE8CUxVQRB6o+MHhubQ1WF4jTKp8lMvRZ9UGbVAdOmzVtjeZ7g3KzSgaEbvkRONvXRtui6DtyNSyr1kC1ccg9uii95o0r5m0qxr37VwWyIh5S68v2ycsD2a1Fxm9UbHDwzNoavD8BqnLzgonMxbH8035TAQenu9QgOKZvTu0H1l1BVn0JTlxGJHbYXbooveaL7ZZp7QjPwc2pZIKVMPbdp2znG90fEDQ3Po6jC8xp6BskM9Bm0w5TAQeu/cazy9fOLFMfB+9BLN6F3nnRnalOTKzcSpgXrZXyyF26KL3miWeG600Gz/4UtwWyLle58ZuU7HzXA21ykHgAzT0NVheI309Eyk5JgffUoO1AJBexZp7yLtYbzCJeEcoxm9i2h8cGfdZmP/YvXXJ8Nt0UVvJDMyfxJ6/fWJOPFKFW1PpOw3couwv3PvNY7rjY4fGJpDR4fhRZavO044me27M005DJTetHeR7N+1Lxvel15htHpnZl8XWj3w5GAtF2SqykD2P1xuCNwWHfRGM3n9SaFXzcZT4bZEw5sVc953tmIOB4AM09DRYXiNlM7inphYUeP0soknaMgFQiYVnrlIvz0+ujJavWkvE2lFe5vQbYiWjzxt5JQ7deZ7uC2q643moAQjl97H3yTDbYmGB48YNYxLPj/acb3R8QNDc+joMLzGA0cuCQcTU9Ocg0EuELLME5UXQ/enVxit3uNn7hVaUR1ndBuiZa0m00QbkjechNuiut5oftB5qdCK9m6ibYmGdIN+r/8GnfJPXrr8s6N6o+MHhs4o3Lvb6Km7tXMYXuP8ZUeEg3y11RzTDgO1QEyes0+04d1OSfD+9Aqj1VuWHNQ5bc9HXy4XbaB0NmhbVNcbzecbT4XV07WKFeuNF21I3ZnhqN7oEIKhMwr3/cnpuxZm5LRqkzFygdiSdl60oXIDfV8r6sZo9W70obmSgypwyNjtog0deyTDbVFdbzT/VmmY0IrKRqJtiZbvdFwk2kApr5zUGx1CMHRG4b4HadBSkmH0BGIGp1VpBpALxIWLN3x3PtbX95eyg7Q8WKAjo9W7zAuJ2tUAzs1la46LNrzUbAbcFtX1RvJchlErvGBFvWuF09YWagdtdXFSb3QIwdAZhfsuoEE7K4k35qtMmWg0JdVcolH0AlH02Xij2PuJq/A+9QKj0fvq1V99dxXr7/tjiQFRlxxUgeknr4mx9lhV50t06aQ3mjJlz3NvToHbYoazkg6JdrzRZp6jeqNDCIbOKNK3v7HXZxN8AjHzJj0to/xYVpQaQi8QL787U7SDns6g+9ULjEbv3fuzXZG028p5owvR8zsaJk7bLTSigyBoW8xwz4ELoh1layc6qjc6hGA4gJiYmB6lSpVq4mes/+ciwT5XunTpiv4/fl+wYMH7SpYsGRPyix/t8x4NWnrFiJ5AzLxp5ZMM9AJB+7F0LS+mI6PRe/Zi559k2EVUiS6d9Ebzi95rXFG2j56c01NzenpOPzult5VxBkNB+AO+Gv7Abgr97P+zsD8IXBrss/5/O+z/zHU/lxcqVKhAyC9/pHdVL2bM14lLV1u3lwm9QIyYkCba0u6rFfB+9QKj0bvXsE1Coy/7r4Pbb5YtPkkSbaG0NmhbVNUbTcpsQBotXH4UbotZ0lNzJ5PdcwDoAfiDuW/9QWA7+Xd/kHcpn89+ENGXP9DlATdswHUzB4/ZZtlpRvQCITP+1357OrxfvcBo9KY0PaTRpDn74PabJaWxobZ07bsWbouqeqNZqmaC0IhynaJtMUuZ7H7GQmf21HMA6AH4A75EP1vk+PtFesWb12f9AeCQkiVLvur/s2exYsXKhvP98gg+1WOkAcVUi20D+cziJ3Gak8YAACAASURBVKWZ/q7r140Fgv5EtIWqMlBbClcZAe9XLzAavSu/arw2pbQ9aPvNct7Sw6Itr30wF26LqnojefXqL6I+ONUJpz2baHvMssfADWK8fTskxTG9rYozGIrCH8yNi4mJaZbj71cLFSp0b5CP30n/KVCgwF/8geLucL6/5ltGxvz9Ry77GOqhTrMZQp+0fRfQppjGv/71L99D5YaI9vz7f/wftDmMXCB97n8iTqTr+c//+r9oc0zjfNYN40BLnTFoUxh54PR5o2Zzxfrj0aZYgqRVxnad9z5f4tg1LQgxGCoj8Aq4bY6/X8nrcyVLlmzs/7eRgb/+zh8A/mc439/2yxVi0E6cvRd+B8W8nbeSpP5gyR0jAfmEoOprk25uzEf3rdsZqd7pJ68KbYpWGwm33Qp+/72xMf8PYmP+L3B7VNMbzdmB1Cn06hRtixXcsSdTtKd83XGO6W1BiMFQGf6grho9BaSfS5Qo4Y/rSiXTz/6gsGTOz/kDwJf8/16Vfi5evHgZ/+c2hvP9Q8btcDyBJTM8UmZ8K/doktMg0J+oNsmk1l7ZmI9kpHrLA0eUrgdtu1V8ss5Y0aade92f7F6F+R0J5YEjt6w9l6/84vv94/1898TEivrATuhtdbzBUBD+YC/OHwQ2D+zxo/Qud/oDvPP+/39/rs+1o6eF/n8bENYpYD+WrTU25jdptwA+gZi/5eqUU0IbqpVplcNALxB9Rxgb86neLLp/3c5I9ZYHjj7+Jhluu1V0emO+Tnqj2dxFB44k5aGW/YftP9TCASDDNI6f/sHYh1FvPHzyMH/LUZN3Cm1ad11mmcNALxBUX5baRPVm0f3rdkaq90eBA0cjJ6bBbbeK3WPXGxvzB6fAbVFNbzTlgaPN292Tp7FhIK3NvKVHHNEbHT8wNMd///f/iE3f95XhGq2qsVNPI3FyXGKqZQ4DvUAgMuZ7lZHqXauJcSAsecNJuO1Wccrc/aJNb3dYCLdFNb2RdGulFko5ZFTX2uyI3uj4gaE5yGHQpm9Ro/XkNfgEYt5i3eZG6bQlq9ItcxjoBYLqy95dfICgUxnzvcpI9X70meFivFG6HrTtVjF1Z4Zn3nCoML/D5fFTRoWjIlVGwG2xkhNm7RXtoiTkTuiNjh8YmoMcxovvTBeDduU699z5u4EyMD924qplDkOFBUJmzKengeg+djMj0ZvygJImD5cbArfbSl66/LPvd0X7+e4tNdCRjfm66I3minUnxHh70WVJ4el1NrWrcoOJjuiNjh8YmoMcxkc5kg2jJxDTYPaFG+LV/F/KWvdqXpUF4vXW88R4m7P4MLyf3cxI9F6/5YzPrWUhi9cYJdp26OhluC2q6I3m8PFG9on23d1VFlL6bSe2VHEAyDANchi0x4wm46ffroJPIKbBm3eSr1p3J6nKAkEngJ3aJ+NlRqL3mOm7hSatPl8Ct9tqvtJyllFvdsUxuC2q6I1mx69XCk2GjtsOt8VqPl49XrTt6PErtuuNjh8YmoMcxqKVx8SAbfD+bPjkYRqkPHlW7yVRZYGQ+2RafroY3s9uZiR6f9F7jdBkQPxWuN1W87PvVou2xY5yX9ui1RvNlwIVjpatOQ63xWrWa27ccCQlH7Ndb3T8wNAc5DCoEDcN2NK1EuCTh2nQjtNkqiwQVAWE2lalof37ZLzMSPSmmz/SZMHyo3C7rWbi1F2ibR90Xgq3RRW90bx58NCi/c0qkd6kUdsGjrYme0N+eqPjB4bmIIdBJZPoVOZdxfqLU5roCcT8N1HA3up8UqosEJnZ10XbHnhyMKcespGR6B1Tc7TQhG4G0XZbzXWbjf2NNd6YArdFFb2RvHDR+v3NKtGpGw4OABmmIR1GmRcSxaDdd+gifAIxb2WUt1IPlRaIwlVGiPadOO2elCOqMVy9nS5h5TTPZxgnnAuUd9cJ52j1RnNrmpGa55kGE+C22EGnDlRxAMgwDekwXg1kMF/owldAuvGKf0GmAvZ/Khlr6RNZlRYISv/AqYfsZbh6p+3JElqUe3ks3Ga7+MjTRo7D02d/gNuC1htNmZy72ceL4LbYQZlS6cGn7H3DwQEgwzSkw5AbpQcl2LtvgRmadi3IKi0QlP6B2kjpINC2uJXh6j19wUHX1wOv9Zb7qpxEqzeaXw/cILT4boh7y/MVqjzc9jccHAAyTEM6DFl3tm235fDJ43VOW3DAlgVZpQWC0j9QGykdBNoWtzJcvXvGbRRa0MKMttkukl9zW53jaPVGk/waaTFj4UG4LXZRvuGghNd26o2OHxiaQzqM5PUnxYCt7bLM7Drym8CC3GOQtQuySgvE8rVGJQBKB4G2xa0MV2+qk0taTJ23H26zXRw8Zptxw9EjGW4LWm80y9cdJ7SgNx1oW+xih+725znkAJBhGtJhyNqMj1UdCZ88XmeT9sYdMj0JtNphqLJAUN1paiOlg0Db4laGqzfVySUttu3KhNtsF5euPu76Gw6V5ncw0iGje2NixaEjOnyEtscujpiQJsYbVdmyU290/MDQHNJh0GZVOpZPx/MvXvoZPoG8TNr7R85jh8V3yCotEDTe7i8bJ8YblU9C2+NGhqM36UB1cqleLtXNRdtsFynfnNtvcFWa38FI5fhIh5LPj4bbYidprym1s1aTabbqjY4fGJojp8OoVN94ErB9t3ufBKhOukO+x6Y7ZNUWCCqYTuNt847zcFvcyHD0PnzMWJCpXi7aXjspbziorVkuveFQbX7nxZtVp95zd9UpOm1O7fx7pWG26o2OHxiaI6fDkK8e3bw5V3XuP2xUZaHEvHY4DJUWiOadkkRbJ83ZB7fFjQxHb7kg128xC26v3aS62tRWqkSDtgWlN5qUZYI0oKwTaFvsZoEKQ0Vbz57/0Ta90fEDQ3PkdBjdY9eLAdtr2Cb45PEqqfIHadCw1RxbHIZKCwSNM2rrl/3XwW1xI8PRWy7IVL4Kba/dpLra1Faqs422BaU3mq27LhMaJEzZBbfFbj7feKpo6+qUU7bpjY4fGJojp8OYOHuvGLAtP10MnzxeZd8Rm4UGXfqstcVhqLRAzEo6JNr6Zpt5cFvcyHD0/rCLdxZkqqtNbaU622hbUHqjWdPmoEgltgkEu5RizS690fEDQ3PkdBgpqefEgH22kb0lbJjBScE3aTBuxh5bHIZKC8SufdmirU/WcW8FCiTD0Vs+pViTchpur92cu+SwaCvV2UbbgtIbTdoT5/aKLJKDE43UQx9/k2yb3uj4gaE5cjoMWcKG9i6gJ49Xaec+JdUWCCp5d5cNJe+Y4etdsKK9+5RU4t6DF0VbS9dKgNuC0htJr9RklrQ79RAHgAzTyO0w5IJwLsP9C4JqtPukoooLBC3G1N59hy7CbXEbQ+lNQR/1Pc15tK1OkG4y/lhigKizfcWFOehUnN85uX7LGTHeqr/ujTdMR9KviPYWq27PCXsOABmmkdth0OSkQbth61n4BPIa7c5VpuICQYddqM3zlx2B2+I2htKbXvtS39NrYLStTpG2G1Cbd+51XxUKFed3To6Zvlv0favPl8BtcYI5U3rZccPBASDDNHI7jPc+W+zqk3Iqc9ka+18ZqLZAdO69RrS5f/wWuC1uYyi9Rwfqf9NBELStTrFx2/muTXWl4vzOSS/O9SdeHCPavHt/ti16o+MHhubI7TB6c2oOGGX5oPbdV9jy/SouEGOn7/HUUwEnGUpvSv1CfU+pYNC2OkWZ6urbwSlwW5zWG00vPu2nA0fUZkrvZYfe6PiBoTlyO4yZiw6KAfvWR/Phk8dr/KSnsSDHJdqzIKu4QNBWAz55bg9D6U3Jn6nvk5KPwW11ilPm7hdtfrvDQrgtTuuNphf3+37ea7Voc+yorbbojY4fGJojt8Og+rM0YCvUHQefPF5jg/dni75fuPyoLd+v4gIhT54/XM4bJwOdZCi9aXM69T2Vg0Pb6hS3pmWINj/TYALcFqf1RlKe+KdDOF468T8qsM2CcgLaoTc6fmBojtwOgwrC3/lYX9+fSw8Up1LRE8hLLPNConAWlK7Cju9XdYF45Onhot2nznwPt8VNzE/vi5d+9v2uaD/fvaW8Nc/pdD2NtQeeHAy3xUm90aQ9cNTvtCcObYuTXLnupGh37ben26I3On5gaI68HEbRZ+PFoKVTqegJ5BXSiTGZouLqVXvukFVdIGo1mSbGW/KGk3Bb3MT89E7daTwJq1hvPNxOpylvONyWjFjV+U2cvdio+vOGx6r+yMwORatZn9mBA0CGaeTlMOq8M0MM2hXrTsAnkFd48Mhl0eclnx9t2zVUXSDadlsu2h4/KQ1ui5uYn97TFxh7fZu0XwC302k+9+YU0fa1m9xV/UTV+U2UZfi6eexwIT1dp7dp9LSd3q5ZrTc6fmBojrwcRruvVojJOnIiL8hOccmqdNHn9ZrPsu0aqi4QsmRSp57JcFvcxPz07hU47f/VgPVwO53m+58vsa3coqp6oylLXE6Y5b30YuVeNnJPpu2xNvckB4AM08jLYcgFmU6loiePVzhs/A7R5x2/XmnbNVRdIBYHgt+6zWfCbXET89Pby/k+3ZrqStX5Taz62iTbSlyqTnrtTW2n1+BW642OHxiaIy+HsWjlMTFgG7w3Gz55vEIqGE59PmTsdtuuoeoCceio/a+/vcj89JavQddtPgO302nefP3dzl2vv1Wd3/QalA7dUJ9nZl+H2+M0u/RZK9reb6S1CbA5AGSYRl4O48CRS2LAlqrpzqLpKvKVlkZONgq+7bqGqguEEwdgvMj89JYHIc6cc9dBiHAoD8BUqu+uAzCqzu+TZ74X/V24ygi4LQgmTt0l2v9B56WW642OHxiaIy+HIYum38ULsmOkYJucxP7Dl2y7hqoLBFGmwPFSkli7GUxvmQrlwafclwolHGYH2n9/2ThXpcBRdX4nrzdSobzQdBrcFgRXbTwl2l/rLWvbzwEgwzSCOYyyte3NSce8RQq47y4+QNDOJKmqLhDEm0mwVxyD2+IWBtPbzcmQw2Whyu7LPanq/E6YYjwBa21DMmQdeOK0PU9AOQBkmEYwhyHrNi6wqSoF8xbpqZ8Tr9xVXSCIdAKY+oAOIKFtcQuD6T1twQHR103bu68cWrh8vvFU0QdrUtyTCkbV+d259xrR1wPirS+HpgPpKfNfyg4SfXDh4g1L9UbHDwzNEcxhyBqGA0d7p1A8ivLQDe0DtPM6qi4QxOGBU9Adutt3CtprDKZ3r6Epoq+7x3ovBYxkq0AqmDHTd8NtsVtvNOUp2DmLD8NtQZESrlMfbNuVaane6PiBoTmCOYzRNtYwZP6WdPKX+ppOAtt5HVUXCOLS1cc5FYxDens5BYykGxMTqzq/ZR68nXutzYOnE9/6aL7ogxkLD1qqNzp+YGiOYA6DynJ5eeOuk6Tcf9TXlAvQzuuoukAQORWMc3rXeMNIAbN+i/dSwEjOXGSkgqGFGW2L3XojaWclDJ1INxo03igHpZV6o+MHhuYI5jDkxtUiHj267ySp+gf1NVUDsfM6Ki4QkpwKxjm9/15pmBhvZ8//CLcRxe27M11XC1nF+Z1+8ppttXB14tjpe0Q/UBUaK/VGxw8MzRHMYdCdG6VJsHrjKvN20lMv6md6CmbndVRcIHKSU8HYr7fXU8BIkk+jfqDN+W5JBaPi/OY3SQap7jT1AyVgt1JvdPzA0Bz5OYynX5kgBi0lTkVPILeSnnbRUy96+kVPwey8looLRE5yKhj79d6Sdl70ceUGE+H2oUlpOagvTrokFYyK89vrKWAkT5/9QfQDJWC3Um90/MDQHPk5DEoTQYOW0kagJ5BbSXkWqY/p6Zfd11JxgchJTgVjv97T5hspYN7u4N0UMJKUmJf6YnXKKbgtdumNpiyD1j/e2jJoOlKWw6On8FbpjY4fGJojP4fx9cANYsB+NyQFPnncyoXLjxp1l9+3v+6yigtETnIqGPv15hQwt0iluagvEqe5IxWMivObU8DcIiVep76gp/BW6Y2OHxiaIz+HMWnOPjFgm3dKgk8etzIuMVX08Sc9V9l+LRUXiJzkVDD2693yUyMFzIRZ3k0BI9l3hJEKpmvftXBb7NIbzfJ1x4k+Ttvj3RQwkjffqM235o0aB4AM08jPYWzadk4M2GqNJsEnj1vZvvsK0ccjJqTZfi0VF4ic5FQw9utd/fXJoo83bD0Ltw/NWUmHRF+82WYe3Ba79EZSpoC587G+nk4BI0lP3a18o8YBIMM08nMYmVnXxYAtUH4IfPK4lS+/O1P08bI1x22/lmoLRG5yKhj79eYUMLe4Y0+W6IsKdcfBbbFLbySPnzJSwDxW1dspYCTpqTv1R4tPrHmjxgEgwzRCOQxeMOxl8RqjRP8eSb9i+7VUWyDyIqeCsU/vzGzjhu6hct5OASN58dLP4unUfWXckQpGtfnNKWB+S3rqTv3xbKPJlumNjh8YmiOUw6C8RV6vGmAXr1z5xff7x/v57omJtT0FjHQYKi0QeZFTwdin9+YdgRQwr3IKGEl6OkV9Qk+r0LZYrTeaiVONFDAfdvF2ChjJcxk/iv4oWHGoZXqj4weG5gjlMGTR9HEz9sAnkNu458AF0bdPvDjGkeuptkDkRToMw6lg7NGbU8DczlpNjFQw9LQKbYvVeqPJKWBu58Plhog+ycj8yRK90fEDQ3OEchjypJybiqarwvnLjoi+bdhqjiPXU22ByIucCsY+vWnzOfUtpXdC26YK6emUSAUzdRfcFqv1RvPNQAqY2YsPwW1RhVUaThR9QgcsrdAbHT8wNEcoh0GTlwZs47buKZquCgeONlLAfPbdakeup9oCkRc5FYx9etPmc+rbibM5BYwkPZ2iPqGnVWhbrNYbTU4BczubfbxI9MnkOfss0RsdPzA0RyiHsXOvcVKuvEtOyqnEtt2Wi76Nn2R/ChjpMFRaIPIip4KxT29OAXM7KUEx9ckbLkgFo9L8pkM1dLiGDtnQYRu0Parwm7iNYrzRn1bojY4fGJojlMO4fOUX3++K9vPdW2qgK07KqcQ678wQzmDFuhOOXE+lBSIYORWMfXr/LXCinzajo21ThWmBVDDlXh4Lt8VqvZHkFDB5c3KguAI9CbRCb3T8wNAc4TiMx6vHi0F77MRV+ARyE53uV5UWiPzIqWCs11vm9KRN6Gi7VCIlKKYbXEpYrPsNrkrze9XGU2K80SEbtC0qURZXoL2AVuiNjh8YmiMch/FSM+NJ1fK1zjyp8gIRT1ZVWiDyI6eCsV5vTgETnEWrGalg0k/qnQpGpfnNKWDyppU3YhwAMkwjHIfhZLkyr3DXvmzRp0+95NyrJ5UWiPzIqWCs13vqvP2iT9/paP7Vk9tY++3pRiqY9XqnglFpflN9ZerTfiM5BUxuUh5AK7ZicADIMI1wHMbgMdvEgO3UMxk+edzCuUuMzeevt3Zu87lKC0R+5FQw1uv97WAjBUyPQZwCJjdbdzVSwYyevBNui1V6o23hFDDBSZVArDiMxQEgwzTCcRhJycfEgH2l5Sz45HELB8RvFX3aufcax66p0gKRHzkVjPV6cwqY4ETMRbv1RttSIZACZgengLmNci5SbWCzeqPjB4bmCMdhHDxipOaIqcmpOawi4qmDSgtEfuRUMNbrLZ86bEzlFDC5iXgab7feSDs4BUz+lAnZu8euN603On5gaI5wHAan5rCeVCDd6X1HqiwQocjjzXq9rdp35EYi9uParTfSjhOnvxf9WaTKCHifqEhZkrFpe3MlGTkAZJhGuA6D6tXSoKX6tegJ5AYiTh6qskCEQ04FY53eWdmcAiY/uiXXqSrzm1PA5M8tacaJ/GcaTDCtNzp+YGiOcB3Gax/MFYOW6teiJ5DuROUeU2WBCIecCsY6vTfvsC73mFtZ9FkjJ2e6xrlOVZnfidN2i778oPNSeJ+oyKwLN0T/PPDkYNN6o+MHhuYI12F80XuNGLSxo7bCJ5DulNUHnC6vp8oCEQ45FYx1ek8JpICxovqAW/liIBXMynX6poJRZX5zCpjQfOTp4aKPTp/9wZTe6PiBoTnCdRgJU4zEnnR4AT15dCelRqC+fNPh+qOqLBDhkFPBWKf3t0M4BUwoyrrcozROBaPK/G7cdr7oy1lJnAImGJ97c4roo7WbTpvSGx0/MDRHuA6D93VYR7ozpr6kO2Unr6vKAhEOORWMdXo3D6SdmDRnH9wmVTlwdKroo897rYbbYlZv9PzmFDCh+f7nS0QfjZ2+x5Te6PiBoTnCdRgnzxgnuwrzyS7TpL0x1Je0V8bJ66qyQIRDTgVjnd7VGk0SfZmSeg5uk6qct/SI6CPa64y2xazeyPlNe5r/UpZTwIRi72GbxHjr1n+dKb3R8QNDc4TrMGhi//WJODFosy/cgE8gnVnrLSMFzOqUU45eV4UFIlxSKpg/lYzlVDAW6C1TwJzP+Aluk6rcvd9IBfNkHX1TwagwvzkFTHicsfCg6Ke3PppvSm90/MDQHJE4DDq2ToN2a1oGfALpTHqKSv1IztLJ66qwQETCsrU5FYxZvf/xb/8t+rBAeU4Bkx+vXPnF9/vH+/nujYnVNhWMCvObbmrFVqG3eKtQfty2K1P0U8V6403pjY4fGJojEofxdoeFYtBSIkv0BNKVFy4aKQDoNYnTC40KC0Qk5FQw5vU+eOyK6MOqr02C26M6i1UfJfrq6PErcFui1Rs9vzkFTHi0Yh3gAJBhGpE4DDpFSIOWCsujJ5Cu3L7b/J1ftFRhgYiEnArGvN6LktM5BUyYfKnZDNFXy9eegNsSrd7o+d2t3zrRh31HbIb3h+o0+yaIA0CGaUTiMCbP2ScG7LudkuCTR1fOXGR+70e0VGGBiIScCsa83gMTtok+/CZuI9we1fnRl0YqmPhJaXBbotUbPb/Jr3EKmPAo94JTho1o9UbHDwzNEYnD2LydKwqYZZ/hm02f/oqWKiwQkZBTwZjX+8Muy0QfTuYUMCE5KMFIBfPZd3qmglFhftObDepDetOB7g/VeTMbxNRdUeuNjh8YmiMSh5EZqCn6UDlzJWy8zFYW5H+KliosEJGQU8GY1/v5t6ZyCpgwuWD5UdFXDVvNgdsSrd7I+U172e4vG8cpYMJk/3gjH2zn3mui1hsdPzA0R6QOw4oSNl7m842nms4AHy3RC0Sk5FQw5vX+W6VhYrxlZHIKmFDcc+CC6KsnXhwDtyVavZHzm3PFRsa5Sw6L/nq9dXQVoTgAZJhGpA4DGcC4gY8+gwug0QtENORUMNEzM+sn0XcFKwyF26IDZSqYe2Jixc0H2p5IiZ7fa1JOcwqYCGg29yQHgAzTiNRhtPrC2LcwZrqzVSzcQEqgTX1HCbUR10cvENGQU8FEz02BPbucAiZ8Fq9hpII5kq5fKhj0/KY1gfqO1gh0X+hAszccHAAyTCNShyHr2NJxf/QE0o2pOzNE3z39ygTI9dELRDTkVDDRc/JcPrUfKV9+d6bos2VrjsNtiZTo+U0H2zgFTGQs8dxo0WeHj12OSm90/MBwADExMT1KlSrVxM9Y/89FzH4uJyJ1GHMWG/sW3mwT3b4FL1OW/2nSfgHk+ugFIhpyKpjoSalfqO96DuYUMOGyffcVos9GTNAvFQx6fssUMJTqCt0XurBe81mizyjjQTR6WxdlMJSEP5CrUbp06Sn0s//Pwv7gbqmZz+VGpA5j1z5j30K5l/WtmYmiLAD+JSAFjHQYugWAnAometKTP5ECZi6ngAmXcYlGKphPv10FtyVSoud3pfqcAiZSduyRLPpsmP9GNxq9rYs0GErCH8x96w/u2sm/+wO7S2Y+lxuROozLLqiZiaJMATNuhvMpYKTD0C0A5FQw0ZP2/lHf0V5AtC26cGEgFcyrGqaCQc5vmQKG+o7KnKH7QhcOC7zhoEAwGr3NRxgMpeEP5BL9bJHj7xcLFix4X7Sfyw1yGNevG4MpXMqN0sdOXIno97xOeYJ63ebTkOuTztHojSQtLDIVzLVrv8Lt0YkFyg8R4y0r+ye4LbqQTpvLVDBoWyIlcn6fPnsrBQy6H3Qi7TWlfqvXYlZUelsXaTCUROnSpcfFxMQ0y/H3q4UKFbo32s/lhi8KNPxgrhi0W3ZmRvPrnkWRqiNFv13/+T/RpmiFp14aa+Syy76BNkUb/PqP/xZ9RnkAGeHj//2//xU3G3TT8c9//hNtjjbYdcAInOs0m4E2RStcuvqr6LdStRKi+n3rIg2Gkgi82m2b4+9XzHwuN2gQRXrH2LHHysBG6R3wOyhdSK9FbqWA+QfEBh2fABJfDaSCWbTyGNwWXbhpm5EChiqB6KY3mvJk5pH0y3BbIiFyftO2FuozKm+G7gedSG84aDsVbau6evWXiPU2H2EwlIY/kKtGT/fo5xIlSpTyI5l+9gd7JcP5XCiQw6DBFMneg6HjtovJ/vE3ke9b8Cq37cqEpoCRe0ai0RtNTgUTOSfNMVLAtO66XDu90dQ1FQxyfssUMFTrHN0PulG+4aDE0JHqbXW8wVAQ/mAvzh/cNfdzSMmSJWP8/+tOf4B33v//7w/xuZCIxmEsWZUuBmz9FrPgk0cX3kwB0w6TAkY6DB0DQE4FEzllCpiBCdu00xtNXVPBIOc3+TVOARMd32gzT/QdlYaLVG9bAg6GdxCNw+CTmZGT7oyRKWCkw9AxAORUMJGz2ceLjNfmyena6Y0mPWnWMRUMcn7LFDD0pgPdD7qxa9+1ou/6x2+JWG90/MDQHNE4DCpbI09mUjkb9ATSgTIFzNjpmBQw0mHoGABSlnzqO9qbhbZFF1ZpOFH02aH0q9rpjaauqWBQ85v2sdHeZk4BEx0Tp+2+uX8yUr3R8QNDc0TrMChNAg3aPQcuwCeQDqwZSAGzdtNpmA26BoA5bziuXv0Vbo8OlClg/u3f/492eqO59+CtVDBoWyIhan6fOmOkgClUeTi8D3TkmpTTov9ojYhUb3T8wNAcgamY4QAAIABJREFU0TqMRh8aqWDmLT0Cn0A6kJwj9Rc5S5QNugaAxLK1E0X/0eKMtkV1ns/4SfRVwYpDtdUbSbrJkKlg6OYDbU+4RM3vaAMYpsHTZ38Q/ffoM5EF0BwAMkwjWofRufeaqPYteJE5U8Agq6foHADS6zjqQ3o9h7ZFdW5MPSv66tnXJ2urN5oyFQxtP0DbEi5R83vMdOMVZqsvInuFybzFB58aLPowM/t6RHqj4weG5ojWYSRM2SUG7IddlsEnj+qUKWBoozTSDp0DQNqQT31ItVrRtqhOmQKm+SdJ2uqNpo6pYFDzu1s/IwVM3xGcAiZaVn7V2LO7ecf5iPRGxw8MzRGtw0jecFIM2FpNpsEnj+qk1AjoFDDSYegaEIycmCb6sN1XK+C2qM4egzaIvvp2SIq2eqOpYyoY1Pxu3Ha+6KtZSYfgfaAr5an9KXP3R6Q3On5gaI5oHcbxU9fEgC1SZQR88qhOmQKmGzAFjHQYugYEsmYmPZlB26I63+loLCZT5+/XVm80dUwFg5rfFeqOE321Y08WvA90Zc9A3k7K3xmJ3uj4gaE5onUYtJftvjKDfHc+1td38dLP8AmkMmlvDE1u2iuDtEPnAPBI+hXRh8VrjILbojplCpjNO85pqzeaOqaCQcxvXges4dR5+8V4o5u3SPRGxw8MzWHGYcg7v+27OflnfpQpYOi0HNIOnQNAOo15T6BmJueezJ8PlzNSwGRlX9dWbzR1TAWDmN/8Jsgabkk7L/qxcoOJEemNjh8YmsOMw5B7P7j8T/4s7HeO1E8ngSlgpMPQOSDg3JOheS7jR9FHf6s0THu9kdQxFQxC71UbT/FecAuYdSHyTBEcADJMw4zDkKe/uAB4cMoUMPeXxaaAkQ5D54CgYSAVzPxlnHsyGG+mgGk0WXu90dQtFQxC78SpnA3CKkaaK5YDQIZpmHEYN/M/fb4EPnlUJb0epz6qWA+bAkY6DJ0Dgs++Wy36clACp4IJxomz94o+avFJkvZ6o6lbKhiE3l36RFfHlnk7a701TfTl6pRTYeuNjh8YmsOMw5AZ4J/nDPBBKVPAvPXRfLgtugcE8ZOMVDAffbkcbouq/HqgkQLmuyEp2uuNpm6pYBB6v9FmnuijOYsPw9uvO+kpKvUlPVUNV290/MDQHGYchqwBGWkJGy+RkqOKFDD9sClgpMPQOSBYse6E6Ms678yA26Iqb6aAmbdfe73R1C0VDELvci+PFX20cy+ngDHLAfFbRV9Sla1w9UbHDwzNYcZh0J422rRKgzb7wg34BFKRqqSAkQ5D54Dg2Imroi8frx4Pt0VV5qwooLveaOqWCsZpvcn/31tqoO93Rfv5LvPJfNOct/SIGG+NPpwbtt7o+IGhOcw6jKdfmSAG7da0DPgEUpGR7uuwk7oHBGLBiYnlBScfPlTuVk1R3fVGU6aCKVs7EW5LOHRa7/TADVnRZ/mGzApSdoNIUg9xAMgwDbMOo0n7BWLQTltwAD6BVKQqKWCkw9A9IHiyjvHKaff+bLgtqvHs+VspYNyiN5K6pYJxWu+V64xyoLXfng5vuxtI+U0jGW8cADJMw6zD+GrAeuEEeg1NgU8g1ShTwPyl7CB4ChjpMHQPCOj1CPUpvS5B26IaN2w1UsBUf32ya/RGU6dUME7rPWryTtE3bbpyChirWPJ5Y7wdOhp6vHEAyDANsw5j/Ewj7UTLTxfDJ49qVCkFjHQYugcEX/ReI/o0dtRWuC2qccKs385FN+iNpk6pYJzWm+ei9azfYpbo08Wr0sPSGx0/MDSHWYexfsuZ3zx1YN7irKRDom+oYgraFukwdA8I+KlDcOZMAeMWvdHUKRWM03rz03jr+fE3yaJPh4zdHpbe6PiBoTnMOozc+46Yt6hSChjpMHQPCOS+oxd539FtfLvDQmM/7vwDrtEbTZ1SwTitN+/HtZ7Dx+8Qfdqh+8qw9EbHDwzNYYXDuHnyMOs6fAKpxA86GylgEqfhU8BIh6F7QMAnD4OTCslT31BhebfojaZOqWCc1FueyP/94/3E4QV0291C2mpA4422HoSjNzp+YGgOKxzGzdxj28/BJ5BKVCkFjHQYugcEnHssOHOmgHGL3mjqlArGSb2PHr8i+qVY9VHwdruJkfQrB4AM07DCYcjqA1Pm7odPIJVYJJAC5sRpfAoY6TDcEBA89RJXH8hNuRXj7zm2YrhFbyR1SgXjpN7L1xpVeV5qxlV5rGQkuU45AGSYhhUOo8cgY/N5z7iN8AmkCi9e+tl352PqpICRDsMNAcHrrY36o3OXcP1RSXkYq8YbU1ynN5q6pIJxUu+RE7kut12U5fV27ct/byUHgAzTsMJhTJqzTwzYdzslwSePKtyxJ0v0SYW64+C25HQYbggIOgfST1DtTLQtqjB3Chg36Y2mLqlgnNSbDsVQnwxKSIW32218s41xgztncf43uBwAMkzDCoeRknpODNiqr02CTx5VqFoKGOkw3BAQJEzZJfq2NaeCucnusbcnZHeL3mjqkgrGSb3pUAz1yYLlR+HtdhspawT1bb+RW0LqjY4fGJrDCoeRkfmTGLAFyg+BTx5VSJOX+qRr37VwW3I6DDcEBMnrjVQwLzSdBrdFFTZtv/C2koxu0RtNXVLBOKk31aulPqH6teh2u41jp+8Rfdvqi6Uh9UbHDwzNYZXDKFBhqBi05zN+gk8gFahaChjpMNwQEKSfvGakgqk2Em6LKsydAsZNeqOpSyoYp/SmwzB0KIYOx9AhGXS73cZ1m439vM83nhpSb3T8wNAcVjmMao0miUG7MfUsfAKpwFpNjBQwqzaqkQJGOgw3BAR0qObPpY1UMJcu/wy3RwU++JSRAibrwg3X6Y2mLqlgnNKbDsNQf9DhGHSb3cgz534Q/fvI08ND6o2OHxiawyqH0bxTkhi0E2fvhU8gFahaChjpMNwSEJSvO070b9oeTgUTbMFwk95I6pIKxim9l642khXXbR46WTEzOj5cbshvcnoG0xsdPzA0h1UO49vBKWLAUj1S9ORBU6aAua+MOilgpMNwS0DwRuCk3OzFh+C2oJlXChi36Y2mDqlgnNI7knJlzOhIBypDFVfgAJBhGlY5jKnz9osBS/VI0ZMHTRVTwEiH4ZaAoEuftWGdlPMCx880UsC899ni3/x/N+mNpg6pYJzSu1PPZNEXdDgG3Wa38t3AG7XJc/blqzc6fmBoDqscxuYd58WApc3o6MmDJj2Vor6gfE5oW3I7DLcEBIlTjVQwH3bhVDBfDQikgBm2ybV6o6lDKhin9G7w3mzRFwtXHIO32a2Ub9SoyEJ+eqPjB4bmsMph0F4FGrC0GR09edBUMQWMdBhuCQjocA31MR22QduCZl4pYNymN5oyFcwnPdVNBeOU3qVrJYi+2HfoIrzNbuW0+QdCvlHjAJBhGlY6DKpDSoOWNqWjJxCS9FRKpICZugtuS26H4ZaAgA7XUB/TYRu0LWg+02CC6IutaRmu1RtNHVLBOKH3tWu/+u4uPsB3F6eAsZU0l2m80dzOT290/MDQHFY6DNqEToOW8hihJxCSKqaAkQ7DLQEBHa6hQzZ02IYO3aDtQfKBJ29PAeM2vdHUIRWME3ofPGKkgImpySlg7GS2fy5TP//1ibigBwk5AGSYhpUOgzah06AdN2MPfAIh+VjVkaIfjp+6Brclt8NwU0BQIZAKZoeHU8HklzPMbXojqUMqGCf0XrwqXYy3+i1mwdvrdhYOpBI7eSbvVGIcADJMw0qHQZvQacB+2X8dfPKgqGoKGOkw3BQQUJ1lGm9UdxltC4qyasBzb0657d/cpjeaqqeCcULvoeO2iz7o2CMZ3l63M9SbJA4AGaZhpcOYvuCgGLBN2i2ATx4U0wIpYMorlgJGOgw3BQSyaHrfEZvhtqBIT9upD97/fInr9UZT9VQwTuhNgR/1AQWC6Pa6na27GnvJE6bkvZecA0CGaVjpMFJ3GhtXK9UfD588KKqaAkY6DDcFBFRnOZyi6W5msBQwbtQbTdVTwTihN736pT5ISj4Gb6/bGTtqq+jrL3qvCao3On5gaA4rHYbcuHp/2eAbV93O/vFGChhKVIy2JS+H4aaAYHWKkQqmZoii6W5mk/YLRB/Q03e3642m6qlgnNCbDn9QHxw4cgneXrdz/rIjoq9f+2BuUL3R8QNDc1jtMApVHp7vxlW3U9UUMNJhuCkgoDFGfV3Yw6lgnn7FSAFDT9/drjeaqqeCsVtvOghD6V8oDQylg0G31+3cc+CCGG9PvDgmqN7o+IGhOax2GPQ0hgYtPZ1BTyAE5cbd5A0n4bbk5TDcFBDQU2Z62kz9feHiDbg9CMoUMNkXbm+/2/RGU/VUMHbrTYmfqf2UCBrdVi9Qnjz/Y4kBeZ485wCQYRpWOwzajyWegE3bDZ9ACMonoKcUfALqxoCgYr3xor+37cqE2+I0T581UsA8+sztKWDcqjeSqqeCsVtvKv1G441KwaHb6hXKV+6UfzEvvdHxA0NzWO0w6ESmimXQnGBmllEO76FyapbDc2NA8NZHRiqYGQtv3wPndq7ddFq0/fkgeyDdqDeaKqeCsVvvwWOMPZCdeibD2+oVvtIy+KEbDgAZpmG1w6CcbKqegrWbKannRNurNZoEtyUvujEg6NbfSAXTZ7j3UsHklwLGrXqjWbe5kQpmyap0uC1O692h+0rR9uHjd8Db6hVSsE19TsF3Xnqj4weG5rDaYexQOA+e3Rw/c69oO1VEQduSF90YEIydbgRBrYIEQW7ml4Hgt3ceKWDcqjeaH38TfEFG0269ZfC7dLWaeRDdSEo5RH1OKYjy0hsdPzA0h9UOQ1bC+HPpgZ5LBaN6YmI3BgRrUvJ/DepmUsL1/F5/u1FvNEdONBbkj75cDrfFab3l6+9DR9V7/e1WLl97QvT5S81m5Kk3On5gaA47HIashZt+Uq1auHbz9dbzRLvnLD4MtyUvujEgOBVIBRPsIISbKWshBzsA40a90Uxef1L0+QtNp8FtcVJv1Q/AuJXHTlwV4+3x6vF56o2OHxiaww6HQc5RpEJZr14qFDtJ+Zqo3ZS/CW1LXnRjQEBPmf/6RFzQVChuJS3C98bE+n5XtJ/v0uWfPaM3mirfcNipt8xJp2oKHLeS/Nu9pQbmOc85AGSYhh0OQ9YwHD15J3wCOUVKjEoJUilRKt0to+3Ji24NCGQy5K1ptydDdivpNRy1uXiNUZ7TG0065U99T6f+0bY4pfcCxZNgu5nlA0/6qc58br3R8QNDc9jhMAbE51/D0I2USWLLvJAItyUY3RoQNG2/UPT91Hn74bY4xUUrjZxslCbCa3qjSaf8qe83pp6F2+KU3oMSUkWbP/1WzTJ4bmbjtkaqK8qwkVtvdPzA0Bx2OIy5Sw6LAdvow7xrGLqR85bmX7dRBbo1IOgZt1H0/dcDN8BtcYoDRxsL8mffrfac3mhS2h3qe0rDg7bFKb3bfbVCtJkOwaDb6TUGS3XFASDDNOxwGLv2ZYsB+2SdsfDJ4xT7jdwi2tylj7oJsN0aEExfcFD0PSWFRtviFD/obFTcSZgSvOa0W/VGU9W5bqfedd6ZIdpMp1LR7fQag+X75ACQYRp2OIzLV34Rm1Zpk7pXUsHIpwKUlw5tSzC6NSBIC+SefOol79xwPPfmFNFmqgbiNb3RVPVpv516F6kywpOZHVTg+i1nRN/XeGPKbXqj4weG5rDLYdCxdRq0R49fgU8gJ/hso8mivRu2qrUvKLfDcGNAcMV/wyFTVNBhHLQ9TrBAhaFivJ3L+NFzeqOp6n5fu/TOzDZKXNJpe6/c0KvEs+d/FP3/t0rDbtMbHT8wNIddCwQlrvRS1viHyw0R7c3I/AluSzC6OSAoVTNB9P++QxfhttjNM+d+yHNB8JLeSNJNxh9LqHfi3y69ZYnLKg0nwtvoVRYof/v6wgEgwzTsWiA69lC3ZJLVlLnBHnlavdxgOenmgKBhqzlCA3o9h7bFbq5OOSXaWjNE9RM3642mzPm5e3823Ba79ZblFlUtcekFypPnm7ad+43e6PiBoTnsWiDiJxklk9p2U69kktVctdFYkGu9pV51gJx0c0BAG/JVLsNnJSm/JrWV8m16VW8032hjVP2ZvfgQ3Ba79e7ce41oKx1+QbfRq2zxSZLQYNKcfb/RGx0/MDSHXQuEDIpCPaVwA+WC3CbEgoymmwMCeVKu5afuf0rxSc9Voq1xiame1RtNmZqj97BNcFvs1vvVwNP1+cvc/3RdVfYamnJbqisOABmmYdcCIfcpFaw4FD557CYlRw1nQUbTzQGBl/Yp1Ws+S7Q1KfmYZ/VGc+LsvUIDejKDtsVuvUs+P1q09cCRS/A2epUy1RUlvc+pNzp+YGgOOxcI2qROg5aCQfQEspNUjSGcBRlNNwcEWRdueOakYrHqo0Rbj6Tnf8LezXqjuXm7ccNR+VV1bjjs0JtSev3+cSOlF9WfRrfRq9y2K1OMNyp7mVNvdPzA0Bx2LhC0J44GLb0ORk8gO1niOeMO+fCxy3Bb8qPbAwIv5Cq7eOlnkWPzz6UHhgx03a43kirecNih9/bdRuBB9WjR7fMyL1y84bvzsb6++8veGm8cADJMw84Fgg6AuL180KXLPxt3yKUGKn+H7PaAQFYrWLbGvamHUndmiDZWqj/e83qj+VjVkUKL46fUuOGwQ+9p8w/c9uqRiaG8wT1x+vubeqPjB4bmsHOBGDJ2uxiwHb9eCZ88dnFHoApFBQ3ukN0eENA4Iy1o3KFtsYtT5u4XbXyn4yLP642mvOFYsU6N8mh26E2HDqiNVG8b3T6v84Wmxhu15A0nb+qNjh8YmsPOBYLqRtKAJUeJnjx2UW7ObdJ+AdyWUHR7QDBigpF66KMv3Zt6qHvsetHGbweneF5vNDt0N244ho3fAbfFLr2pvja1kfwcun1eJ2WZIC0o64TUGx0/MDSHnQsEvRqhAVu4ygj45LGLtBBTG3sM2gC3JRTdHhAkrz9p5GNsonY+RjOUC/KMhaEXZLfrjSYFfqQFBYJoW+zSm+prUxt37s2Ct8/rHDg6VWjxea/VN/VGxw8MzWHnAkGbVR98arAYtJlZ1+ETyA7Sqzhq39R5++G2hKLbAwJZkeXRZ9SuyGKGkSzIbtcbTXr1q9IbDqv1liXvqM421dtGt8/rXLD8qBhvVPVI6o2OHxiaw+4F4tlGk8Wg3bD1LHwC2UE6lk/to835aFtC0QsBgQ41maMlHTL6U8nYsBdkL+iNpHzDUUSRNxxW67334EXRvtK1EuBtY97So2ztxJt6o+MHhuawe4Fo9cVSMWgTp+2GTyCrSU847yszSBzPp2P6aHtC0QsBQfXXjRuO9VvOwG2xmvsPXxJtK1UzvAXZC3ojSfOf0sCQJpQWBm2P1XrPXXJYtK3Rh3PhbWP+m+/q1V99d/lv/uipLD2d5QCQYRp2LxCxo7YKJ/LZd6vhE8hqHjtxVbSt6LPxcFvCoRcCAjffcFApLmrbq4FXQKw3npQImjShxNBoW6zWm8rcUdu69VsHbxvTIN38yaosHAAyTMPuBWLRymNiwNZvMQs+eazm0tXHRdtefncm3JZw6IWAYED81t9slHYT+8dvEW3r3HsN660IqRQcaUKl4dC2WK13805G2ybMwreNabDBe7OFJrSucgDIMA27FwgqV0UDlspXoSeP1byZ57BHMtyWcOiFgGBhYKM0OUq0LVbz/c+XiLaNnb6H9VaEN5+S9cc/JbNa78oNAk83d5yHt41p8JOeRt35wYnbOABkmIfdC4Ru++QiYbuvVojJSPnn0LaEQy8EBAePXBaaUHk+tC1WM9IDVV7QG83Ziw8JTd5oMw9ui5V6u9lv60yqqkXjjdYeDgAZpuHEAvFMgwmuvJOs/fZ00a6V607CbQmHXggI6KQsFa6nerlUpg9tj5V8qFxkKZW8oDeaew5cEJo88eIYuC1W6n30+BWt9jd7hTlTD3EAyDANJxYIuZdEhX0yVrJwrtqMqtMrAQGV5SNdtu3KhNtiFU8GchwWqhx+jkOv6I1k7pOZSFus1HvxqnQx3uo1d9/ebZ2ZnuPgIQeADNNwYoFw42myzOzrok0PPDlYvC5B2xMOvRIQUOF6XZJzh0tZ5YTqgbLearHMC4lCG8rThrTDSr0HJRhVJ2jPGbp/mbdIa82fSw8Ur+YvX/mZA0CGOTixQMh8Uq994J58Upu2nRNtqtJwItyWcOmVgIAK15M2VMgebYtVlHWOae8P660Wya+RNvOWHoHaYaXeH3b5bd1ZpjqUbzjS9mRxAOh2xMTE9ChVqlQTP2P9PxfJ77OlS5eu6P/j9wULFryvZMmSMeF8vxMLxL5D7ssoT6+zqU2UBgJtS7j0SkBAhetJG6qbi7bFKtJJc2oTnTxnvdVi175rhTb9Rm6B2mGl3s+9OUW0aU3KaXj/Mn9LWQ98VtJBDgDdDH/AV8Mf1E2hn/1/FvYHgUvz+7z/3w/7P3fdz+WFChUqEM41nFggaG/MPTFGCavLLqkp+WX/dWIS0utttC3h0isBgbgz9mtDdXPRtljFl5rNEG1atuY4660Yx83YI7ShND1IO6zUu0CFoaJN5zJ+hPcv87eUa0+f4Zs4AHQz/IHct/4gsJ38uz/AuxTi8x9Eeg2nFohyLxtF7HfsCV3EXge+2WaeaA+lgUDbEi69EhBQnVy62aC6ueiN+VbxsaojxXhLP3mN9VaMG1PPCm2qNZoEtcMqvU+f/UG05++VhsH7lnk7x8803j6999liDgDdDH/Al+hnixx/v0ivd4N93h8ADilZsuSr/j97FitWrGw41yCHcf264TzsZNP2C8SgnTb/gO3XcoJP1TEC2j0HsuG2hEvS2Sm90SxVyyiZtP/wRbgtZkl52Kgt95eN8y8A/2C9FWNW4EAYpelB2mGV3qs2GgeOajWZBu9b5u2UNxzV35jMAaCb4Q/kxsXExDTL8ferhQoVujefX7mT/lOgQIG/+IPF3eFcw+cQBiZsE4N2wKhUpy5pG/73f/8pni7dVby/73/+53/R5jDywFvtjBuO1ZvOoE0xjUPpVwMOfwraFEYQFAk8of3pxn+gTTGNyfMOGPXbe61Bm8LIA7/8+l/GE9qnh3EAqDv8QV0tCtb83JWLS+lJnj8AbJvjs1eCfU/JkiUb+/99ZOCvv/P//n+Gc30aUE48IZix8NbGfPQdlFlSIW55qAVtSyT00hOhLjc35m+G22KWkwIHjpp/ksR6K8raTacJjejpGcoGq/Tu2GOlaMvQcdvh/crMmwUDezTveLDHX02GIAxV4Q/oqtFTQPq5RIkS/piuVLL8N39gWDLnZ/0B4Ev+z1Sln4sXL17G/9mN4VyDHAYNKLv3Lezca2zMf7KO/hvzFwTqzTZsNQduSyQknZ3SG025Mb/lp4vhtphltygPHHlJbzQ/+nK50IhKdaFssEpvqjIR6YEjprOUZSHvePS7KlbGHAzF4A/04vxBYPPA/j6Z2uVOf4B33v9v9+f6bDt6Yuj/twEqnQIm0sZ8VTLmm+WA+K1i8nXuvQZuSyT0UkCQkmrkaaz6GnZjvhV8vbVx4GjO4sOst6Kk9Dyk0cffJMNssErvIoEKR8dPhX/giOks6cZWBICFere0POhgeAdOLhAyYz7Vz0RPIDNs9cVS0Y4x03fDbYmEXgoIsi7c0K5SSzBSndlo5o2X9EZz6erjQqO6zWfCbLBCbx0rHHmRvQLVte4o0qcfOoZgaAwnFwj5JEOn1Cl5scYbRpLU9VvOwG2JhF4LCNzwJINqzd5dfIAg/cx6q8ljgRqtj1ePh9lghd7yhKkbnpy7mXJPvT8AnI+OIRgaw8kFQiaw7KVR8uS8KJOkns/4CW5LJPRaQCD3Mi1fewJuS7Skp37UhrK1E1lvhUlPy+4rM0jUaKW0PQgbrNB77HQ1kloz8+f23ZkyADyAjiEYGsPJBWLynH1i0Db7eBF8AkXLM+f0TZLqtYCg49e3TjOibYmWtO+P2kBPz1lvtflMgwlCq61pGZDrW6H3F73XiDb0j8eWtWPmz4uXfvb9rmg/3x2F+/yIjiEYGsPJBYIcIzmXSvXHwydQtKTamNSGmo2nwm2JlF4LCEZMSBNatftqBdyWaNk7sNeHTgKz3mqTbmxJqylz90Oub4XeDd6fLdpAmQ7Q/cnMnwMTUv0BYO9u6BiCoTGcXCDkXcu9pQb6vv9ezw3GCVN2CQf5YZdlcFsipdcCguT1RkWDF5pOg9sSLVt8kiTaMGHWXtZbcX43JEVo1T12PeT6Vuhd8vnRog0Hj1yG9ycztN7o+IGhOZxeIEo8ZziYQ0f1dDAdeyQL++MSU+G2ROMwvBQQnDrzvdDq0WeGw22JlpVfnSjasHn7OdZbceZMdo+4vlm9L10O3KDHxGp7g+4lcgDIMA2nF4gG7xmvGBZq+orh+cZThf3JG07CbYnGYXgtIKD6rKRXRqZeB3aIdLDgr0/ECfsprQ3rrTZlsvtyL2OS3ZvVe9su42BBhbrj4H3JDE9vdPzA0BxOLxA6bzKmBfn+snHipF9m1nW4PdE4DK8FBDJjvm4pe4jpJ68J2x+rOpL11oCU7P4PxfqLOuGIZPdm9Z46b78Yb293WAjvS2Z4eqPjB4bmcHqB0DnNwL5DF4XttE8GbUu0DsNrAUEr/zgjzRKn6ZW0m0iluMj2l5rNYL01oUzavWtftuPXNqv31wM3CNu/HZwC70dmeHqj4weG5nB6gdC5RNe0BQeE7Y3bYvb4WOEwvBYQyLJ9n/daDbclUlL6GrKd0tmw3nqwSfsFQjN6mub0tc3qTX6NbKe9jOh+ZIanNzp+YGgOpxcIWaKL9jbpVmqoS5+1wvbemiay9mJAQHtNSTPae4q2JVK27rpM2B4/KY311oQybU/Xvmsdv7ZZvZ+sM1bYTnsZ0f3IDE9vdPzA0ByIBYL2NJFgjxTkAAAaSElEQVSjoT1O6EkUCV9+d6awOyn5GNyWaB2G1wICSmdBmtHpc7QtkbJKQ+ME8IatZ1lvTbhwxTGhWf0Wsxy/thm9ac/iH0sM8N1VrL/Yy4juR2Z4eqPjB4bmQCwQMpCiAuroSRQJ/1ZpmLCb0ougbYnWYXgtIKB0Fn8uPVCkt0CV6IrWbsqXacZuL+qNpjy4Q3Wonb62Gb1lycEyLyTC+5AZvt7o+IGhORALxMffGLn0Bidug0+icJkeKPZeGODYrXQYXgwIaL+pmSdpCMoFuXStBNZbI9K2lgLlhwjtzp7/0dFrm9Fblhxs9OFceB8yw9cbHT8wNAdigRg1eadwNrTHCT2JwuX8ZUe03UuW02F4MSBoE9hLN3JidHvpEJw2/4DppMJe1RtNqjxD2q1Yd8LR65rRu5csOdgv8pKDTAw5AGSYBmKBkPV0n9eonu43cRuhZZ6schheDAgo8CPt2mh0w0ELMdncy8SBI6/qjWannsYbjkEJzlYLMqM33WiQzXTjge4/Zvh6o+MHhuZALBDnMn4UzoZelaAnUbh87YO5wubZiw/BbTHjMLwYENCrX91SD73Scpbpijle1RvNMdN3C+3e+2yxo9c1o3dMTaNE596DF+H9xwxfb3T8wNAcqAWiUOXhxkngE1fhEykcFq1mnFw+fEzPGsbSYXgxIKBDFKLGaamB2tQ4pb2mZueHV/VGc0vaeaFdpfrjHb1utHpnZl8X1Y3uKzNIm/nB5ACQYQFQC4R8wkF769ATKRRpMzfZ+nC5IdrlLsztMLwaENDpRtKQDlegbQnFM+d+MJ6QVxhqarx5WW8kL+coCXf1qnMl4aLVW27Jqf76ZHjfMSPTGx0/MDQHaoH4asB64XR6xm2ET6RQlCW5ar89HW6LWYfh1YAAWaEhUlo13rysN5qyJJyTSZWj1XvIWKPiTPvuK+D9xoxMb3T8wNAcqAViVtIh4XRobx16IoViv5FbtC0nlttheDUg6DN8s9CQqrmgbQnF2FFG+bpPeq5ivTXl2x0WCg0nz9nn2DWj1ft9WS976i54vzEj0xsdPzA0B2qBoL105HSKPhsPn0ih2LS9887cLofh1YCAqreQhnWbz4TbEorNOyUJW8fP3Mt6a8q+I4wbjs691zh2zWj1rlhvvLB1847z8H5jRqY3On5gaA7UAkF7mx4qNxiSMDVSUjJesnP3/my4LWYdhlcDghOnvxcaPvL0cLgtoVjuZaMm67Zdmay3ply00rjhqNfcuZJw0ehNZd/uLm6UgLvMJeC0IgeADNNALhC0x4mcJO15Qk+mYMy6YJwgpXJiup+Q83pAQMEfjTcKBtG2BKNckIlma7J6XW8kj58ySsJRtgOnrhmN3qk7M4Sd5euOg/cZM3K90fEDQ3MgF4jPvlstnA/tsUNPpmCUJ+SebaT/CTmvBwT0+pe0pNfBaFuCUS7IFSxYkL2uN5oFKw4VWtKpbieuF43eMmdhi0+S4P3FjFxvdPzA0BzIBYL21JHzoT126MkUjG46Ief1gIAOgJCWdCAEbUswjp2+x7IF2et6oynfcCxf60xJuGj07vj1SmFjXKKzVUuY1uiNjh8YmgO5QNCeOrMF7+2mm07IeT0goBQwpCWlhEHbEoyyjNjA0eYXZK/rjSad4rZKS7v0fu7NKcLG5A0n4f3FjFxvdPzA0BzIBYL21NHeOtpjR3vt0BMqL9KrOHKQW9My4LZY4TC8HBBQEmjSkpJCo20JxheaThM2rlhn/qmR1/VGc9wM657m2qE3HcS7v2ycsDEz6zq8v5iR642OHxiaA71A0N46ckC01w49oXLzcmBD/h9LmN+QrwK9HhDQDQeVg6MbDioPh7YnN2lBpmozVp2M97reaNJNo1X7Oe3Qe//hS8K+4jVGwfuKGZ3e6PiBoTnQC0S7r1YIJ0R77dATKjcpLxbZRnmy0LZY5TDQeqNZ9bVJQtMNW8/CbcnNYyeuCtuKVBnBeruAdNNI5eAoxcrFSz/bfr1I9Z6+4KAYb2+0mQfvK2Z0eqPjB4bmQC8QtLeOnNB7ny2GT6jcTJhi2Nbq8yVwW6xyGGi90WzTdZnQdOTENLgtublg+VFhW4P3ZrPeLqG84Vi7yf43HJHq3a3fOmHbd0NS4P3EjE5vdPzA0BzoBWJL2nlHX5NEQvl0cug49Z5ORusw0HqjSYEfaUqBINqW3Owea9THpj9Zb3dQnrIdlGD/QZBI9a7fYpawjW480P3EjE5vdPzA0BzoBULlTPTVGhl37+s2n4HbYpXDQOuNJr36JU2rNJwItyU3X37XyFO40KIFmfXGc5KDqa4i1fvRZ4zE6Oknr8H7iRmd3uj4gaE5VFggbtai3H4OPqkkcx4YyFb0hHI0DkMFvZGkwx90s0F7s1Q62EMHQB58arCliYNZbzz3Hbro2EGLSPQ+ecYojfi3SsPgfcSMXm90/MDQHCosEK0CufZGT94Jn1SSu/ZlK58yJBqHoYLeaD79ygSh7cZUdQ6CyBQ1JZ8fzXq7iDlrnttdESQSvWWtYnrqjO4jZvR6o+MHhuZQYYGgPXbkjNp2Ww6fVJLy1c3bHdStUhKNw1BBbzTl3s7BidvgtkjKnHHvdFzEeruMN1/trzhm63Ui0fubuI3CJjoIgu4fZvR6o+MHhuZQYYGgPXaq7cv69Fsji3//eHXrFEfjMFTQG80Js/YqVxHkoy+XG0HpGOuCUtZbDcrDPT0GbbD1OpHoLYNSPgCiLzkAZJiGCgtEzn1ZqhwEkRUZnKrj6ZTDUEFvNGUC3Merx8NtkaxU39gHm5Jq3T5Y1lsNyvQ+9ZrPsvU64epN+5sfeHKwZQnHmRhyAMgwDVUWiMoNJjqWLysUc+7bOZfhHgfJAcEtfQtUGCr0PXH6e7g9lCTYjoMprLcaPBU4cFGg/BAx9uy6Trh6p+3JUr4GOzM8vdHxA0NzqLJAdOyRLJxSv5H4V66Hjl4WthR9Vp0nRFY5DFX0RpOSLZPGsxcfgttCZRDJFkoazHq7k/S0mTQ+cOSSbdcIV286bEe2tPxUveT7zMj0RscPDM2hygIxbcEB4ZRe+2Au3JZZSYeELY0+xNtitcNQRW80ew1NERp37r0GbsuA+K3Clo+/SWa9Xcom7RYIjafM3W/bNcLVm6oukS2jFMq6wIxOb3T8wNAcqiwQlIyUnFLBikNtfU0SDr/sb5RI6hm3Ed4vVjsMVfRGk/Z2ksbPN54Kt6Vx2/m2BAestzqMHWVPkB+N3pTaimzZsScL3i9Mc3qj4weG5lBpgZCvSfYevAi145WW7iyRxAHBLWZduCGSfFOy76tXf4XaUrTaSDHeDh65zHq7lKtTTgmNn2002bZrhKM3HfogO/76RJw4DILuF6Y5vdHxA0NzqLRAUA40ck5jpu+G2lGosjtLJHFA8FuWe3msUYFmx3mYDcdPXbtZkcHqJ9+stzqkTAd/KNbfd09MrG03HOHovTBwIpkTQOtPDgAZpqHSAjFs/A7hnD7ovBRmg5tLJHFA8Ft+2GWZ0JrGHcoGOoRCNjR4fzbr7XJWqDtOaL0lzZ4bjnD07hbY3mJ3TkKm/eQAkGEaKi0QqTszhHN64sUxMBvmLjnsSM4ulMNQSW806Ukzaf1upySYDV36rBU2fDckhfV2OeUNx4gJabZ8fzh6y/ymS1alw/uDaV5vdPzA0BwqLRC0J+X+snG+Ox/D5d+jTdrkIPsM3wzvDzschkp6o7l7f7bl9XcjZa0mxoK8dPVx1tvlTJiyy9b0K6H0vnbtV9+fSw8Ue18zs67D+4NpXm90/MDQHKotEC81mwE9gCH3hW1MPQvvCzschmp6I0l77h58ykj4ffrsD45fnxbk+8oMEjc8dizIrLda3LnXSMBc4jl7bjhC6b01zXjD8tRLY+F9wbRGb3T8wNAcqi0QyCLlZ879IBZjegpJizO6L+xwGKrpjWbd5kZN1PnLjjh+7W27Mm3d8sB6q0W64fh7pWFC88PHrD3xHY7eco91667L4H3BtEZvdPzA0ByqLRD0KoycVE1AfrYZCw+Ka1MaGHQ/2OUwVNMbTdoML244+jt/wzEoIVVcm/aGsd7e4NsdFgrNE6dZn+kglN4yy8LY6Xvg/cC0Rm90/MDQHKotEJSf7feP9/PdG2NtXdRw2O6rFcJBUmUGdD/Y5TBU0xvNxavSYTccMt/k9AUHWW+PUO4DpGDMab2L1xilRJ5VpnV6o+MHhuZQcYGoWG88ZB8evYpD54Wz22GoqDeS2f4bjruLDxCkmw+nrks3N7T/jzbkU3Je1tsblHXGH3l6uKN5H0+cNtJbFSg/BF5piWmd3uj4gaE5VFwg2nc3nsTRKzKnrinz/9GhALdmyOeAIG/Kk7hOHjxatdGoDPFMgwmst8con8TRoRCn9J46b7+45qut5sDbz7ROb3T8wNAcKi4QVBOVnNUbbeY5dk3pIBu62EFyQJA3KeUPad+h+0rHrvnVgPXiml37rmW9PUZKdE/aDxm73TG9W3ySJK45HJj0nGktOQBkmIaKC4Qsj/XAk4Mdq9NKJ+PomnGJzj11RDgMFfVGkyozkPalayU4ds1qjSaJay5fe4L19hjlDe5rH8x1RO+cp48PHLkEbz/TOr3R8QNDc6i6QFSqb+wDTN5w0pHrlaqZIK5HqTnQbbfTYaiqN5L0yr9gxaG2pefIzYzMn24edLp0+WfW22OU203oBtfKdFPB9JY3OOTj0G1nWkcOABmmoeoCIV+RfdF7je3XSj9x1RMbpDkgCE6ZImPU5J22X2vOYqPcICU9Z729SUrGTGMgJfWc7Xr3GrZJXKtjj2R4u5nWkQNAhmmoukCs33JGOK0n69iftX7i7L3iWm86uOcQ5TBU1RvNcTP2ODYGZLqh/vFbWG+P0o6Sk8H0fu7NKeJai1Yeg7ebaR05AGSYhqoLBL2WoydyTryWa/X5EnGdYS7fIM0BQXDm3HdqdxUY2mtI16LSXKy3Nzlv6RExBuq8Y91T4Lz0pu0GfyjW33dPTKzv4iX7thswnScHgAzTUHmBaPax8VpuxIQ0W68j0zLs2pcNb7PdDkNlvdGUdaDp6bNd1ziSfsXYblBhqO3phlhvdUm1nykwo32gly1KeJ+X3jMXGdWNqOQhus1Ma8kBIMM0VF4g5Gm5Bu/Ntu0a+w9fEtegU3Ju3v8nHYbKeqP5ea/VYixQeTi7rkElwOgaTdovYL09zqqvGSfBV66z5qBbXnq3+sJIOTM4cRu8vUxryQEgwzRUXiDOZfxo+2nJ3oEN0nbVY1WJHBDkT1mH+tlGk227RtP2Ri1YKgnGenubVH/ayjrUufWmG9oiVUaIa+w5cAHeXqa15ACQYRqqLxA13rB3A3OFuuPE9y9bcxzeVicchup6I0k3GXSzQTcdtHfK6u+nBdnJdDOst9pcnXLqZv5JK94+5NZ7x54s8f3Fqo+Ct5VpPTkAZJiG6guEfEJH5eGs/m66K5b7seze+K8COSAITdorRWOC9k5Z/d1rN512NB8b6602aQ/oY1VHijFBufqs1ptOmdN3f/TlcnhbmdaTA0CGaai+QFBiZnJidFDD6u/+bkiK+O42Xd3/+lc6DNX1RnPg6FQxJt77bLHl390mUG3m64H27TFkvfWi3HdKf1qt9wtNjRrXdOIY3U6m9eQAkGEaqi8QOfex7N5v7SldeerTqk3YqpMDgtCkV7N3PtbX95eyg3zZF25Y9r100vPBpwaL8bbv0EXWmylIqYBoTNCTQLOnwnPqTaeM7y4+wPfHEgN8WRaOY6Y65ACQYRo6LBB0QIOc5ID4rZZ9JwWT8vSvF17/Soehg95o1n57uhgb42futew7ZyUdEt9JNYBZb6Yk3eCWeSFRjI1VG09ZpvfIiWniO+u3mAVvI9MecgDIMA0dFoiFy48KZ0ZP7KxK1fJN3EbxnVSVAd0+Jx2GDnqjKSvD1GoyzbLvbPThXPGdwx1MNs5668GeAV/Utpu5vXo59X76lQniO+nGA90+pj3kAJBhGjosEP+/vTuPjaKKAzhePDAioFFIdGtI2e4WMB5BPFLjgUbjfQQjglECBFHwjImSioAcVpQjBGwEioIih4RGLCiKIgEKRQEBAQEtGiutBjHGP/QP/1l/v8dOM64Le8xu387O95P86Ozu7DCb997Mmzdv3tMWOqeztHakz8U2+/SfY7ZX/2kwbv86Bww/pLft+Kn591jX3tXmVvDO3d6f1v2u6ai5Haehy6Q34Y4vdza3zUXe2pr93QgnvTc0NLXd3fCyPaKwgwogPPPLCcJ5YOOBx973vK2G+PAIF1w+Le+zMRRSUCFIP4Y8U5ezBzZ0Jhvd1p1D3iO9iaTR77a5Jo8sX/WN5/TWp351W8+O/9j67yLyF1QA4ZlfThD7D/4aO71somlFOXDoV0/ben7yJ+YA+dgLH1r/Xe19wPBLetuOtesPmTzS4+qZni8SdGDpfA0tQ3oXRzhPn+v0l17S+++//4md3ae6XR82IuwEFUB45qcThE6fpQe28dPWZ70N7UOoA6/qdj76LDe3k/0SVAjSD3c+WbV2f9bbcaYa1CeAczXnK+ldfLF3f2vslB4vxzr3esV0Qcg2vd9dudvkNx0CxvZvIvIbVADhmZ9OENpfz2urjDM5uo6OH6Tbv84Bw0/pbTv0QkPzyoOjVmS9DZ1XWLcx1MJYk6S3v0IfOtK8Mn/xV1mnt7MNnUfd9u8h8htUAOGZn04Q2irjPLyx7IM9GX9fHyZxvv/G29us/x4bBww/pbft0FYZZy5qHVct0+/rBUb4mlnWWptJb3+FDjukeUWHhcnm4Y2tXx3v23zexVPzNnc6UThBBRCe+e0E8VrNJnOQu/WhzMe3cob30Ft7QRn7L/GA4bf0th23DHon6+FbtBUml3O9kt7FHe4L1JnzGjL+/uiqevNd/Wv7txD5DyqA8MxvJwhtiTmrYkrGQ3ToFbXTGvPW0h3Wf4etA4bf0tt2LIuPQRnqNy2jvll6Mnf6EGZ7S4/0Dl44Y57qEC6ZzODRdPi32LkXH59pRlsCbf8OIv9BBRCe+fEEMTQ+p+ojT9el/Z1Z87eY71xyc03g+v65Dxh+TG+boS13lffUmrwzYXr6Dx85rc29b5htLb+R3v4LzW/OHL6ZDEE0umq1+c5dQ5eQ3gEJKoDwzI8niK/3HDH9srQVMJ2BobU/jDOfcJAnRqdCkF1oHtO8c85Fr8a+P5x6IGdtudGHjExr8zJ7rc2ktz9j/eYmc2zrFJ0S2/vtLynX37bjJzNE1mkSB5t+I70DElQA4ZlfTxDjXv+8bXq4VB2mX52z0ax7xR1zrfTFKpSgQpB93PHIYpOH7n90eco8NCzeQq35zWZrM+nt39DxADUP6YDkJ1tP86LTT/XxMfWkd4CCCmBAVFRUjAyHw9emWi8SiYyJRqMDJCbL8oXpbNuvB4yWlj/aJlEfdZJOzxsaDse69H7FrFe3Zp/1/bZ9wPBretsObXXWsfw0H82Ye+IO+k6fQW290ZYZ0pvIJnZ9cyR2RniSeQr9ky8OnXA9vU1sppG79DXTOk16ByeoABa/jlKRe0IqgNulUnf9yVaU9SplvVpdlr+lsn5dOv+Bnw8Yn274LnZmZLI5AGqLYOLnetI+v++0jPsLFmtQIfAW2n1A85KemJN1JVi5eq8ZyDdVJZH0JtKJ5yaubet68PnG7//3uTNsjN7+Xb3uAOkdsKACGBBSmVuYqgIolb4XpRI4wvWdn9PZtt8PGNrion1f9EB477AlpsVPK35629dpsdEhY5gUnQpBLsI5KWs8OXZNbFPjD2a2j6rqdeZErO/rLeBC6GpAevs7tPvA4NErTJ7S6d1ekovcPftaYpu3/dj2vsbsBVtJ7wAGFcCASKcCKJ/Plhjset3cvXv3zqm2rQeMY8eOZya/xoKl29tu8ybG3UOXmOE7bO9jIYSmczGkt804evTP2PQ3N5s5qZPltxenfmbWsb2fpHdxhF5IPPzUyqR5TVubZ9VuIb0DGprOuahfoMCl2QJYE4lEBrpet4ZCoU7537sCUVp1Xknp+OklpRMOyMFxv/xdL69vtL1bKFKhcX0ln9VK7C25cPwRyW/zSkJjU/bTBbJSOq5SjmcrJZolv+2Q/LawpPSFtPp5AyhQUlG7Tip3jRJbXdHo7sOXwS3g4a7XLfncbwAAAORRsgqgVPbK3a+lwneVtgLqcjgcltWj9e25jwAAAMgRqeiNksrcPolFstw//nYHed0kr7smrFstlcBBElPLy8sj7b+3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAMVVRUjAyHw/+ZwSASiYyJRqMDJCbLMqPNFyFJ98vkz6k6XSBDBhUfynCwUJ6DI/GcTVlHNjpKZnlCMtN29yDT8l6lvFery/K31D0jCYqHpOsuSd9jEh+EQqFutvcHuUMZDh7KcyD875xNWYcnibOMxKeUG+H6/Gc7e4Z8knQeYnsfkB+U4eChPAeH+5xNWYcniRVAWZ4tMdj1ullvK9jZO+RLfLaY2+VvVVlZWW/b+4PcoQwHD+U5ONznbMo6PEnSAlgjVxQDXa9bQ6FQJzt7hzzqoP9069ati6R/o+2dQe5QhgOJ8hwQCS2AlHUkJ5nhOj0YSGx1RaO7n8AJbgEPd71uae/9hncnSHuNuvLy8vvk85nxVU+R9/6yurPIKcpwsMTL84z4S8pzkUtyC5iyjuwkqQBepVcVuhwOh+WjaL29vUM+yAnjJknbK3W5Z8+evSSN19neJ+QOZThYKM/BklABpKwjO3LlMEoyzD6JRbLc3/V+tWSqQfF+JQwpUIS047BeOUraT+KpweJDGQ4WynMwJDtnU9YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACARP8CQTz78NGAmV8AAAAASUVORK5CYII=\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAG4CAYAAADVDFZ+AAAgAElEQVR4nO29WYxd13Utep0A+TCc3Adc6YfOA2w2Sv6CC7wYMJBc5OUvf4E/DPs+IB+GESDPyItki5JIqqNIUaTYFPu+7/u+7/tiX+yLPatYrCJZp62WkmWx3p5r7b3PYbFOnX12N1czBjDEKrFYZ+0995pzrrXnGvO//TcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADASrzzzjv/PnTo0H8Y7GeGDx/+4YgRI37hcJzz9V+nNTYAAAAAAAAgXvyFk8z9zkkALzqJ3f+q9EPOz/zc+ZlF9LXz54+dn92S3hABAAAAAACA2OEkdMsGSwCdpG+0kwT+tuznW9IZGQAAAAAAAJAIqiWAzt/NdPjrsu+fvP322z9KZ3SAruj9f8f/ny/fnbis991Jl3vfndjS+97Ezb3vTvg597gAM/Hyvyb+w8v3Ji50nrdW57m76Xy9uOc/v/qf3OMCzETXu1/9s/OcHXF423nWGnvfmzSl83cT/gf3uACgJgTYAZwzfPjwX5Z93zZkyJAfVvu9r1696gPsxHf11/peflTX9/K9SW/wj+v39r36Hs8GEA/Iz3x38OyAz9rL96f0fXemoQ++CIgLr775tu/bZdsGft5G1fX9qaGRe4ixIK78AlAcAV8B/6bs+9Ygv5ceomy2sy+TAU0n2dmzd+HwBd8hdi7f0Ze93dSXfdTWV9x5oq93lEwKO5ft6Mu0d7CPG4xub9axOM9Q56rd4pnq/cPkvuL2Y33Z+0/FM9ex8aD/HHZsPsx+z3SmMvbm5otiX9ec9fJ5Gz2jr7D/bF/2YVtf7tbjvs6FW/znMH/uJv9YI9o7jtwC0AD9E0An2RtW/vdOwvcz2gWkr4cOHer86IidQX4vOQx6mNrbQdNJdibkrtwVDpAcYf7YpTd+Lnv9oZ8EFp2gzD1uMJq9ued34cA5GXQ/quvLXbj9xt/nzt7o631/ivgZ+pr7vulKVezNzY4Vu8Sz1PPp7L7M/dY3/r6444R8HkdO7ctefcA+3ij2jjfLAJSEk+z9h5PQ3XS43Pn6n5z/9QPn6wfO13/V7+cmOEngrxxOHDZs2PAgvxsOwx6SnV/1vOzrGTNTJndbj1b82ezV+329v//acZJT+jIP2tjHDoazN/f8ztxp6ev9YKpM7upvVvw5P0kcNX3AoA3qYW9u0gLDW2xkbz4e+OdedPR1rNsvfq77y4V97c8K7OMOa+8k8g3AItjuMGwi2fmP2w4Lx0evSMgRDvbz3kq6c+l29rGD4ezNOr+d56t7ynL5enfVnqo/27l4q3ze5m1kv3c6kt3e3KTnbbJ83gr7zg7+s8+Lfd0Tl8if3XmCf+wh7c2dPwCaw2qHYRmzjc19L/8wWbz+zdxtqfrzmUfPxe5Nr+MkszcesY8frI3cCUH+ZIN8FffF/L721lz1f/MkI3YA6d9kG+6x3z/dyG1vbubOXJfP2+dzA+3q0TMmdgsdH6fjrjMSQCAybHYYttErjO7YcCDwvyluOSJ3DGesYR8/WBtZEwLaYflyoawzPX458L+j3RjxvE1bWXWHGlTI3tyk3T93Ry9/+ELgf9exYqe7Q72b/xpC2Js7fwA0h7UOwzJmbzfL05Yfz+zLPM0G/7dPc309H8+SNVznKtdwgeqRMyGgpM+vsXKSwcD/tjUvivdlzSAOhOhib27mT7i7zePm1/S8Ze49FW84ej+c1tfeUoNfVIBIAIHIsNVh2Eav6PmPO47WbO/CQVmg3z1hUW3BHGQlW0JAuzHj3d0/JzDX+u8LB+pLdaoK3EddaG0CSLvN4xfUvNvs0XszUthfz38tNdqbO38ANIeVDsM2thX6ekbPEE7u+xfZ2u1d/jrv6JuyMaCa5EoIslfulWr/wrzGbcnK2tPffy3qULnvoy60NQHMH7lYWqCGeN5Iekj8+68Wa1V2gAQQiAwbHYZtzB+/Ih3ctJWhA4T3O1ALqA+5EoKOlfL0eHHbsdC/o3OJ7OJQ2HWS/T7qQisTQCdh6xk7Ty5OT18L9zucBW7P2Lmy7ODKXf5rqsHe3PkDoDmscxgWsmvGahlMj10KHyBa86JOBrsy+pAlIWgr+Cd5qb4q7O/JXWws1RBqtCtjnb2Z6e02U8lBlOek6B4+Iiki7muqxd7c+QOgOWxzGLaR5F6kwG5dX6YtHylA+Lsye06zXxcYwPYMCUH+1NXSKd4ov0vs7MhdGRIl576XOtDGBLBjzd6qovaB7l3Ti77e9ycLZh7rscBFAghEhm0OwzYW3V6rHav3Rg4Q1MlBrLYnL2e/LrA6ORICEnEWi4SD5yL/Lk+CiF4pc99LHWhdAkiLhE/kiXHSOI36+zoXywVuccdx/msLaG/u/AHQHFY5DNv4rOBLuFBbpMgB4lnpMEnmbvjXe2A6TD0haG4XIuPU15dEnSOP/95Tv61Xe1ue/X6qTtsSwNzlO6XDGzH8Pv/wEglJa6B2gAQQiAybHIZtpKJo4SC/XuY7jKj2JsFUsUreHr7AH0yHaScEJKMh6qgWbIrtd3ZNXx1a3sM22pYAdqzeE/mw0Wsk+SInmazWt1oVIgEEIsMmh2Ebu2avf+11XBwBInf5bqk4X4FrBCsz7YSge8oKGTzPhDyNOQBJdkjUFM5cy34/VadVCSCd3HXfbmTuPInt9xZ2n3LLDtTvDIIEEIgMaxyGbXya84uaPYX7WAIE1d18Nsd/rcx+nWBFppkQeIeNqEQgSB/WwGzNydPnFOgftLHfU5VpUwKYu+S+/p24JN572Nhceg2s+OlzJIBAZNjiMGyj1xi9XLcvrgBR3HBAvnrZeJD9OsHKTDMh8A9srNoT++/uWLYDp88Vszc3aYcukQMbZbqC2VtN7NdZzd7c+QOgOWxxGLaRArEImrtPveYw4rB39sYjbVbJNjPNhMBrxZVtiF+yxZeWmY3WcKrYm5X0+nfMTPcwWkvsv58UE4Tv3HmC/1qr2Js7fwA0hxUOwzaWr2Jvl+QRYgsQZb1e6eQc+/WCAzKthCBzv1UuCD6elcyC4ElGCJBTezgSmua+r6rSlgQwd+G2fP07aWkyv/+clLvqqlvFfq3V7M2dPwCawwaHYRupKHqgHbo4A0Rx82H5Csb5k/t6wQrPQUoJQf7QebeLwrbEPqNrqnvA5GIj+31VlbYkgF6rwcR26Nryfi/qOOSMkrQ3d/4AaA4bHIZtLOw9M6CAbpwBwivCpsDMfb3gwEwrIehctEVKtRy5mNhnUKcH1J2qYW9WCvHnWZFbDVZj1xypoJA/0cB/zYPYmzt/ADSH8Q7DQnbNWjdgc/RYAwT1fB05VQj/0olj7msG32QqCQEF5DGuOPjD5E7pUm1hEqc+TaINCWDWO6X7xfxEP6dwwNW0XLqd/ZoHszd3/gBoDtMdhnVszZcSM1f+pdxhxGlv0mYTr+XO3uC/bvANppEQeAeCEteFfF7s6x01XSaamvRqNdHe3CzsPyvfbqxItj2gX9c6ZqayB92QAAKRYbrDsI2DFTDHHSCKO09IZ7xuP/t1g28yjYSgsOukfAbW7E38ejoXbJY720cvsd9bFWlDAug/Ayl0humesEgedLv6gP26K9mbO38ANIfpDsM2dqzdJ2ulBiiQjjtAZK89wGs5hZlGQuDvAp+5nvj1UEcb8VpuSXKHTXSm8QkglRt4vcgfJb8LXNxwUPrSLUf4r72CvbnzB0BzGO0wLGT3uAUVu3TEHiDEa7k66ZCbXrBfO5iwvfuzvA60X7lBIteTtNyM5jQ9ASSfJhac49NpQ5m7fOe1XuqqEQkgEBkmOwzbSKfiRID8ZPaAATKJANE5b6Pyp+VsZdIJAUmypH0S3BecRhvC1O3NTeoEI7vNpNSnt3yBq2DdKRJAIDJMdhi2sbBfnlyj1lmVHEbc9i7sOzug5AzIz6QTguKmQ6m/IqNaQ6EBt+sk+/1VjaYngP5i82R6i83OBZuUXeAiAQQiw2SHYRur7cYlESCo00gasgxg7Uw6IaBXY2l3g6ET5/17XIPp2JuVLzpKp8BTLDfxdx1TOOQUxt7c+QOgOYx1GLaxvEC6goNMJECUC7M+SE4HDqydiSYEzZm+XsfmvR9O62t/lmJ7tqc5UXPY+/6UvvZW6E+mZm9mZq8/lPV4Exal+7lXHyTadi6qvbnzB0BzmOowbGPmTkvVnbikAgS1ABM7j4cvsN8HMHl7E+k1nDiRO3dD6tdFEkfi5PGF2+z3WCWanAAWdp/i2YlzFjd+WzjFBO+RAAKRYarDsI3UhquaREZSAYISP8hzqMckEwK/H+veM6lfV3GT24d62zH2e6wSTU4A/dZs/bobpfLZ3oJDsT7USACByDDVYdhGPyAfqB/UYSRhb1+eo8LpY5CHSSYE1PlD1P/dakr9uvw6wNnr2e+xSjQ2AaTTuB/ViZIDKj1I+/P9w06KLTiQAAKRYaTDsJDdXy2uKo+RZICgV8+iDrCxmf1egAnbuyUr6/+coMyS8De1ywXH6BlYcKRhb2b6dXhMgvP+gmPWOvZ70d/e3PkDoDlMdBjW0QvIVJDvrJYHcxiJvRJctgN1gIoxKXtT7R33SVx/wXHnCft9VoWmJoDsLSebM+LzSRNQpQUHEkAgMkx0GLYxdz5YQE4yQNCrZ6kHmJJIK1iVSdm7uP2YfCW26RDbtVG9qVhwHLnIfp9VoakJYNfsdam1G6zEUsmDOgLkSACByDDRYdjG4tajMiBvPlzVYSRl7+yNR8rKJdjKxE59z93AHpAL+89iwZGSvbnZ8/FM9naTHSuq11hz2Js7fwA0h4kOwzZ2zVorA/K5m1UdRmL2flbWF7Ytz35PwAR1H72AzNgey9eFY6oLU5EmJoCZR89kvednc1jHoaLSARJAIDJMcxjWkRTyP5L9KtufDH5CLukAQT1h0+4MAaZrb7/f9Ni5vNdHJ0MV1Wczyd7c9A5gcOhNvnZvPZ3VsfPY70m5vbnzB0BzmOYwbCPJcIidkC8XBnIYSdq7Y+0++Zpkz2n2+wImY+/88SsyIC/cwn59vj7bpTvsY1GBJiaAJL2Sdr/pAUk732P4d77725s7fwA0h2kOwzYWDp6TtVDLdwZyGEna208OFm1lvy9gMvb2k/zdp9ivr7jxoEwOdpxgH4sKNDEB7Jy/0a03TV8A+o2xeL3WT11lH4tnb+78AdAcpjkM29hZg/xK0gGi9HpQndckNjMJe3dPWS5f8zfwv+anrhAqvB5UhSYmgD2fz1Wmz3hh10leOZoB7M2dPwCawzSHYRu7xy+QATmAAHPiAYJek4yeIesRm9rZ743tjN3edNDn/SnKHPShV3FiwfHxTKX02YyxNzdd/T1VBL+ptlmU20xezj4Wz97c+QOgOYxyGLaxud0VKJ0eyEGmESB8za76wU8kg8kzbntnr7kdGb5exn5tHukwitghuveUfSzcNC0BpN673ILjr7GtbAHUqsACCAkgEBUmOQzbWOqJGqxFURoBwtckdP7kvj+2M257F/aeka/AVu9lvzaPnYu2yBKIY5fZx8JN0xJA75VrccMB9rF49Esgrt5nHwsSQCAyTHIYtrHWJuVpBAja+aslKQWTY9z27lzsdt84eon92jz6SekadZJSU+zNzc7FW+XzdvwK+1g8dqzaLQ9B7ecXhEYCCESGSQ7DNvoC0OdvBXYYidu7qV2puh2bGbe9S/13W9ivzWP2qnqvpU2xNze7x8v2a5lGdfo9Fw6dlwuOFbvYx4IEEIgMkxyGbay1RVJaAYJOAaMui5+x2lvVxF50oFHnYIox9uZma06IfPd+OE2p583vQKNAy0skgEBkGOMwLKPfIunT2TU5jDTsTTqAqr26sZFx2jtXX1u9aZqkU5miLuvaA/axmGJvbpLMkHjepq5gH8trpIMgzmKDDoPQ4oPb3tz5A6A5THEYttE/ADJnfU0OIw17UycQ8Zpk7T72+2Qz47Q3dWJQ9XBPx0q3LuvgOfaxmGJvbhb2nVW2tpP6T4sFx83H7Pbmzh8AzWGKw7CNxe1ui6TNh2tyGGnY29PLUm71bhnjtDctNKS8zw326+rPwgG3G86qPexjMcXe3KTORkEF7lMfWw3i+0nbmzt/ADSHKQ7DNnYu2FRzW6LUAkRbXr4mGcn/msRmxmnvns/myLrOR8/Yr6s/SZIDCw6zEsDuSe4u241H7GPpT1V2J5EAApFhisOwjWEOWqQZIFR5TWIzY7O3KzjeM0axAyAeFT0woK29uSk6zkwWVHEB6b/hmLaS3d7c+QOgOYxwGLaxJet2AKmrKeClGSA6l25XTjPONsZlb+U6MgxAXzJEIYkaXe3NTdr1U+Wk7YB86iw4yP8yLziQAAKRYYLDsI25y3dkQK5bVbPDSMvehd2n5GuS9eqo+NvGuOxdsuV+9muqRL8jyMkG9rHobm9uUm2d1NrbyT6WSvR6sGfu8GkUIgEEIsMEh2Ebw56yTTNA+LtGM9ey3y9bGZe9ddjNLe48IQ9FbTrEPhbd7c1NajUou22cZR9LJfpSVyf4pK6QAAKRYYLDsI1+QD5ysWaHkZq9PeHgj2ex3y9bGZe9/XrOW+rWc+bO3XJ1CoPLIplGUxJAOswjnreGe+xjqcRSn+KDrPbmzh8AzWGCw7CNYQNy2gGCRKrFa5LHz9nvmY2Mxd6KF+T71+o8Y7UKo5tGIxLAFx19vR9MFYd66HAP+3gqMHfhNvsbDiSAQGRo7zBs47PwSvRpBwjqGlFLr2IwXsZhbzrFLQrynUUH9/VUY88ns2pqjWgaTUgAM43N8nn7ciH7WAZlM39rRCSAQGTo7jBsY5RelGkHiOLGg7KWZ9dJ9vtmI+OwN9X9kQ07l+1gv55q7JrlLThus49FV3tzM3/8snzeFm9jH0s19nw+Vy44HrSx2Zs7fwA0h+4OwzZGOSGXdoDwnfkS9Z25iYzD3h3r9sskfs9p9uupRtsXHCYkgMUNB6QNd59iH0s1ds7bKBccZ66x2Zs7fwA0h+4OwzZGOSGXdoDI3nZf53y1mP2+2cg47E3afyLIXWxkv55qpBOZcvdoK/tYdLU3N3V63orb3HacW46w2Zs7fwA0h+4OwzZGOSGXeoB4XhS1ilSzqPIBAlMZ2d4vOkT3D3re2psz7NdT9Xobn+hRP6aqvblJz9to93l7ov7zljt7Qy445m5gszd3/gBoDq0dhm2kE3IfThMq9KRGH8ZhpG1vqlVESzgeRrV35uEzWej+2Rz2awlEWnD4J0jz/OPRzN7czNxvlc/b2LnsYwk03ke88wMJIBAZOjsM20htrsQOx/gFoR1G2vbuWLYjlGYhGJ1R7Z2r593hCMPuKcvlguPaA/ax6GZvbuZPX5PP2/xN7GMJSn+HnGHHEgkgEBk6OwzbmD/RIB3koi2hHUba9va7lijcRsxURrV3ccdxWeO0+TD7tQRlx8rdskb24Dn2sehmb25SLZ143rYdYx9LUFI7Ti7RaiSAQGTo7DBsY3HTYekgd5wI7TDStrffEm7GGvb7Zxuj2rtzoX79dQsHzskFx6o97GPRzd7c7JqzXh4Aqb/BPpag7Fi5S86RQ+dZ7M2dPwCaQ2eHYRs753uyA9dDO4zU7d2ckXUyY2ay3z/bGNXefsP7uy3s1xKU2av35YJj6gr2sehmb276nYMe6dM5qLD3jFxwrEv/DQcSQCAydHYYtrF7/MJIAZkrQFCRNFrCpc9I9m7NicMUdOiIq9NBKOo6bm57c4+96YVcKH6iV+9wvyXc7HUs9ubOHwDNoavDsI5eC7iRU8Rpx7AOg8PeXbPdVzvn0BIuTUaxt7eT1j1Fv520ni/mywXH/Vb2sehib26Sb+BKpCLdc+8k8Ofpn1xGAghEhq4OwzbGIarMFSCKmw7Jwvyd4WoXwfTtTYcoZC3dbvbrqJV+Ldm5m+xj0cXe3KS6ZlHf7PgK7rHURJLm+qhOngQOIc0V1d7c+QOgOXR1GLYxf+qqPAG8MNwJYM9hcNjb9g4NXIxi74414TvOcFOndmKq2JubnQs3y8MUjp/jHkut9KWHrj9M3d7c+QOgOXR1GLbRbzu09Wgkh8Fh72yju3s5YRH7fbSJUezdNXOtNi25+rPUL3sX+1h0sTc3/df2956yj6VWdix3tU6PXkrd3tz5A6A5dHUYtpF2z6JKcrAFCOrQMBIt4dJmFHvrfHAn2+CeBJ62kn0sutiblS1ZYa/eUXVaHtwp7DopF+cbD6Zub+78AdAcWjoMC9k9cYl8zXCrKZLD4LI31S6KhKKxmf1e2sLQ9n6acwPydC0DMnVlEIX5o2fwj0UHezMzd/mOTNinr2IfS6jxM3XMQQIIRIaODsM6UqHxSLfHaYQdNM4A4YsKn77Gfz8tYVh7Uy2TPAG8nP0awrLnE1dTrukF+1hUtzc3/W5BDFp6sdx3r4fxuPmp25s7fwA0h44OwzZSXYwIyOPC9QAudxhc9vbbPO04zn4/bWFYe1MtkwjIy3awX0NYds1YLWsYL99lH4vq9uam303j8AX2sYQiLdA/cBfobemVuCABBCKh992Jv//uxEXtHIZtzJ11XzHM2xjZYXAFiPxx9yTw0u3s99MWhrW313JQZ9mejtV7rOsJrGsCyNlPNy52T1oqr+Hm41TtzZ1DABqj971JmZfOqiXzLM8+gcDKjKvImDNAZG88kruYk5ex309bGNbenfM3RWo5qAIL+87KXcy1+9jHorq9udnz8Sypo9ecYR9LWHYu2SZ3MU9cSdXe3DkEoDF63510Waxaboc/WAAmz7hkBlgDRGu+r5cOFnyk50k/HRnW3t1fRms5qAJJvkYcLJi1ln0sqtubld6BnY9n8o8lAqm0RSzStxxJ1d7cOQSgMXrfm7gOhfnq0xcavRZNaJQ7QPSMnes2e3/Gfk9tYCh7k2QPtRx8P3zLQRWYefScrUWXVvZmpi/ZU6fnCWCPFENFicuCzanamzuHADRGz3sTx4pVi8a1PsaTCoxHxdNqiDtAdM1ap624sI4MY+9M4xMzRLtjnDe6kHt+h6Ev2r1Sb9HuzB133ny5MFV7c+cQQAoYPnz4hyNGjPiFw3HO139d6efeeeedv3P++PO33377R8OGDRte7fe+fPer/0esWpbre9rPdMa5k8EdIKgeS9f2YjoyjL1zZ9LfyUiKXC26dLI3N6mu2Yi2fbRz/r4rdp/SzjkSQAvgJHw/dxK7RfS18+ePnSRwS6Wfdf6uwfmZrMNtQ4YMeava7+75r6/+XqxaLFPM14m5C7djq2XiDhCFA+fkan/1Xvb7agPD2Lu444SsZdp8mH38Udm5jKdFl0725iYpG4i3AvU32ccSlbRrnqbYPRJAC+Akc6OdJPC33vdOktcyyM/+Wy2/u/Du5/+HCQW4JjPO04zcAcJX/J+xhv2+2sAw9iaZHpE0Hb/MPv6oJBkbkcxuOsQ+FlXtzc3u8Qu07QHcn77Y/amrqdk7Sm4BaAAn4Zvp8Ndl3z+hV7wD/ayTAE4cNmzYvzh/jvrJT37yt0F+/8tP5BH8TEtGPFCgWvT1zA6di/y7slkZIOhPlutpeiFfZ382h/2+2sAw9iaZHrEjc/MR+/ijMn/2ulxwzN/IPhZV7c3K5wV54GjklL5Mewf/eCKyuPWoXHBsP5aavePKMwBF4SRzc4YPH/7Lsu/bhgwZ8sMKP/4D+s9bb731l06iWB/k938zc414aL9/0tYHqIdv58iDE98/auEeSmS8evWq7+WYGeJ6Xn3zLfdwgH4Q9qGDE7937PPtH7mHExnfZ/LiWftm4mLuoQAD4PsXWWkfZ9FhAv7UIKWHvl21K7XPjCHFAFSG+wr4N2Xftw70c8OGDftX5++mut/+mZMA9gT5/X9ct1fuMB2/xL6CAt+kJ5KaedIey4qRwLlD0D11hdxhuv6Q/d6azlrtnX38zD9wxD32WPiiVJhPu03s41HM3tzMeweOFm5hH0sczN1ukieBJy5Jzd4xpBiAynCSup/RLiB9PXToUCevG7GTvnaSwmHlP+ckgP/s/P3f09c//elP/8b5uYNBfv93h8+lLmAJBmRzvCKp5DQI9CfXNcUlag3Gb+/SgaN17GOPi91fLZYngVMqzNfJ3tz0DxyZEnueFUQ/4N6RU1MRuyc7x51vAArCSfYmOEngr9waP5J3+YGT4D1w/v9f9fu539JuofN3XwQ5BUz407W7chW2aAv/BAJfY/bKvVhFUlUIEH5bu036nzJVnbXa2z9wtG4/+9jjYtqF+TrZm5smHTjymOahFiSAQGR8/0zuMlEza+7JA77OwqHzrkjq7tgcBneAoP6yYsExfxP7/TWdtdrbP3B08Bz72OMi7S55hfncY1HN3tzsnmyeTqMva3P2Rir25s4fAM3x6o/fyR6tH05Dj1bFSDsxIiDvPRObw+AOEJk7Lakr5tvKWu3dNWO1DF6X77KPPS7mT1yRC47F29jHopq9WWlopxaSHBI+O4XuWkgAgcggh0FF37JH63P2CQSW2DXbbZ124XZsDoM9QAjF/MmCOvea1YG12rvn09nSDzS9YB97XMzefGzNGw4l5nfQsT5+7ktCcY8lTuaPXZILjmXJd9dCAghEBjmMrplrZaJx6eglyUQAACAASURBVA77BAJL9BPzh89icxgqBAhfMf9OC/s9Npk12btFSnL0jJ7BPu5Y2eYW5n+QTmG+NvZmJsUaUd88M3qHI5VIr7PFgmPyslTszZ0/AJqDHIaJtT/aszUnX81/VBdb4FIlQHQu2CQXHGeu899ng1mLvbNX78uAbGBbyJ4v5ssFx/1W9rGoYm9uFg7Uy/rmNYa1hfT8dgolVUgAgcggh1Hce0ZOxvUH+CcQKFhaSS6P1WGoECDoBHBadTI2sxZ7549clD5gxU72ccfNrjnr5YLjnP79ZuOyNzeptaXwAfvPso8lbvaMnee+uWlL3N7c+QOgOchh5M/flHULczewTx5QknTy4q4lUSVAeHUyHSnUydjMWuxd3HhQBuTdp9jHHTeLGw4Ye21h7c3Nrllu2dHFRvaxxH5ts90Fx/lbidubO38ANIdQjr//VO42jcfJTFWYxGkyVQKEv7s5Jb7dTTCavWnxJ4JWffLyFWkzf/iCK6e0i30sqtibm6WDh/HUN6tEepMmfPee04nbmzt/ADSHcBgv3JOZf8DJTFXYOT9+PSllAsTTnLi23lHTjS/M52Qt9u4el56AbdrMNphb3xjW3qxszcde36wS01pwIAEEIsNzGKTLJgLAXfMCgI70FeVjtIdKAYLkH8T1PYb0UFIMbO+UW1ilziduS8Uxhp1wDmtvZvrSPF8nf1KW5fpSOlCFBBCIDM9h+Arm9WYXSmtBCsh/mOwE5Cmx7siqFCAgPZQ8g9o7e7vZb2LPPeak2POJ1Dhsb2pnHwu3vbnpi3MvMVSc25VUSvoNBxJAIDI8h+EXSidctwBWZ1IBWaUAQfIP4nk7UM8+FlMZ1N7UJ9f0fuBd083rchLW3twsbj3qtuc7zj6WpOiLqif4hgMJIBAZnsPw+86u2sM+eWxn/mRDIgFZpQBB8g/ieVu7j30spjKovYvbjsmA7ARm7jEnRfJrpmudqjS/ByP5NbIFLTy4x5IU03jDgQQQiAzPYeQuu8rsM9awTx7bmVRAVilAkPyDeN5mmdUJQCUGtTf1yRUB+UQD+5iTYmGf+QsOleb3YKQ3G2QLetPBPZak6L/hSFDnEAkgEBmew/B7M34+l33y2M7ORVtlQD4Zb0BWKUBQ32k8bwnf44D2pj65IiDfesw+5qRI/bRNX3CoNL8r8kWHaMtHh46o1pl9PAmxcOCcXHCsTu6NGhJAIDJ8h0ET86M6cTy/vS3PPoFsZmmF3BS7w1AmQJQ/b605/vEYyED2Lg/IbeYGZNKbM33BodT8rjTG+63SDuPms48lSVKtqXyjtjpRe3PnD4DmKHcYpZ2AeBMPsAZSQB6ZzApZtQBBDdPF83bjEftYTGQQe2cetMmA/IXZAdlbcIiTwE/NXHCoNr8HYu7cLTu6TjW1y3n1yaxE7c2dPwCao9xh+K8eDS7OVZ0kxCtOAI9bkIjDUClAdC7dLp+345fZx2Iig9jbC8jUL5d7vEmT+mqLBcf1h+xj4bI3N0llQtQ3bzC/73zPmJlywdGcScze3PkDoDnKHUZxyxE5OXfE134MrI3U+UOskOdtTMRhqBQg6DkTz9vmw+xjMZFB7O0FZGpfxT3epEl9tcWC4+gl9rFw2ZubHSt3SxscvsA+lqTZVbdKLjiu3EvM3tz5A6A5yh1G/thlGQwcR8k9eWxlYddJmRRtOpSIw1ApQORPX5PJ7sLN7GMxkUHsTe2qbAnI1Fc7qbmlAlWb3wOxa3qySZFK7Fglk12SWEvK3tz5A6A5yh1G9tpD+Tpo6gr2yWMrOxLcpVAtQGQaXcHrrxazj8VEBrF30rsUKjF35rpccMyPf3ddBao2vwci1cSZ3pHFY2HvGbmhsm5/Yvbmzh8AzfGaw3Bb2FDtAvfksZVJ1ikpFyASankHBrd3z8fJ1impxMzdFrngGL+QfSxc9malJT2ZPSYtPYQEEIiM/g7DDwhPzA8IyjHhk4oqBggKxqJl0t2n7GMxjVXt3ewGZGfOc481FTqLjN73p4hFh4kadCrO73Jmr96XCdG0lexjScUe3gn7sfMSszd3/gBojv4Ogyan2IG6+oB9AtnGpLXKVAwQdNhFtEw6e4N9LKaxmr3pta8IyHWr2MeaFqncQPi3RvO6UKg4v8uZP3JRvhJdsZN9LKkwQUkvz97c+QOgOfo7jI7lZp+UU5lJt0dTMUAUNx6UhdK7T7GPxTRWs3fe6/+9chf7WNNi50Jz+9CqOL/LaeNc756wSL7haHySiL258wdAc/R3GMWdkObgot8+aM3eRH6/igHCul2BFFnN3iT9IgLyntPsY02LvtTV9mPsY0nb3ty0cbefDhwldc1IAIHI6O8wStIcW9gnj23sWL9fBuS9ZxL5/SoGCCo1wMnzZFjN3iT+LILT+VvsY02L+RNXpH9bvI19LGnbm5s21vsWNyS364kEEIiM/g6D+s+Kk3KTlrBPHttI7ZFEQK6/mcjvVzJAeCfPR9txMjBNVrM3FaeLgPygjX2saTF787H0b18vYx9L2vZmpXfi/327TvwXvDKLVbsTsTd3/gBojjccRpszUZ0HtvfDaaKIlXsC2cTuL70Vcksiv1/VANHzyWx53U0v2MdiEge1d1teFKf3fjDVrnn+NCeetd5R0/nHkqa9ucfW+EQm3hMWsY8lTeYu3ZFvOGasScTe3PkDoDkGchg9Y+fKgPzoGfsEsoZ0YsyTqEhohaxqgOiasVrufF6+yz4WkziYvf2dsElL2ceZNr0Fh2lixKrOb2LujFtatMCurj9JKjsgAQQiYyCH0TVzrQzIzuqFewLZwsz9Vukoxs1P7jMUDRAdq/bIOpmD59jHYhIHszedghUBedFW9nGmTb/7SYNZ3U9Und/Egq2HC2lh/+E0KQXTFq8UDBJAIDIGchgdq/ciIKdMXzV+9vrEPkPVAJF0yyRbOZi9izvcgLzlCPs402bH8p1GSl2pOr/FPfdaXB4z654HYffEJXLBcTte7UkkgEBkDOQw/IC8HgE5LRb218t7vnZfYp+haoDInfeS33XsYzGJg9nbZr1PU6WuVJ3fxO4pKxJrcak66bW3eKN25lrs9ubOHwDNMZDDyJ27JV8Pzd3APnlsIe1+iV3XfWcT+wxVA0Qar79t5GD2Lr0Gvc8+zrRZev1tltSVqvNbvAYdNT2xFpeqs7jpkPTtu07Gbm/u/AHQHAM5jMy9p27T9AXsk8cW+pps55LTZFM6QCR8AMZGDmZv/yBEs1kHIYLQ1AMwqs5vOt0vFnifzWEfCwfzhy8k0nEHCSAQGQM6jPKm6QjIqZCSbXHy+l5yIqmqBghx/V/aJxKbNCva22AplEBsda//ozqjJHBUnd+5y8lJoejA3JW78vqnr47d3tz5A6A5KjmMpDXpwDKKhHuyYJIJt6oBguiLYJ9LRgTbRlayt8liyEHZ86l52pOqzu/SDlj8Ysg6MPP4eSI7oEgAgcio5DD8vo319vRtZHMQKb1yVzVAEP0ayITa4NnISvbOn2xw26HZJwHj0a+BvGKOFIyq87u4Mbl2aFqQSlw+qpMlF635WO3NnT8AmqOiTITXw9CiRvFc9A7dUB1gkp+jaoAgFg64p6DX7GUfiymsZO/ijuPWSsB47FjhSsEcucg+lqTtzc3SKdjr7GPhItWbigXHrcex2ps7fwA0R0Wh2AR7GIKvk07+pqGDp2qAIJZ0ECEFk7S9bZaA8WiiMLGq89vXwWuMVwdPJ3Yu3CLn3KmrsdqbO38ANEclh0FtuWwu3E2TpP0ndlv31yf6OaoGCDE2SMGkZu+uaStlQL5qnwSMx/xptzXZQnOkYJSc3wl2wtCJtNAQCw5n4RGnvbnzB0BzVHIYSRWugm+Sun+IVyQXbif6OUoGCI+QgknN3j2fzHIlYDLsY+Ri9laTcVIwKs7vzKPnifXC1YlUaiDe8izfGau9ufMHQHNUdBgJFa6Cb5J2vcSJxPutiX6OigGinJCCScHetkvAeHR8mmlSMCrOb7xJkqS+0+I+1K2K1d7c+QOgOQZzGCQTIV4V3YyvcBXsR5KA+cNksfuVdCBSMUCUE1Iwyds7e+OR3PmabK8EjEd6u2GSFIyK89t2CRifTe1yJ/ST2bHamzt/ADTHYA6DZCJE4erJBv4JZChJZ1EE5C8XJv9ZCgaIckIKJnl7lyRgtrGPj5skzGuSFIyK89tvg2arBEwZ426HhwQQiIzBHEZx61FZuLr9OPvkMZW5+pup9V1WMUCUE1IwydsbEjAlUmsuscA9fIF9LEnZm5uQgCnRf6N241Fs9ubOHwDNMZjDyB+/LJOTpdvZJ4+ppN0ukfSsT1YCxnMYqgWIckIKJnl7dyxzJWCO2SsB47Gw66RMhjcdYh9LUvbmpi8Bc9teCRiPcb9RQwIIRMZgDiN7/aEMyFNXsE8eU0m7XeIVyYFziX+WigHitfFBCiZxe5ckYB6wj4+bJSmYzexjScrerPQkYOi1p8USMB5p1z3ON2pIAIHIGNRhtGRlQB4zg33ymMquWevkK5KLjYl/lnIBoj8hBZO4vSEBU2L2ticFs4R9LEnZm3U8jyEBU07adRcLjmU7YrM3d/4AaI5qDgMBI1n2fOFKwDxoS/yzVAsQAxFSMAna25WA6RmNBZ1gW17sTtEulQlSMKrNb0jAvE7adY/zjRoSQCAyqjkMv2m6xV0DEuOzglDI7x05NZUApFqAGIiQgknO3iUJmOXsY1OFtDslFhyPn7OPJW57c7MkAbOLfSxK8ElGLsA+nhmbvbnzB0BzVHMYftN0i/uGJsXMnScyIE9YlM7nKRYgBiIdhoEUTDL2hgTMm+yaIaVgaLeKeyxx25ubkIB5k7T7Lt6otWRjsTd3/gBojmoOwz8pZ1DTdFWYO3tDBuR5G1P5PNUCxECEFExy9qbiczGXtx5lH5sqNEkKRrX5TYdrpATMNfaxqMLuKcvlG7XrD2OxN3f+AGiOag6DJq9pTdNVYWHPaRmQNxxI5fNUCxADEVIwydm705eAucw+NlVIu1OmSMGoNr8hAfMmO5dsk3Pw+JVY7M2dPwCao5rDyDY2y9eUE804KacSO1btka9IDiYvAeM5DJUCxIBjhBRMYvaGBMybJIFiscBdoL8UjFLz+zUJGPSS91jcdkwuOJw/47A3d/4AaI6qDsM7qPBBOgcVbGLXzLXyFcmlO6l8nlIBohIhBZOYvXs+dk/0P8GJfo+0O2XKAlel+Q0JmIFJO39iwbEkeh0uEkAgMoI4jJ6x8+RJuYfP2CeQSUz7vqoUIAYjpGASsLen6QkJmNfZ5i5wDZCCUWl+5654EjCr2ceiEr3mClQLGIe9ufMHQHMEcRhds9amJlZsDRl2VlUKEIMRUjDx2xsSMJXpS8E80lsKRqX5DQmYCoxxIYYEEIiMIA4jzXZltjDj1VZ+tTi9z1QoQAxGSMHEb+/8iYbYXj2ZRhIqllIw6ZRipGFv7rH4EjC7TrKPRTWSDmAcpRhIAIHICOIwCvvOytXcuv3sk8cUlorPN6X2mSoFiMEIKZj47V3cfgwSMBXYsXK3PJl56Dz7WOKyN/dYIAFTmdQJJI7DWEgAgcgI4jBy52/Jeo4569knjyn05Sc2HkztM1UKEIMRUjDx2xsSMJXJMReTtjf3WKi/spSAaWIfi2oszcVozRWQAAKREcRheNIc3eMWsE8eU8ix66BSgBh0nJCCid3e/q7DNUjA9CfHbnzS9mYdCyRgBqUvyL7lSGR7c+cPgOYI5DAgzRE7OeqOlAkQ1YjnLXZ7x1V3ZCI56nGTtjfrODwJmM/msN8TFVlqybg1sr258wdAcwR1GNSvVpyUu9PCPoFMIMfJQ1UCRBBCCiZGez+FBMygNETrVJX5DQmYwemfyP96WWR7c+cPgOYI6jA652+UO1Znb7BPIO3JpD2mSoAIQkjBxGfv3I34tMdMZc9Yb0Gmr9apKvMbEjBV+DQn7k/vqOmR7c2dPwCaI6jDoAJpcax/9yn+CaQ5uboPqBIgghBSMPHZu3Aivu4DpjLtrjxJ2pt7fkMCpjp7PpktSzKa2iPZmzt/ADRHUIdRWtXtZp88upOkEURAXphu/1FVAkQQQgomPntDAqY6/b7cGkvBqDK/OxdukQfcTkMCphK76lbJQ1kN9yLZmzt/ADRHUIeBuo74SCtjEZCdlXKan6tKgAhCSMHEZ+/OZdtlQD4OCZhKLOw5LefkBn2lYFSZ35CAqc6O5TvlnDxyMZK9ufMHQHMEdRiZphc42RXX5F+5S07+wxdS/VxVAkSgsUIKJjZ7d/sSMA/Zx6QqqbZZ7MrP38g+lqj2Zp3fdIL/ozpIwFRhcecJueDYfDiSvbnzB0BzBHYYNLFH1cm6hdYc+wTSmV3TV8uAfCX89n9Yh8EeIIKSnreRkIKJw96QgAlwrxqfaC8Fo8L8hgRMMOZPXXXLgLZEsjd3/gBojlocBh1bF4nLzcfsE0hnknMUJw4fp9t8XoUAUQshBRPd3q9efiMD8hhIwAxKA6RgVJjftKgVpRvTUSo06H269VguOCYtjWRv7vwB0By1OIzOxdvkq8uTDewTSFu25qUEwEd1qQcaFQJELYQUTHR7f9/yzJWAWcE+HtXZM3aeXHA8bGMfS1h7c89vSMAEZAxxAAkgEBm1OAw6RSjqFrYf459AmjJ7qynyyi8sVQgQtRBSMNHt/aeGRkjABGTXLFcK5mIj+1jC2pt7fhc3HYYETEBGfROEBBCIjFocRv64qye2dDv75NGVJI0QtfYjLFUIELUQUjDR7f3dwbNy0bYNi7Zq7FjtSsEcPMc+lrD25p7fkIAJTq8WnBQ2wtqbO38ANEctDiN7HR0ForIQw+mvsFQhQNRCSMFEt/e3a/e4EjBX2MejOktSMAfYxxLW3tzzm95siDrxW5CAqcaoahBIAIHIqMlhuC1s0FM0wqRfEV3/KSxVCBA1jRdSMJHt/c3M1ZCACchcvSsFM09PKRj2+Q0JmJpIXbXEgmNjOO1JJIBAZNTqMOJoYWMz41CAD0v2AFErIQUT2d4vP5kl52tLln08qjNzp0W+4ZiwiH0sYe3NOb+hFVsbc2euywXHgk2h7c2dPwCao1aHwZnAmMCeT/kSaO4AEYaQgolg76dZVwJmJvtYtKAnBTNSTykY7vkNCZga7RVRexIJIBAZtTqMjhW72F5has9W+QqdBLVZHI6GCSCkYMIzd8Ot2Z0KCZig7PlivlxwPNBPCoZ7flNMEIe2VkACJhAjLjiQAAKRUavDKPWxTf8Qg+4kAW0RkL9exvL53AEiDCEFE56FEzi1Xyu7Zq3TVgqGe37TwTZIwNTGKAsOJICWYPjw4R+OGDHiFw7HOV//ddSfK0etDsOvW1i4mX3y6Ea//c+irSyfzx0gwhBSMOFJ0i/Q7ayN9JyJJOaAflIw3PMbEjC1s2v2ernguHA7lL3jyzIAJeEkcj9/5513FtHXzp8/dpK7LVF+rj9qdRiZxma5izVxCfvk0Y1xNACPQu4AEYaQgglP2vkTycwJSMAEJe00iwXHev2kYLjnNyRgamfH2n1yju6vD2Xv+DINQEk4ydxoJ7n7rfe9k9i1RPm5/qjZYRjQM5NtsnsSMEcvsXw+d4AINWZIwYQm1f6J3YUbkIAJylz9TW2lYFjntysBIw64tUICJigp8RMLDicRDGPv6BkGoDScRG6mw1+Xff/k7bff/lHYn+sPchjZrHyYgtKrW8g+aqvp39lO7wR17uo9ls8nO4exNyvbS1IwmRdF/vFoxN4xM+Q8bc2yj0UXZu+VpGC4x1Lz2Dnnd3NJAob7PujE/EX3Dcec9aHsHV+mASiJd955Z87w4cN/WfZ925AhQ34Y9uf6oy8Evl24STy0f7rXFOafW4uXY+eK+/aqu5d7KFrhm0lLxH37PlvgHoo2eNX7jbhnpAMIBMerP33f99JZbLwcObXv1fevuIejDb5//FQ8b9/OWcc9FK3wqtAp7ts3ExaG+vfxZRqAknBf7f6m7PvWKD/XH/QQ1bpi9OsWDtSzr6C0YVtJAoZ2tTjGoOUOoMOueVIKJn/+JvtYdGHObdtInUB0szc3qdxA7Jw+1OsNB+f8LhyVEjCdK3ax3wetSG84Ppgqyqoyzws12zt6hgEoDSeR+xnt7tHXQ4cOHeFgJ33tJHvDgvxcNZDDoIeptroF2WC+Y91+9hoKXZi9xSsB49WMhLE3NyEFUzvzxy+Le/bHtXu0szc3dZWC4ZzfvgTMzhPs90E3khC0kIJpfFKzvePONwAF4SR7E5zk7lcOJw4bNmy4879+4CR4D5z//1dVfq4qwjgM/2TmnPXsk0cXliRgtrCNQdcEEFIwtdOTgPnu4Fnt7M1NXaVgOOc3+TVIwIS8dws2ywXHmes12zuRhAOwB2EcBk5m1s4CswSM5zB0TAAhBVM7O5dsk3W6DY3a2ZubukrBcM7vkgTMY/b7oBuLmw7JBcfuUzXbmzt/ADRHKIfxonQyk2RhuCeQDvQlYBhb6OmaAJJKvlhwfIEFR1B2T1kuD860PNfO3tzUVQqGbX5TPBgFCZiwzB++IBccK2troYcEEIiMsA6DZBJE3cKd2uoWbGXXdCkBk224xzYGXRPA1xYcz4v849GAPa4EzKuX3+hnb2Zm7pakYLjHUtO4meZ3psmVgPl0Nvs90JHZK/fkGw4nRtRqb+78AdAcYR1G53wpBZM7e4N9AulAco4iYXacJdcYtE0AHXZ/uVDePyc4c49FeT7JyID88Uxt7c1KZ5FBiw1adOgkds81v8MmMKDLpvZQCTQSQCAywjqM4saDoeoWrGRr3peA4QwoOieA9DpOLDjqb7KPRXVmrz2QO1hTV2hrb256YvdUfsA9lqDkmt9U1iJeYa6o7RUmWGLvqOnyFfrTXE325s4fAM0R1mGErVuwkb4EzKSlrOPQOQGkgnxIwQSjJwHTuWy7tvbmpo5SMFzzu7jJlYDZdZL9HujK7smyZjd741FN9ubOHwDNEdZh5C7fldv+M1azTx7VSdII3BIwnsPQNSEoHDwnFxyrIQVTjcWtR+WJ8+3HtLU3N3WUguGa350LIQET+R66p/bzJ67UZG/u/AHQHGEdRubxc7/3I/fkUZ0qSMB4DkPXhIB2YsSCYxakYKrRDyYnG7S1Nzd1lILhmt/dbqvG7O0m9nugKz3dTvqzFntz5w+A5gjtMOhk5ofT+nqpbqENR/8HI9XGcEvAeA5D14QAUjDB6UnA5G481Nbe3NRRCoZlfiMOxML8iQb5vDmLt1rszZ0/AJojisPwV363sPIbjL4EzBU+CRjPYWibEAgpGNkzE9qTg7NntJSAyTzN6mtvZuooBcMxv/EmKB5S7Z943iYHbxWKBBCIjCgOA7UfwUjOkVsCxnMYOicE0J4MQF8CZpb29malhlIwHPbOXUEteCx8mqtZKQIJIBAZURyGf/oLDcAr05OA+YhXAsZzGDonBL4UDLQnK9KTgOmaukJ7e3NTNykYDntDDSI+1qoViwQQiIwoDqOk/7STffKoSno9roIEjOcwdE4IihtcKZg9p9nHoirzxzwJmB3a25ubuknBcNg7bB9b8E12TV9dU6kQEkAgMqI4DF8Bvg4K8JXoS8As5JWA8RyGzglBSQpmD/tYVGVJAua49vbmpm5SMBz27lywWSbJZ66zX7/upF1UUVJ1+EJge3PnD4DmiOIw0AOyOkkcVQTkTbwSMJ7D0DkhyF26IxccM9eyj0VVlvTEGrS3Nzd1k4LhsHf3RPcgYGMz+/XrTtpFFbFi48HA9ubOHwDNEclh0MnMUXWyhU1r8BY2NlEVCRjPYeicEGQePpMLjrHz2MeiKss7Cuhub27qJgWTur3J/3+Ak/lxkWqbxfM2f1Nge3PnD4DmiOowur9eJgPOzcfsE0hF1lrXkSS1TwgQcKrSk4ChU4Xa25uZvhTMlwvZxxJovCnbO/PIW5DNZb92E0jqBrVIDyEBBCIjqsPoXLTV7zrAPYFUpCoSMJ7D0D0h6P5qsbyfjZCCeYPNJQkYU+zNSs2kYNK2t1+SMWMN+7UbQWdRW8vzhgQQiIyoDqO45YisW9hxnH8CqUaFJGA8h6F7QkCvRyAFMzCzV10JmGkrjbE3N3WSgknb3oVD52WN5Krd7NduCnvGuc/b/dZA9ubOHwDNEdVh5I9ekk5g2Q72yaMaVZKA8RyG7gkBFUhDdmJg5o+9PhdNsDc3dZKCSdvemIvxs2vOevm8nb8dyN7c+QOgOaI6jOzV+6/tOoAlqiQB4zkM3RMC7DpUZrkEjCn25qZOUjBp2xu78fGzY91++bztOxvI3tz5A6A5IjuMfnVHYIkqScB4DkP3hABSMJXZuXjba/W4JtibmzpJwaRtb9Tjxs/CgXr5vDkLjyD25s4fAM0Rh8PwTx62ZNknkEqsVdgzaZqQEODkYWVSI3lPAsYUe3NTJymYVO2NE/mJkEoNxAJ31rpA9ubOHwDNEYfD8LXHrj9kn0AqUSUJGM9haJ8QIPBUZLkEjDH2ZqZOUjBp2jvzsA2anMz3FQkgEBlxOIxS94Er7BNIJfoSMI+fs4/FcxgmJATeqyd0HyijV4rxSakUwxR7s1IjKZg07V3aqUIpRqysYYGLBBCIjDgchl98vu0Y/wRShW35vl6FJGA8h2FCQtC5YBP6j/bjQIexTLE3N3WRgknT3ujLnRy99nqZKgtcJIBAZMThMPLHL8s6maXb2SePKsze9iRglrCPpdxhmJAQQH7iTfaXgDHJ3tzURQomTXvToRgxB/ecZr9u09i5cHOgBS4SQCAy4nAY2WsPZbIzZQX75FGFqknAeA7DhISADtWIZGclpGA8DiTIboq9uamLFEya9qZDMSJJqYcETNwk1QjxvO06WdXe3PkDoDlicRgtWVl/NGYG++RRhSUJmEPsYyl3GCYkBLnLaEHVn52L32zJaIq9uamLFEyaKgweTQAAIABJREFU9qZ+teI15Z0W9us2jfkjF+XztmJXVXtz5w+A5ojLYfSMmSlPID7JsE8gFaiaBIznMExICDKPnssFx+eQgvHYXwLGJHtzUxcpmNTsTQcVRk4Rh2PokAz3dZvGbINbz1u3qqq9ufMHQHPE5TC6pq6QAejaA/YJpAK7ZkgJmNyVu+xjKXcYRiQEFIA+nCZPyrVBCobYO2r6axIwRtmbmbpIwaRlbzoMIxZgX8xnv2Yj2dzunuifXdXe3PkDoDnichh0AETseB27zD+BFKBqEjCewzAlIfBOymVvQwqmUsAwyd6s1EQKJi175y7cljtUs6uLFYPh2F/Ts5K9ufMHQHPE5TCK24/JmretR9knDzs9CZgPpykVMExKCDoXeCflrrGPhZuV+nGbZG9u6iAFk5a9a2lXBoYjHais1lwBCSAQGXE5jPyJBlkns3gb++ThpooSMJ7DMCUhoMM1QU7K2cD8UVcCZvmO1/6/Sfbmpg5SMGnZu2Pdfjn39p5hv2ZT6b9RO165uQISQCAy4nIYVHwukp7Jy9gnDzdpV0pKwGxmH0t/h2FKQlCSghn8pJwNLEnAnDDW3tzUQQomLXt3zt0gk+FzN9mv2VQGeaOGBBCIjNgcxtOceGCpGJ178nBTRQkYz2GYkhDQ4RopBbOafSzcHEgCxjR7c7MkBbOffSyVmJa9u8cvlK/D7z5lv2ZTSXO52hs1JIBAZMTpMKgPqShcbW5nn0CcVFECxnMYpiQEdLhGHHz4bA77WLjZ/bUrAXPzsbH25qYOUjCp2JsOxLw/GRIwCZPmsnij9nXlN2pIAIHIiNNhUBG6CEQN99knECdVlIDxHIYxCYEnBUMLjrY8/3gYOZAEjHH2ZqYOUjBp2Dtzv1Xeh3EL2K/XaLZ6b9Qq95JHAghERpwOg4rQxc7X0Uv8E4iRJFCsmgSM5zBMSgjokI2UgmliHwsbB9EMM83erNRACiYNe+fOuxIwc9azX6/p9KXEml5UtDd3/gBojjgdBhWhi9q3zYfZJw8bFZWA8RyGSQkB9VkWC47T9krBDNY1wDR7c1N1KZg07F3Yf1bWQq7dx369prPamyQkgEBkxOkw8qeuyjqZRVvYJw8XSZhYvCKZqJYEjOcwTEoIgjZNN5klCZidxtubm6pLwaRhb0r8xJxzEkHu6zWdHSt3D1pLjgQQiIw4HYZfuDppKfvk4aKqEjCewzApIfClYKo0TTeZlSRgTLQ3N1WXgknD3vTqVyTB52+xX6/pLOw+Jef2xoMV7c2dPwCaI1aH4RWuflS5cNV0+pNWMQkYz2GYlBBkr9yTrz+nD9403WR2LnIlYE5dNd7e3FRdCiYNe9PhD/Ea/B4kYJJm7uwNuZkwf+CT50gAgciI22H0fDp70MJV06mqBIznMExKCOgZs10KppIEjIn25qbqUjCJ29s7CPM+JGBSsecd9+T5hEUV7c2dPwCaI26HQbsxIiBducc+gTjoF+5eVksCxnMYRiUEJAXzUZ2UQGm1UwrGl4BpfbNpvHH2ZqbqUjBJ25uEn8X1j1fz+o2jn3APfPIcCSAQGXE7DKrHUnUHLA2qvANqYkJA9aZiwXHrzR0w49nkSsB8+qYEjKn2ZqXiUjBJ25tav4kd0Lkb2K/VFvqv3O+3Dmhv7vwB0BxxOwxV26ClwpasDMijZ/CPZQCamBD4UjAD1MCZzmzDvYoSMKbam5sqS8Ekbe/CPlcCZp2aNZAmcrBDN0gAgciI22GQJpuqp2CTZvbaQxmQp65gH8tANDEhIM1JcTJz55unYE3nYBIwptqbm12zXSmYC7fZx5K2vUunoOvZr9UWUrIt7vm+N2V3kAACkRG3w6CuDKrq4CXNUkDewT6WgWhiQpA/ctGVgtnJPpa06SW/xQrJr4n25uZgAZmbSdtb5eTXVJLkkPBvTvI9kL258wdAc8TuMBTuhJE0VRcmNjEh8KVgKrwGNZkkuD7Y628T7c3NwkE3IK/ewz6WtO3tv/4eoB4NTIYkOi7826y1A9qbO38ANEcSDsPvhftIrV64SbNzwSa5Qj5znX0sA9HEhMCXgqlwEMJk+r2QKxyAMdHe3MxdviMD8ow17GNJ1d6KH4AxlZmHz6R/GztvQHtz5w+A5kjCYZBzlFIod9gnUJokvSaR+N55wj6WAZ2JiQkBScGM8qRg3pRCMZZ03R9M7ev9/dd97W0Fe+zNTJUXHEna29ekU1QCx1gOMs+RAAKRkYTD8HsYHjrPP4HSIq2Q358sVsmqiqSamhAMJoZsKuk1nEhEvphvnb25Saf8xYKjJcs+lrTsnau/obQItsmkenrh3243v2Fv7vwB0BxJOIxqPQxNpOoisZ7DMDEh6FzstkM70cA+lrSYO3dLvoqcs946e3OTTvmLgHztAftY0rJ3Yc9ptw3eAfbrtI2+1NXpa2/Ymzt/ADRHEg6DauBkD8NN7JMnLVbr26gCTU0IituOyQXH1qPsY0mLXkAubqgckE21NzdJdkcE5KOX2MeSlr07VrsSMAfPsV+nbawkdYUEEIiMJBxGprFZ7oZ9tZh98qRFHQSwTU0I6BSs1J7cwj6WtBik57Sp9uamqnM9SXt3zVwr67ovNrJfp22spPeJBBCIjEQcxrOCKFql4lVbToz5uwJHLrKPpRJNTQioNsa2BQfJ3ojXkA2Ve26bam9uqrrbn6S9ez6bY6WygwrMXr0vyz2mrXzD3tz5A6A5EnMYY+dJh/FQvZZJSdCvC7qqVl1Qf4dhZEJACw5PokLRAzhxs2fMTHkQ4UnGPnszU9V638Ts/TQnrpdO29uyoFeKzRl54OvjWW/Ymzt/ADRHYq8MZq21SjVe1ZOB/R2GqQlB93i3afrdp+xjSZzN7QMGBJvszUpx4n+Kcif+k7K31+Kye8py9mu0lT1j3owvSACByEisaHjtPmVbJsVNXxvsE/W0wV4bp8EJAclTiAXH2RvsY0mafveT6YN3PzHZ3tz0NT8b1dH8TMrefrtFRVtc2kD/DdP1h6/Zmzt/ADRHYrIBXsukVeq1TIqbuSt33YC8mn0sg9HkhIAK8lVuwxcnSV9TzK2Vu621Nzc7F2x2u/5cYx9L0vYmOS9b5paq7Fy2Q9aYH7/8mr258wdAcyQmHOonReb3aPUD8qrBAzI3TU4I/JNyy8zfpehYv18G5L1nrLU3Nz1pjmI/aQ5OJmVvm3bXVWVxx/E3pK6QAAKRkViA8OuUZrJPnqRJ4qhBAjI3TU4IbKpT6pq9Xgbk87estTc388cuy5PACi04krJ3z7j58nX3PQvqaxWlL3W1eOtr9ubOHwDNkWSAoCJ1UbjqJIPcEyhJUjeGIAGZm0YnBBadVPRP2D8Y/IS90fZmJtViiQXHZHUWHInY20JJLxWZvfVYPm9fL3vN3tz5A6A5kgwQVBMnEqMrd9knUJKkfqxBAjI3TU8IrNAqa8vLgPzhtKoB2XR7s1LBBUcS9s7eapKJx8Ql7NdnNVudeU/P20el5w0JIBAZSQYIOgBifPugNn1WyKYnBDZ0K8jedHcCJi213t7c7Pl8rlxwPFZjwZGEvfMnG9549Qjy0F/gus8bEkAgMpIMECQBIwrz1+5jnzxJMXvbXSFPUn+FbHpCYIP0UP7EFRmQl2yz3t7c9Bccl+6wjyUpe9OhA3H4YNsx9uuznV0z1sjn7fJd397c+QOgOZIMELQTI04CO46Se/IkRb84d5H6K2TTE4LCAVd6aLW50kPFLUdkQN5ePSCbbm9udqzZKxcc++vZx5KUvam/tpAfcfwc9/XZTlKZELY4dN63N3f+AGiOJAMEbVWLk8CfzWGfPEmRAnH/4/mq0vSEIHf5jlxwzFBbjzEKawnIptubm5T4iQWHkwhyjyUpe1N/bSFA3NjMfn22s7DntIw1Gw769ubOHwDNkWiAeNHR1ztquvIt0qKQXsWJgHyigX0s1Wh6QuB3ZPlU7Y4sUVhLQDbd3tykV78qveGI3d7lLe+eFdivz3bm6m/It03zNvr25s4fAM2RdIDwW9hcfcA+gZIgHcsX13fzMftYqtGGhECHnsyhSQuqkcEDsg325qRqbzjitnfmbousbx6/kP3awDJ7fLnQtzd3/gBojqQDRMeKXXKH7PAF9gkUOykgfzhNHM+nY/rs46nmQCxICLqmrXQXHPfZxxK7/e49dQPyAthbBYo3HHVywfE0xz6euO2dO3Nd7jjN38R+bWCn3JF1Fn+0K0tfIwEEIiPpAFHYfcqtWzjAP4FiZubhM7kDMHYu+1gCjdeChMDkBQe14ip/BQR785OEoMWC4/pD9rHEbW9qcyd896bD7NcGStLiz+vKggQQiIykA0Tu3C1ZJzNnPfvkif3aLtyW1zZrHftYgtCGhKC04DjIPpbErm1jsGuzwd7cpFZwYsFx7DL7WOK2d+fS7e61XWK/NtC1ydwNUgrGiatIAIHISDpAUHcMuUs2j33yxE3ddA5tSAhy9TflLpnjKLnHEjc7lu+UAfnIRdhbEfq7ZJv5d8nitnf3ZLe++cYj9msDJTvW7/f7ziMBBCIj8QChWZ1cTZNxtasDdkCPTic2JASZ+61ywfHFfPaxxM1aD1TZYG9u5s5ckwuOBZvZxxKrvQ322zqTumpJrdO9SACB6EgjQPgnZQ1bSfrK7Ip0AqhGKxICClwfTBXt+ahNH/t4YmStJ5ytsDczM3eeyIM5ExbxjyVGe2cetmlV32wLy6WHkAACkZFGgCjVkvDXycTJ/r0ZVactCQG15RMLjlvqS/MEtl0IjUNb7M3KficzWZ+RGO2dO+/WN882r3ZbZ2YelQ4eIgEEIiONAGHkabKnOXFNJHRNu07s4wniPCxJCKhxvS7i3EFZ6nKyBvZWjKTLJhaCd1tYxxGnvb2uE1Rzxn1/wTKWvZrPPCsgAQSiIY0AUdKTCiZfoQNJ9kG8+pmynH0sQWlLQkCN63VpzxeUpT7HwduO2WJvbpJfE6UgZ2+wjiNOe3es3PVa31lQHfpvOG43IQE0HcOHD/9wxIgRv3A4zvn6rwf72XfeeefvnD/+/O233/7RsGHDhgf5/WkEiMxdT8DWHEV5ep0tktplO9jHEtgOliQE1CdX2GbhFvaxxEU6aS4OHO07C3srxuKmQ9I2u06yjiNOe3fVrZJJxpV77PcXfJ1+P/DT15AAmgwn4fu5k9Qtoq+dP3/sJIFbBvt55+8bnJ/LOtw2ZMiQt4J8RioBgupkRk41qqckyT6IXaadJ9jHEpS2JATZ281ywfHVYvaxxMWuWWvlLtPFRthbMeaPXpK7s8t3so4jTnv3jJkpDxw9ybDfX/B1lseeOPIMQFE4idxoJwn8rfe9k+C1VPn5f6v1M9IKEN0TS9vW3BMoDnYu3CwD8plr7GMJSmsSAmeRIQrzR/IX5sfFns/nyjqzR8EPHFljb2Zmrz2Q9ZlTV7COIzZ7N7XLgwafzGK/t+Cb9BYcnct3IAE0GU7CN9Phr8u+f0Kvdyv9vJMAThw2bNi/OH+O+slPfvK3QT6DHEY2K51HkvQL8082JP5ZaZB2l0RCe+cJ+1iCkuyclr252eO2TMq6LZO0Zpt74Oijur5MewfsrRqfZqV9Rs9gHUdc9s5duSsT2umr+e8t+KZ93AVH97SVSABNhpPIzRk+fPgvy75vGzJkyA8H+Sc/oP+89dZbf+kki/VBPqMvJXx3UHbN+O7AmbQ+MjG8+v77vpcjp/a9fH9y36s//Yl7OMAA+HapXHD86dYD7qFExvctz8W1fDN9FfdQgAp4OVbu0L7q6uEeSmR8d1bW0P5xyyHuoQAD4FXvS2Gfl5/ORgKoO5yk7h8pWXN4th+30E6ekwD+puxnWyv9nmHDhv2r8/dT3W//zPn3PUE+nx6oNHYI/ML8RVvYV1BRmb0vD7X0jF/IPpaaxm3RjlCHW5hf3HWSfSxRWTjuHTjaDnsrSl8U/spdtjHEZW//wNH+s+z3FRyYXo1m/t8n/veIKQigKpyE7me0C0hfDx061MnpRuz0/s5JDIeV/6yTAP6z8zN/T1//9Kc//RvnZw8G+QxyGPRAJV23kG00pzA/V39DBuR5esnakJ3Tsjc3/cJ8jU5pV2LYA0c22ZubHav3yKTpIF9byLjsTV0maj1wBKZLry1kz3vj/684cw5AMTiJ3gQnCfyVW9/nSbv8wEnwHjh/91f9fva3tGPo/N0XSp0CJnqF+Qoo5kdlYfcpGZA3HmQfSy20KSHIXvN0GnkL8+Ng54JN7oGj67C3oiR5HrHgWMcnnByXvXXrcGQjaWErXgP/18T/HXvSAdiDNAOEr5h/h1cxP/LkW+GKpB65yD6WWmhVQqBhp5ZKpD6zct48gb0VZe6C1zptHdsYYrG3QfPGZBZ3yO5aPe9+9Tl3DgFojDQDRGknQx/plIHYNW2lPGF69T77WGqhbQmBETsZpKH5/mTBWnfObbM3JzMPvR6t8/jGEIO9PUkbE3bOTaZXU9/77qS13DkEoDHSDBB+LdMOfcSTB6KuIqm2JQQm1DLRbrkIyF/W3kXHNnuzsqxHa3trnmUMcdib3mqoIGoNDs7srSaZAL438RJ3DgFojDQDRP74FXl4Ysk29gkUms36iqTalhCUn2bkHktY+n20F2yCvRVn99fL5JuBm49ZPj8Oe1Nds5gzu0+x309wELbl+3p//3Vf77sT27lzCEBjpBkgyDGK3YxJS/knUNhruHLPFUldxT6WWmlbQlA4cE7uZqzeyz6WsKSTv2LXfPNh2Ftx0sJW1AafuMLy+XHYu3PuBrlrXn+D/X6Cg7O45zQlgL/nziEAjZFqgPBWLR9M1bbAOH/4gkwqVu5iH0uttC0hyF2+I5P1GWvYxxKWne5pv/yxS7C34ixuPy6T9S1HWD4/Dnv3jJsv62bvt7LfT7C6vbnzB0BzpB0ger7Q28H4rxX3nmEfSxiHYVNCkGl6IV/XfzqbfSxh2T15uXyteP0h7K04fbH7hVtYPj+yvdsK2i/QbSISQCAy0g4QpVcMN9knUBh21a2S4798l30sYRyGbQlBz+gZ8sBOS5Z9LDWTDhaMqpPjf5qDvRWnL3Y/cQnL50e1d/aWV6LDM36wdntz5w+A5kg7QGhdZEwB+aM6edJPw4TCxoTAU8zXTbJH2OuR7AHc8/lc2FsHemL3I3nE7qPaO3+iQe5gLtb4kJ5FRAIIREbaAUJnmYHMXbcH8Lj57GMJ6zBsSwg6VuyUNXSHL7CPpVaSfI2oYZy1FvbWhL5od2Nz6p8d1d7FrUdlDeP2Y+z3EQxmb+78AdAcaQcInVt05U82sNb4xOEwbEsI/LZ9G/Rq2yfGvt9tL7Z2H+ytCTsXbXVPAjek/tlR7U1+TYz91FX2+wgGszd3/gBojtQDhN9qqE67QuPipkMymdipp5C1jQkB1ZqKpH3uBvax1MqOlbtlucTBc7C3JvRlexxfkfZnR7V391eLZbkEw+4lGM7e3PkDoDk4AgTVNInXJI/0atHVNWudPABy/hb7WMI6DNsSAjptLl7bf6Hfa/vuKe4J4KsPYG9NmDsnFxxdc9an/tmR7C1aDk4RNYxUy8h9H8Fg9ubOHwDNwREg/ETqwm32SVQLez6eJRPXphfsYwnrMKxLCLwWXb//mq1FV+hxfzA10rittDcz/YM7n81J/7Mj2DtKy0GQh0gAgcjgCBAd6/Zrp6WXefSMzbHH6TBsTAio3jTKThqLrbyAPD58QLbV3qx0EveeMa70UHO6vcKj2NtvOTi/9paDIA+RAAKRwREgCofOu900drNPoqDMnb2hbS1ZucOwMSHoWBWtlo6DcRw4stXe3KTOM+INx6U7qX5uFHsXd3i1i7W3HAR5iAQQiAyOAOH3063Tp59ucdsx1jZPcTkMGxMCSvzEgmOVPgsOCsTiedsR/sCRrfbmpv+GY8/pVD83ir39E8An0z+9DIa3N3f+AGgOlgDxJCNfp46ZwT6JgrJz/ka5qj9zjX0sURyGjQkBvfrVTXqIDhFE7Zhjq725WdI63ZHq50axd/e4BbK++W4L+/0Dg9ubO38ANAdXgKD+rPIk8DP2iRRovN7J5Qdt7GOJ4jCsTAha89r1OKVa06jzw1p7MzN745HbUm1pqp8b2t5Pc6K7ER2W0mV+gEgAgRjAFSD8HY6zN9gnUlU2uzuWo2do7SBtTgjodKNIqO48YR9LVTa3uzvkMyM9bzbbm5VMLeHC2tsvyZm2kv/egTXZmzt/ADQHV4CgWjpR47RN/bZDfkuuGWvYxxLVYdiaEHB2aKiVcT1vNtubm15LuDRFlcPau7DP7TizZi/7fQNrszd3/gBoDq4AkT99zZUd2Mg+kaqxsOuktu3E+jsMWxOCAmOHhprH6rav61i/H/bWlJ2Lt8kFx/ErqX1mWHtTX3Zd+2XbTCSAQGRwBQiqpROvucbOZZ9I1di5eGvqzjwph2FrQkDdW8Su2ux17GOpxs6l2+XzdvQS7K0p/UXjxvQWjWHtTbWKYrfyxiP2+wbWZm/u/AHQHGwBggRTR/MIptZKEuMV9WONGtSPVXEYtiYEmcduh4ZPZrOPpRq7Jy6RAfnWY9hbU+bOeQuO9FrChbI31Su+Pxkt4DQkEkAgMjgDhC+YerGRfTJVJJ2QoxOkBpyQsz0hoORPJPKPFe5B7QXk96MHZNvtzUl/wfFpeguOMPbO3nwsTyw7iw7uewbWbm/u/AHQHJwBorjhgBRM3XWSfTJVon9Cbqo+GnKDOQybEwJ6/SsWHOdvsY+lEv2APCl6QLbd3tzs+Xim+4ajPZXPC2NvT7Owc1m6moVgPPbmzh8AzcEZIKimTjifxVvZJ1MlmnRCzvaEgA6AiAXHzvDdNZJmnAHZdntzM+03HGHs3bF2n3Z92cGSvbnzB0BzcAYIqqmL2vA+aZp0Qs72hIAkYERytUjdBUecbcRstzc36RR3mi3hwtib2nGKJPXyXfb7BdZub+78AdAcrAHiRYeoraMaO6q1455QA5FexYmC/JvRCvJVoO0JAYlAiwXHl+ouOPxdo0t3YG/NSae403y9WrO9yf9+VCdfU7dk2e8XWLu9ufMHQHNwBwiqrRMJ1pV77BPqDfoF+VOMOCFnfUJAAe+DqXLB0ZrnH88A44vzZLz19mZmnPWcSdg7c++pPKjyxXz2ewWGszd3/gBoDu4A0bF6r3xNsu8s+4TqT66enkk6DG57c7N7irvguPqAfSxv2OfhMxmQP5sDe5tAWkCOnCIlVtqSX3DUau/8qatyh3LBZv57BYayN3f+AGgO7gBBtXXikMVy9U6h+WNbsZN9LHE5DG57c7Nj1W654Dh4jn0s/ZmrvyED8twNsLch9BccDcm/4ajV3sVNh6VY9fbj7PcJDGdv7vwB0BzcAaK0y6aeDpW/O7lfvd3JsA6D297cpMRPJPVOIsg9lv70+2M7f8LeZtA/ZZvCQZBa7d01Z72sN3UWHtz3CQxnb+78AdAc7AFCYSV6vz6x4T77WOJyGOz2Zia9+hULjinL2cfSn12zXJ3C+puwtyHMH7+cmtRVrfYmkWohjP5IYWF0cFB7c+cPgOZQIUD4vSivP2SfVD5fOzCg5gnlMA5DBXuzsjUvFhtUm6XUgoOet1HTYxUOhr35mbmb3kGLWuydaXohx/XxLPZ7BIa3N3f+AGgOFQIE1dgJrb1D59knlT+5GpuVlwwJ4zBUsDc3u79eJhcc19Q5COJJ1PSMiy9RgL0V4Gsnu5PtCFKLvf1exbPW8d8jMLS9ufMHQHOoECCoxk7WZe1hn1QeS69utrGPJU6HoYK9uenXdirU/cDXjFsS3/MGe6tB/9X+uXhe7cdh7+K2Y7LedNNh9vsDhrc3d/4AaA4VAgTV2KlWl9Wx3u1TvPsU+1jidBgq2Jub+WOXlOsI0rF6T+xySLC3GvQP92w9mujn1GLvUr0pDoDoSiSAQGQoESAUrMtKu49nWg5DCXtz3wdPAHfsPPaxePTrYK/FVwcLe6tBT96na/b6RD8nsL1fqzeNLjgO8hAJIBAZqgSI7snLUtPLqsryup0n5jhIJARl9h0zU56AfKzACci2ZBZAsLca9A9cjJkhnr3EPiegvbO3m5XvwQ4Gszd3/gBoDlUChK+Xtesk+1gy91vdHaK57GOJ22GoYm9uktiy2OE9c419LNQGUZZArIC9DSXtNosFx72niX1GUHvTYTtRc51Sj2IwOXtz5w+A5lAlQORPNsi6rPkb+cdy+po7lk3sY4nbYahib24WdxyXdVkbD7KPhepMRUBetx/2NpSdi7ZIpYMTVxL7jKD2pq5LYrGtkOoCGM7e3PkDoDlUCRAkRip1qWYm+pokCIub3RZJ246x35e4HYYq9uYm1XaKuqy6Vexj6VyYTHIAe6vDpJL8MPYmaStRbnO7if2+gNHszZ0/AJpDpQDhvya528I6DlNbJCEhKOPTnBD5JrHv9udF1rH0fD5XPvf3W2FvQ+m95qfuQkl9RiB7N2fEOHpH1bEvtMHo9ubOHwDNoVKAIA00sRNy5CLrOExtkYSE4HV2T1wid0JuPOKzyWNv53tW7AEZ9laIvtJBcguOIPamNoMQgDaDSACByFApQBT218vXJCt38U0qg1skISF4nfSciVoo57njGgMdQhH1pnM3wN6Gs3tSsguOIPb2y1sS1iQEkycSQCAyVAoQ2ZuP5WnICYvYxpA7cz0VzS4uh6GSvblJO80i+Vq6nW0MxU2HZEDefhz2Npz+guPAuUR+fxB7+/qmF26z3w8wur258wdAcygVIEig9KO6vl5G/T0q0hZOeucJ/vuRgMNQyt7c96Mx/v67tbJrxurEAjLsrRbzhy8kKr9S1d7Pi329H04Tta/tLVn2+wFGtzd3/gBoDtUCRNestawHMPy6sGsP2O9FEg5DNXuzsrwjQlN7+p/vBWT6/AQCMuytFrONUoC554tkFhzV7O2/YflqMfu9AOPXQbh8AAAOB0lEQVSxN3f+AGgO1QIEa5Py5nYRjGkXkvtkaFIOQzV7c7NrttsT9Wz6C47srWRLHmBvxUgdaD6ZJQ+YPWhL3d6lGuvd/PcCjMXe3PkDoDlUCxD0KkzU4E1PX58tf+qq/Ow55tX/eQ5DNXtzk4rhxYJjc/oLjsKe04keeoK91WPnYlfp4PCF1O2tisoCGJ+9ufMHQHMoFyDK9dli7IsahB2r98r6v92n+O9DQg5DOXszM3eeb8Hh6U3SwgP2toNeHSAlY2nbm149q6CzCsZnb+78AdAcKgaI7klLWerw6FUcty5c0g5DRXuzstVZcLw/WZAWH6l9rrO48Qvym5M58AR7q0e/z/gns1PVffT1JsfMgAC0IUQCCESGigGiY427E7fndHqTydX/o0MBpjpIJAQD0z+Jm+LBo9yVu7L+7+tlsLdl9Hbi6FBIWvbOn3B7rc/j77UOxmdv7vwB0BwqBgjqiSqc1YLNKX6m+Q4SCcHAJMkfUYvnLDzS+sziliPuYadDsLdl9PUA951Nzd6dy3a4GoR8oudgvEQCCESGigHCe10hduNSOo1LJ+OEg9x7hv36k3QYKtqbm/TKX+zGjV+Y2mdST1ix63ixEfa2jP4Cd368i82K9i4/fXzvKfv1g/HZmzt/ADSHqgHCqwPMXb6bzueNXyBfy9x6zH7tSToMVe3NSgqQH89MTJ7jDbZkSwed2pI76AR7q8nXyk1iXOBWsndpgbOA/drB+IgEEIgMVQOE/4ps48HkJ9KjZ1YUSCMhqExPIqNw6Hzin+W3G5y1Fva2lCTGLA+6PUzc3sUdbonD2n3s1w3GRySAQGSoGiCyV++nplqfP3ZZvpJZmF7NIZfDUNXe3MwfvZTaM5CW3BDsrS6TaDlZyd5ddavk25Rzt9ivG4yPSACByFA2QNBruTEzUnkt17Fip3TG+80ukEZCMMi9SbHulGoNxe7PzWTLDWBvdUmdZ8Qu8Mz4doEHtDeVG/xhcl/vSCo3yLNfNxgfkQACkaFygPBfyx04l+jn+AKpMcsyqEYkBIPT7wN99X5yNnAWM7LcYGbi5Qawt8L0ErMYBe8Hsnf+9DWZaM5ex3/NYKxEAghEhsoBwj8tN3dDcpPo3lNXmHWW0fV/nsNQ2d7cLG44KOtOtx5N7DP8ThCLtsLelrN7insS/NKdxOzdsWKX8eoGthIJIBAZSgeIJ5nET0sWPQ24hPqxqkQkBIPT70M9dUVin9G5eGtivWBhb71I/afj7EP9hr2pjOazOfLtxh20fzONSACByFA9QHRNW5loAXP3pCWJ67GpQiQEVegsMmixIdqztWTj//0py83A3moze+VeSX8yhrcP/e2dvd0k326Mncd+rWD8RAIIRIbqAaKYYJcGWhX79VgpCU5zOwzV7c1NqpUSO3Snr8X+u7MNXsBPR48N9lactCD4fG5s/cf725tOmQvfuXoP/7WCsRMJIBAZqgcIEmYWSdoX82P/3cXtx6WDXLWb/TrTchiq25ub1H9aPBPLd8T+u+k5S7rGEPbWi37d6Yboeqf97d01Y418u3E2vR7XYHpEAghEhvIBoryOpfFJrL/bO/UZVxG26kRCEOAePWjr6yU5mI/q+tpbc/H97mcFITEjnuO76bTjgr3VJ0kBiQXu53MjvwZ+zd50yvj9yQ6n9LU/jfE5BpUhEkAgMnQIEH7z9BiFcymZ9E//WvD613MYOtibm97OCYlDx/U7fTmOBA+YwN4a0kn6ur+UupC5K9HaXpbbu3DwnHze5qznv0YwESIBBCJDhwCRq78pa6cmLolNqqW47ZhbHxN/baGqREIQjF5nmK4Zq2P7nZ3zN7malumJjcPeetD3Raui1eqV27v762WJ1bKCahAJIBAZWgSI58VSsXTDvVh+Z/eERXLVfTnaqlsnIiEIyNa8eAVMr4Iz91uj/77mjPs6brL4GvYGX7PTXe8w2oxIbyM8e+duPrLu7YaNRAIIRIYuAcI7sEHdQaL+ruztZukgP51tvPhzf4ehi7256ZUdxHFggzrZiGd3/kbYGxyQ3ZOXuXJXNyPbm079imd30yH26wKTIxJAIDJ0CRDUq1W0Tnp/cl+m6UWk31XcckS+clm7j/260nYYutibm9mG+66GWvTifKr743gdB3vrQ+/0eZQFLtn51bd/7OsdVZfqYSOQh0gAgcjQKUBQ+yxRR7XzRPjfQ0XX42XRNQmxcl9T2g5DJ3uzsuw5iXJK3Gs1SCeA4+r5Cnubx8yjZ7Lr0YfTRAlCWHv/6eJNt351Dfs1gckSCSAQGToFCKrXi7or453GFOr4Fr3+9RyGTvbmZsEVIe9cuj3076BXyLLVYPpak7C3XqRDR2Kn+PiV0Pb+ZpZ7gv1EuN8B6kMkgEBkaBUgaFfGO7xRH0Lc9HnR//f5Ixf5r4fBYWhlb+775e3KUC/qMK3hSMPyi/lsu82wt14k2SGhdvDlwlCHN7KNsra5d/SMxHqng+oQCSAQGboFiML+s6H1rTx5D9F708LTcUgIamfX7PWh5VtoFybOXq+wt+EsW6CSjl+t/75j/X652+z8yX4tYOJEAghEhnYBghTuP5xWu0QHScm4uzH5kw3818HkMLSzNzNpp9k/MV5LbRYFc7eGMOwrPdjbPnqap0LCpZYOHk8yYudP7DY3NrNfB5g8kQACkaFjgKB6KrHSXbEr8L/JHzofu5i0bkRCEILOs9I1baXcldl1MvC/83ebv+TZ/YO9NSU9b24nmlokiLzdv28XbYa9LSESQCAydAwQtPNHdVm9QYWh2wp+P2GbG6MjIQhHesb8k7xPAgg5P82JQ0bcu82wt57M3ngk+1E7Pi7z6Hl1O99pkRJZDr9/kYW9LSESQCAydA0QRfeEptjRq1LPV9gn6wa7pyy3dvfPcxi62pubnfM2yhPBi7dWfYY6Vu1W4nmDvfUl6QHK0+NV3nLQjqFbp9qxbh/sbRGRAFqCd95559+HDh36D9V+bvjw4R+OGDHiFw7HOV//dZDfra3DeFbwm6h3rKtc9Jy9+Vi09RK7fxdu84+b2WFoa2/ue0e7zqOmVy3Q92oGxe7NnRbYGwxnuwdtfb3vTxGn0LNX71f8OU9mqGfMzL7MkwzsbRGRAJqPv3ASud85CeBFJ6n7X4P9oPNzP3d+bhF97fz5Y+fntwT5AJ0dRvbqg77ekVNlvcwA4tAUtHs+mV1zvaCpREIQjVQ+IJI7JzAPVEpACww6oBT2FCfsDZazuPmwX3qQvf7wjb/3ZGPo1W/uyl3Y2zIiAbQETjK3rFoC6CR9o50k8Ldl/6YlyO/W3WHQjgs5QPF6buFmseNHiR+99vV2bIRkjIWyLwM5DN3tzU0vKItFx4YDfdlbTaLbR3HbMf85pFfAKpQawN6a03mGOpftcJPAur7ijhN9mYdtfdnbTf7/F3Wmhy/A3hYSCaAlCJIAOn8/0+Gvy75/8vbbb/+o2u8mh5HNyodJV1Khvfeatz+7Fmzqy7Tl2MeoAsnOJtible0dQhOQelIP9LwVtx8TP8M+TtjbDDrPUueKnQM+a7TbXDh8Hva2lGTnOPILQHEE3AGcM3z48F+Wfd82ZMiQHyY/OjXQ+bsJ/6P3vUlTXr43sdHhrZfvTjzS9f99+X9zjwswEz3/+dX/fPnupEUOb/S+N/Gp8+eCl/81sWqdLgCEQe+7E37uPGebHR/3xPnzkuPflvX+56RAdd4AACgKJ1H7Rye5q3d4toz15TV8NbwC/k3Z961JjhsAAAAAAABIEAMlgE6yN6z8eyfh+xntAtLXQ4cOdX58xM40xwgAAAAAAADEBCfR+w8nmbvpcLnz9T+5//sHzvcPnO//qt/PTnCSwF85nDhs2LDh6Y8WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqBHvvPPOvw8dOvS1DgbDhw//cMSIEb9wOM75GmrzBsKx+985f/w5tQuEZJB5wBy2C5jP9qB/zMZcB8LgL5yH5XfOw3SxXGTa+X8/d/7fIvra+fPH5R1JAHPg2LXBsW/W4bYhQ4a8xT0eID5gDtsHzGcr8EbMxlwHIqF/lxG3pdxvy/6+hWdkQJJw7Pxv3GMAkgHmsH3AfLYH5TEbcx2IhP4JoPP1TIe/Lvv+Cb1W4BkdkBTcbjH/4vw56ic/+cnfco8HiA+Yw/YB89kelMdszHUgEgbYAZzjrCh+WfZ925AhQ37IMzogQfyA/vPWW2/9pWP/eu7BAPEBc9hKYD5bgn47gJjrwMBwHoZ/JGfg8GwZ68vrBCq8Av5N2fetaY8biI4KtiduGTZs2L86fz/N/dE/c/5fD+tggViBOWwX3Pk81f0W89lwDPAKGHMdCIcBEsCf0aqCvh46dKjzVyN28o0OSAJOwPhnx7Z/T1//9Kc//RvHxge5xwTEB8xhu4D5bBf6JYCY60A4OCuH/3AemJsOlztf/1PZ/5/gPFS/cutKIClgIKhwmFaOju2/wKlB84A5bBcwn+3AQDEbcx0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+uP/B+OHYRc2Q/TTAAAAAElFTkSuQmCC\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# You can also tweak the palette used, either with a palette name\n",
"with replot.Figure(palette=\"dark\") as figure:\n",
" figure.plot(np.sin, (-10, 10))\n",
"\n",
"# or by explicitly passing it a seaborn palette\n",
"with replot.Figure(palette=replot.sns.color_palette(\"husl\", 2)) as figure:\n",
" figure.plot(np.sin, (-10, 10))"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# It is not mandatory at all to use a with statement\n",
"fig = replot.Figure(xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\")\n",
"fig.plot(np.sin, (-10, 10), label=\"sin\")\n",
"fig.show() # But in this case, we must show the figure"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## One-liner plotting\n",
"\n",
"You can also make plot with a one-liner."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Many plots done with a single one-liner\n",
"replot.plot([range(10), (np.sin, (-5, 5)), (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, (-10, 10), {\"linewidth\": 10}), ([-i for i in range(5)], {\"linewidth\": 10})],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\")"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Another one-liner plot example\n",
"replot.plot([range(10), (np.sin, (-5, 5)), (lambda x: np.sin(x) + 4, (-10, 10), {\"linewidth\": 10}), (lambda x: np.sin(x) - 4, (-10, 10), {\"linewidth\": 10}), ([-i for i in range(5)], {\"linewidth\": 10})],\n",
" xlabel=\"some x label\",\n",
" ylabel=\"some y label\",\n",
" title=\"A title for the figure\",\n",
" legend=\"best\",\n",
" palette=\"dark\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using subplots"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Using groups to define subplots\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.sin, (-10, 10), group=\"ç\")\n",
"\n",
"# TODO\n",
"# Applying a grid on a figure, one empty subplot\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.apply_grid([\"ab\"])\n",
" \n",
"# TODO\n",
"# Gridify example\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.cos, (-10, 10), group=\"b\")\n",
" figure.gridify()\n",
" \n",
"# TODO\n",
"# Gridify example, forced height\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.cos, (-10, 10), group=\"b\")\n",
" figure.gridify(height=2)\n",
" \n",
"# TODO\n",
"# Gridify example, forced width\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.plot(np.cos, (-10, 10), group=\"b\")\n",
" figure.gridify(width=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Saving figures"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Save a figure to a file\n",
"with replot.Figure(savepath=\"/tmp/out.png\") as figure:\n",
" figure.plot(np.cos, (-10, 10))"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\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('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",
"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 = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(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",
" 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",
" this.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 = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\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",
"\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",
"\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]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\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, 0, fig.canvas.width, fig.canvas.height);\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",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = 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.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",
" /* 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",
" evt.data.type = \"image/png\";\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",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://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",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\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",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" 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",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";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.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",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['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 = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\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.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" fig.root.unbind('remove')\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).html('<img src=\"' + dataURL + '\">');\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 dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\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 () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('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",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\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('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# or equivalently\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10))\n",
" figure.savepath = \"/tmp/out.png\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Some errors you might encounter"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "InvalidParameterError",
"evalue": "Second parameter in plot command should be a tuple specifying plotting interval.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-25-810be42c9f1a>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Invalid interval for plotting a function\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msin\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 213\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"__call__\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 214\u001b[0m \u001b[1;31m# We want to plot a function\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 215\u001b[1;33m \u001b[0mplot_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_plot_function\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 216\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 217\u001b[0m \u001b[1;31m# Else, it is a point series, and we just have to store it for\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36m_plot_function\u001b[1;34m(data, *args, **kwargs)\u001b[0m\n\u001b[0;32m 410\u001b[0m raise exc.InvalidParameterError(\n\u001b[0;32m 411\u001b[0m \u001b[1;34m\"Second parameter in plot command should be a tuple \"\u001b[0m \u001b[1;33m+\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 412\u001b[1;33m \"specifying plotting interval.\")\n\u001b[0m\u001b[0;32m 413\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx_values\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_values\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 414\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: Second parameter in plot command should be a tuple specifying plotting interval."
]
}
],
"source": [
"# Invalid interval for plotting a function\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.sin, None)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "InvalidParameterError",
"evalue": "You should pass at least one argument to this function.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-26-c2a8f48decbe>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Invalid plot call\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 202\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 203\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m--> 204\u001b[1;33m \"You should pass at least one argument to this function.\")\n\u001b[0m\u001b[0;32m 205\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 206\u001b[0m \u001b[1;31m# Extract custom kwargs (the ones from replot but not matplotlib) from\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: You should pass at least one argument to this function."
]
}
],
"source": [
"# Invalid plot call, no arguments given\n",
"with replot.Figure() as figure:\n",
" figure.plot()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "InvalidParameterError",
"evalue": "Group name cannot be longer than one unicode character.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-27-bdc8f64411e8>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Invalid group argument\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcos\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"abc\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mplot\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 207\u001b[0m \u001b[1;31m# kwargs\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 208\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 209\u001b[1;33m \u001b[0mkwargs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcustom_kwargs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_handle_custom_plot_arguments\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 210\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 211\u001b[0m \u001b[0mcustom_kwargs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36m_handle_custom_plot_arguments\u001b[1;34m(kwargs)\u001b[0m\n\u001b[0;32m 369\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"group\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m>\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 370\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m--> 371\u001b[1;33m \"Group name cannot be longer than one unicode character.\")\n\u001b[0m\u001b[0;32m 372\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"group\"\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0m_DEFAULT_GROUP\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 373\u001b[0m raise exc.InvalidParameterError(\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: Group name cannot be longer than one unicode character."
]
}
],
"source": [
"# Invalid group argument, groups are one unicode character long\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"abc\")"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "InvalidParameterError",
"evalue": "Grid cannot be an empty list.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-28-bfe80e3d8923>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcos\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"a\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply_grid\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mapply_grid\u001b[1;34m(self, grid_description)\u001b[0m\n\u001b[0;32m 126\u001b[0m \u001b[1;31m# Check that grid is not empty\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 127\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgrid_description\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 128\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mexc\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mInvalidParameterError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Grid cannot be an empty list.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 129\u001b[0m \u001b[1;31m# Check that all rows have the same number of elements\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 130\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mrow\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mgrid_description\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: Grid cannot be an empty list."
]
}
],
"source": [
"# Invalid grid, no grid provided\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.apply_grid([])"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "InvalidParameterError",
"evalue": "All rows must have the same number of elements.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mInvalidParameterError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-29-464bebd40870>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mreplot\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mFigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcos\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"a\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mfigure\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply_grid\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"a\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"ba\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/phyks/Code/replot/replot/__init__.py\u001b[0m in \u001b[0;36mapply_grid\u001b[1;34m(self, grid_description)\u001b[0m\n\u001b[0;32m 131\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrow\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mgrid_description\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 132\u001b[0m raise exc.InvalidParameterError(\n\u001b[1;32m--> 133\u001b[1;33m \"All rows must have the same number of elements.\")\n\u001b[0m\u001b[0;32m 134\u001b[0m \u001b[1;31m# TODO: Parse grid\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 135\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mInvalidParameterError\u001b[0m: All rows must have the same number of elements."
]
}
],
"source": [
"# Invalid grid, not a rectangular one\n",
"with replot.Figure() as figure:\n",
" figure.plot(np.cos, (-10, 10), group=\"a\")\n",
" figure.apply_grid([\"a\",\n",
" \"ba\"])"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "physique",
"language": "python",
"name": "physique"
},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}