aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/notebooks/Marketing Strategy.ipynb8066
1 files changed, 31 insertions, 8035 deletions
diff --git a/python/notebooks/Marketing Strategy.ipynb b/python/notebooks/Marketing Strategy.ipynb
index 00e06adf..7adbb4da 100644
--- a/python/notebooks/Marketing Strategy.ipynb
+++ b/python/notebooks/Marketing Strategy.ipynb
@@ -2,10 +2,8 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 120,
- "metadata": {
- "collapsed": true
- },
+ "execution_count": null,
+ "metadata": {},
"outputs": [],
"source": [
"import exploration.marketing as mk\n",
@@ -16,10 +14,8 @@
},
{
"cell_type": "code",
- "execution_count": 121,
- "metadata": {
- "collapsed": true
- },
+ "execution_count": null,
+ "metadata": {},
"outputs": [],
"source": [
"#Vary weights:size of investment and success_prob: likelihood of investment"
@@ -27,10 +23,8 @@
},
{
"cell_type": "code",
- "execution_count": 122,
- "metadata": {
- "collapsed": true
- },
+ "execution_count": null,
+ "metadata": {},
"outputs": [],
"source": [
"##----Now look at the consequence of the different approaches -----##\n",
@@ -47,1602 +41,9 @@
},
{
"cell_type": "code",
- "execution_count": 123,
- "metadata": {
- "scrolled": false
- },
- "outputs": [
- {
- "data": {
- "application/javascript": [
- "/* Put everything inside the global mpl namespace */\n",
- "window.mpl = {};\n",
- "\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",
- " if (mpl.ratio != 1) {\n",
- " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
- " }\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " 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 backingStore = this.context.backingStorePixelRatio ||\n",
- "\tthis.context.webkitBackingStorePixelRatio ||\n",
- "\tthis.context.mozBackingStorePixelRatio ||\n",
- "\tthis.context.msBackingStorePixelRatio ||\n",
- "\tthis.context.oBackingStorePixelRatio ||\n",
- "\tthis.context.backingStorePixelRatio || 1;\n",
- "\n",
- " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
- " canvas.attr('height', height * mpl.ratio);\n",
- " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
- " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
- " var x1 = msg['x1'] / mpl.ratio;\n",
- " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 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 * mpl.ratio;\n",
- " var y = canvas_pos.y * mpl.ratio;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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",
- " var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\n",
- " fig.close_ws(fig, msg);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.close_ws = function(fig, msg){\n",
- " fig.send_message('closing', msg);\n",
- " // fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var width = this.canvas.width/mpl.ratio\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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",
- " // select the cell after this one\n",
- " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
- " IPython.notebook.select(index + 1);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\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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\" width=\"640\">"
- ],
- "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",
- "\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",
- " if (mpl.ratio != 1) {\n",
- " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
- " }\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " 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 backingStore = this.context.backingStorePixelRatio ||\n",
- "\tthis.context.webkitBackingStorePixelRatio ||\n",
- "\tthis.context.mozBackingStorePixelRatio ||\n",
- "\tthis.context.msBackingStorePixelRatio ||\n",
- "\tthis.context.oBackingStorePixelRatio ||\n",
- "\tthis.context.backingStorePixelRatio || 1;\n",
- "\n",
- " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
- " canvas.attr('height', height * mpl.ratio);\n",
- " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
- " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
- " var x1 = msg['x1'] / mpl.ratio;\n",
- " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 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 * mpl.ratio;\n",
- " var y = canvas_pos.y * mpl.ratio;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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",
- " var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\n",
- " fig.close_ws(fig, msg);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.close_ws = function(fig, msg){\n",
- " fig.send_message('closing', msg);\n",
- " // fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var width = this.canvas.width/mpl.ratio\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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",
- " // select the cell after this one\n",
- " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
- " IPython.notebook.select(index + 1);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\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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\" width=\"640\">"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "{'Expected Raised': 99.99999999999966,\n",
- " 'Probability over 50mm': 0.58877171340549939,\n",
- " 'Raising No Capital': 0.10377354885116369}"
- ]
- },
- "execution_count": 123,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
"source": [
"df = mk.run_scenario(pool_size, rho, successprob, issuerweights, zero_recov)\n",
"ax = mk.plot_prob_over(df)\n",
@@ -1652,7 +53,7 @@
},
{
"cell_type": "code",
- "execution_count": 124,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -1669,1600 +70,9 @@
},
{
"cell_type": "code",
- "execution_count": 125,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "application/javascript": [
- "/* Put everything inside the global mpl namespace */\n",
- "window.mpl = {};\n",
- "\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",
- " if (mpl.ratio != 1) {\n",
- " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
- " }\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " 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 backingStore = this.context.backingStorePixelRatio ||\n",
- "\tthis.context.webkitBackingStorePixelRatio ||\n",
- "\tthis.context.mozBackingStorePixelRatio ||\n",
- "\tthis.context.msBackingStorePixelRatio ||\n",
- "\tthis.context.oBackingStorePixelRatio ||\n",
- "\tthis.context.backingStorePixelRatio || 1;\n",
- "\n",
- " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
- " canvas.attr('height', height * mpl.ratio);\n",
- " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
- " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
- " var x1 = msg['x1'] / mpl.ratio;\n",
- " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 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 * mpl.ratio;\n",
- " var y = canvas_pos.y * mpl.ratio;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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",
- " var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\n",
- " fig.close_ws(fig, msg);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.close_ws = function(fig, msg){\n",
- " fig.send_message('closing', msg);\n",
- " // fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var width = this.canvas.width/mpl.ratio\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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",
- " // select the cell after this one\n",
- " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
- " IPython.notebook.select(index + 1);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydBZhUZfuH711aUkpKBERaSmmUFLE+MRALFUXFrk8+ERUVFRsxPgu7PlsMRKWRFFBCQDqlY+na3f/1jOfwH8eNmXNmdnd2fu91cQE7541zv8/s3PPWSUJJBERABERABERABEQgoQgkJdTd6mZFQAREQAREQAREQASQACoIREAEREAEREAERCDBCEgAE6zDdbsiIAIiIAIiIAIiIAFUDIiACIiACIiACIhAghGQACZYh+t2RUAEREAEREAEREACqBgQAREQAREQAREQgQQjIAFMsA7X7YqACIiACIiACIiABFAxIAIiIAIiIAIiIAIJRkACmGAdrtsVAREQAREQAREQAQmgYkAEREAEREAEREAEEoyABDDBOly3KwIiIAIiIAIiIAISQMWACIiACIiACIiACCQYAQlggnW4blcEREAEREAEREAEJICKAREQAREQAREQARFIMAISwATrcN2uCIiACIiACIiACEgAFQMiIAIiIAIiIAIikGAEJIAJ1uG6XREQAREQAREQARGQACoGREAEREAEREAERCDBCEgAE6zDdbsiIAIiIAIiIAIiIAFUDIiACIiACIiACIhAghGQACZYh+t2RUAEREAEREAEREACqBgQAREQAREQAREQgQQjIAFMsA7X7YqACIiACIiACIiABFAxIAIiIAIiIAIiIAIJRkACmGAdrtsVAREQAREQAREQAQmgYkAEREAEREAEREAEEoyABDDBOly3KwIiIAIiIAIiIAISQMWACIiACIiACIiACCQYAQlggnW4blcEREAEREAEREAEJICKAREQAREQAREQARFIMAISwATrcN2uCIiACIiACIiACEgAFQMiIAIiIAIiIAIikGAEJIAJ1uG6XREQAREQAREQARGQACoGREAEREAEREAERCDBCEgAE6zDdbsiIAIiIAIiIAIiIAFUDIiACIiACIiACIhAghGQACZYh8fh7V4FvBXU7lRgA/ATcB+wLor35NbVApgZpXIfBAYBFYAt2ZQ53nm9Y9B16cBDgJVjyV4bB3QC3OvPBFoGXROlpkdUzCPAFUAVYDdQJqLckV3s9lNNYGUEWe1aY2b5czLVBX4FvgIuDan4aGA+sBZoC1h8J3IyPhWB52IAwUuMPgvcAXwH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LmwBvOPj3/jy13UMPLM+155q51MriYAIiIAIiIAI5AYBCaAE0G/chS2A//50Dp/NWst/utfjho52HKGSCIiACIiACIhAbhCQAEoA/cZd2AI44Iu5fDRjDXedVodbupzgt17lFwEREAEREAER8EhAAigB9Bg6R7KFLYD3fzWf96at4tYuJxP+Rr8AACAASURBVHDnaXX81qv8IiACIiACIiACHglIACWAHkMncgF86JvfeWvySm7seDz9u9fzW6/yi4AIiIAIiIAIeCQgAZQAegydyAXwsZELeW3icq47tRb3nmlPm1MSAREQAREQARHIDQISQAmg37gLewr4yVGL+O/4ZfRpV4NB59gjjJVEQAREQAREQARyg4AEUALoN+7CFsBnf1rM82OWBA6BtsOglURABERABERABHKHgARQAug38sIWQJM/k8BLWlZnyPkn+q1X+UVABERABERABDwSkABKAD2GzpFsYQvgf8cv5clRf9DzpGo81bOJ33qVXwREQAREQAREwCMBCaAE0GPoRC6Ar09czqMjF3Jes6oM7dXUb73KLwIiIAIiIAIi4JGABFAC6DF0IhfAtyav4KFvFnB248q8eGlzv/UqvwiIgAiIgAiIgEcCEkAJoMfQiVwA7RBoOwy6e8NKvNL7JL/1Kr8IiIAIiIAIiIBHAhJACaDH0IlcAP83YzX3fDGPrvUrMvzKFn7rVX4REAEREAEREAGPBCSAEkCPoRO5AH46cw13fzaXjnUr8Hafln7rVX4REAEREAEREAGPBCSAEkCPoRO5AH716zpu//g32tcuz/t9W/mtV/lFQAREQAREQAQ8EpAASgA9hk7kAvjt3D+5+cNfaVWzLB9f38ZvvcovAiIgAiIgAiLgkYAEUALoMXQiF8BR8zfQ7/1ZnHTc0Xx+Q1u/9Sq/CIiACIiACIiARwISQAmgx9CJXADHLNzINe/MpEm10oy4ub3fepVfBERABERABETAIwEJoATQY+hELoATFm/myjdn0KByKUbedorfepVfBERABERABETAIwEJoATQY+hELoBTlm7h0uHTqXNMCX68o4PfepVfBERABERABETAIwEJoATQY+hELoDTl2+l12vTqFWhOGPv6ui3XuUXAREQAREQARHwSEACKAH0GDqRC+CsVdu54OUpVC97FBP7d/Jbr/KLgAiIgAiIgAh4JCAB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ARGQAB6JgSRFgy8CMRPAmSu3ceErU6lR7ijG393JVyOVWQREQAREQARE4P8JaARQI4B+3w8xE8D561I4+4WfOaZUEabfaw8yURIBERABERABEYgGAQmgBNBvHMVMAJdt3k2XZyZQulgh5gzq5redyi8CIiACIiACIuAQkABKAP2+GWImgOt27KPd42MpXDCZxY+c4bedyi8CIiACIiACIiABPBIDWgPo7+0QMwHctucgzQf/FGjdssfOpECyuspfVym3CIiACIiACPxFQCOAGgH0+16ImQDuO5hK/QdGBdq34OHTOapwQb9tVX4REAEREAEREAEJYCAGNKzk760QMwFMS0un1r0jA62bdV9XypUo4q+lyi0CIiACIiACIqARQCcGJID+3gwxE0BrVt37vufA4TQm39OZqmWK+WupcouACIiACIiACEgAJYBReRfEVACbPvwjO/YeYvSdHahdsURUGqxCREAEREAERCDRCWgNoKaA/b4HYiqArR8bw4ad+/n2lvY0qlrab1uVXwREQAREQAREQGsAAzGgKWB/b4WYCmCnp8ezYssePuvXhpNrlPXXUuUWAREQAREQARHQFLCmgKPyLoipAJ4xbBIL1+/kvWtacsoJFaLSYBUiAiIgAiIgAolOQFPAGgH0+x6IqQCe99/J/Lp6B6/1PoluDSv5bavyi4AIiIAIiIAIaApYU8BReBfEVAAvfX0aU5Zt5flLmvGvJlWi0FwVIQIiIAIiIAIioBFAjQD6fRfEVACvfvsXxi7axJMXNOaiFsf6bavyi4AIiIAIiIAIaARQI4BReBfEVABv+mA2381bz0P/asiVbWtEobkqQgREQAREQAREQCOAGgH0+y6IqQDe9ckcPp+9lgFn1OP6Dsf7bavyi4AIiIAIiIAIaAQwR0YAVwJvAm8Dq/Nh1MVUAAd+OY8Ppq/m9q4ncHvXOvkQn25JBERABERABHKegEYAYz8CeAtwFdAEGAe8AXwJHMj57o5JjTEVwEe+XcDwn1dwfYdaDDijfkxuQIWKgAiIgAiIQKIRkADGXgDdmDIBvBq4BCgIfOiMDM6O86CLqQA+8+MfvDB2KVe1rcGD/2oY56jUfBEQAREQARHIGwQkgDkngG6PFwJuBJ4A7N/zgWHAW0B63giLiFoRUwF8adxSnvrhD3qdfCxPXNg4oobpYhEQAREQAREQ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\" width=\"640\">"
- ],
- "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",
- "\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",
- " if (mpl.ratio != 1) {\n",
- " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
- " }\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " 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 backingStore = this.context.backingStorePixelRatio ||\n",
- "\tthis.context.webkitBackingStorePixelRatio ||\n",
- "\tthis.context.mozBackingStorePixelRatio ||\n",
- "\tthis.context.msBackingStorePixelRatio ||\n",
- "\tthis.context.oBackingStorePixelRatio ||\n",
- "\tthis.context.backingStorePixelRatio || 1;\n",
- "\n",
- " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
- " canvas.attr('height', height * mpl.ratio);\n",
- " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
- " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
- " var x1 = msg['x1'] / mpl.ratio;\n",
- " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 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 * mpl.ratio;\n",
- " var y = canvas_pos.y * mpl.ratio;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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",
- " var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\n",
- " fig.close_ws(fig, msg);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.close_ws = function(fig, msg){\n",
- " fig.send_message('closing', msg);\n",
- " // fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var width = this.canvas.width/mpl.ratio\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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",
- " // select the cell after this one\n",
- " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
- " IPython.notebook.select(index + 1);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\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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\" width=\"640\">"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "{'Expected Raised': 99.99938465124548,\n",
- " 'Probability over 50mm': 0.3100285576025133,\n",
- " 'Raising No Capital': 0.63272323221248794}"
- ]
- },
- "execution_count": 125,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"df = mk.run_scenario(pool_size, rho, successprob, issuerweights, zero_recov)\n",
"mk.plot_prob_over(df)\n",
@@ -3272,10 +82,8 @@
},
{
"cell_type": "code",
- "execution_count": 138,
- "metadata": {
- "collapsed": true
- },
+ "execution_count": null,
+ "metadata": {},
"outputs": [],
"source": [
"#Current pipeline\n",
@@ -3302,20 +110,9 @@
},
{
"cell_type": "code",
- "execution_count": 139,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(491, 64)"
- ]
- },
- "execution_count": 139,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"bins = [0,0.1, 50, 100, 150, 200, 250, 300, 350, 400, 450, pool_size]\n",
"pool_size, sum(num)"
@@ -3323,1600 +120,9 @@
},
{
"cell_type": "code",
- "execution_count": 140,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "application/javascript": [
- "/* Put everything inside the global mpl namespace */\n",
- "window.mpl = {};\n",
- "\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",
- " if (mpl.ratio != 1) {\n",
- " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
- " }\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " 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 backingStore = this.context.backingStorePixelRatio ||\n",
- "\tthis.context.webkitBackingStorePixelRatio ||\n",
- "\tthis.context.mozBackingStorePixelRatio ||\n",
- "\tthis.context.msBackingStorePixelRatio ||\n",
- "\tthis.context.oBackingStorePixelRatio ||\n",
- "\tthis.context.backingStorePixelRatio || 1;\n",
- "\n",
- " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
- " canvas.attr('height', height * mpl.ratio);\n",
- " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
- " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
- " var x1 = msg['x1'] / mpl.ratio;\n",
- " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 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 * mpl.ratio;\n",
- " var y = canvas_pos.y * mpl.ratio;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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",
- " var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\n",
- " fig.close_ws(fig, msg);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.close_ws = function(fig, msg){\n",
- " fig.send_message('closing', msg);\n",
- " // fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var width = this.canvas.width/mpl.ratio\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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",
- " // select the cell after this one\n",
- " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
- " IPython.notebook.select(index + 1);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\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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\" width=\"640\">"
- ],
- "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",
- "\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",
- " if (mpl.ratio != 1) {\n",
- " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
- " }\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " 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 backingStore = this.context.backingStorePixelRatio ||\n",
- "\tthis.context.webkitBackingStorePixelRatio ||\n",
- "\tthis.context.mozBackingStorePixelRatio ||\n",
- "\tthis.context.msBackingStorePixelRatio ||\n",
- "\tthis.context.oBackingStorePixelRatio ||\n",
- "\tthis.context.backingStorePixelRatio || 1;\n",
- "\n",
- " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
- " canvas.attr('height', height * mpl.ratio);\n",
- " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
- " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
- " var x1 = msg['x1'] / mpl.ratio;\n",
- " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 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 * mpl.ratio;\n",
- " var y = canvas_pos.y * mpl.ratio;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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",
- " var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\n",
- " fig.close_ws(fig, msg);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.close_ws = function(fig, msg){\n",
- " fig.send_message('closing', msg);\n",
- " // fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var width = this.canvas.width/mpl.ratio\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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",
- " // select the cell after this one\n",
- " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
- " IPython.notebook.select(index + 1);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4Xu2dB5i1R123b2poSehCMCSASEekiPQiHQKhJEAEKQIhIL2FZkIH6b2JgCACKk0DBJAqHWmC0lsCSPcNIvBB4Lt+Ouf7nhx33/c5++7sM8+ce64rV5LdOXNm7v9zdu+d8p9TYZGABCQgAQlIQAISWCsCp1qr0TpYCUhAAhKQgAQkIAEUQB8CCUhAAhKQgAQksGYEFMA1C7jDlYAEJCABCUhAAgqgz4AEJCABCUhAAhJYMwIK4JoF3OFKQAISkIAEJCABBdBnQAISkIAEJCABCawZAQVwzQLucCUgAQlIQAISkIAC6DMgAQlIQAISkIAE1oyAArhmAXe4EpCABCQgAQlIQAH0GZCABCQgAQlIQAJrRkABXLOAO1wJSEACEpCABCSgAPoMSEACEpCABCQggTUjoACuWcAdrgQkIAEJSEACElAAfQYkIAEJSEACEpDAmhFQANcs4A5XAhKQgAQkIAEJKIA+AxKQgAQkIAEJSGDNCCiA4wMeVgcAPx7/EmtKQAISkIAEJCCBbSWwL/At4Nd706oCOJ7e+YATx1e3pgQkIAEJSEACEqhC4DeBb+5NywrgeHr7AbtOOOEE9tsv/2mRgAQkIAEJSEACO0fgpJNO4sADD8wb7g+ctDfvrACOp/ffArhr1y4FcDwza0pAAhKQgAQksE0EIoD77x/3UwC3CemoZhTAUZisJAEJSEACEpBADQIKYA2qe25TAdwzI2tIQAISkIAEJFCJgAJYCewemlUAp+Huu0pAAhKQgAQkkE1/LgFP8hwogJNg900lIAEJSEACEggBBXCa50ABnIa77yoBCUhAAhKQgAI42TOgAE6G3jeWgAQkIAEJSMAZwGmeAQVwGu6+qwQkIAEJSEACzgBO9gwogJOh940lIAEJSEACEnAGcJpnQAGchrvvKgEJSEACEpCAM4CTPQMK4GTofWMJSEACEpCABJwBnOYZUACn4e67SkACEpCABCTgDOBkz4ACOBl631gCEpCABCQgAWcAp3kGFMBpuPuuEpCABCQgAQk4AzjZM6AATobeN5aABCQgAQlIwBnAaZ6BtRXAg48+rjrxrz3xxtXfwzeQgAQkIAEJzJmAAjhN9BTAitwVwIpwbVoCEpCABLogoABOE0YFsCJ3BbAiXJuWgAQkIIEuCCiA04RRAazIXQGsCNemJSABCUigCwIK4DRhVAArclcAK8K1aQlIQAIS6IKAAjhNGBXAitwVwIpwbVoCEpCABLogoABOE0YFsCJ3BbAiXJuWgAQkIIEuCCiA04RRAazIXQGsCNemJSABCUigCwIK4DRhVAArclcAK8K1aQlIQAIS6IKAAjhNGBXAitwVwIpwbVoCEpCABLogoABOE0YFsCJ3BbAiXJuWgAQkIIEuCCiA04RRAazIXQGsCNemJSABCUigCwIK4DRhVAArclcAK8K1aQlIQAIS6IKAAjhNGBXAitwVwIpwbVoCEpCABLogoABOE0YFsCJ3BbAiXJuWgAQkIIEuCCiA04RRAazIXQGsCNemJSABCUigCwIK4DRhVAArclcAK8K1aQlIQAIS6IKAAjhNGBXAitwVwIpwbVoCEpCABLogoABOE0YFsCJ3BbAiXJuWgAQkIIEuCCiA04RRAazIXQGsCNemJSABCUigCwIK4DRhVAArclcAK8K1aQlIQAIS6IKAAjhNGBXAitwVwIpwbVoCEpCABLogoABOE0YFsCJ3BbAiXJuWgAQkIIEuCCiA04RRAazIXQGsCNemJSABCUigCwK9C+CxwDFLkfoOcJ7ytVOV798NOBvwYeCewGfL9/cB/hy4GfBt4CjgnYP2HgwcCNxrxadBAVwR2CrVFcBVaFlXAhKQgATWkcA6COCtgOsMgnsy8L3y/w8BHg7cEfgC8Ajg6sBFgB8XsYv0HQbcEHhQkcdfAxcAjgcuD5y04sOjAK4IbJXqCuAqtKwrAQlIQALrSGAdBPBQ4DIbBDezf98CngE8aTDjlxnCiOELgecVuTsaOCPwX8C5i0C+tdR5/RYeHAVwC9DGvkQBHEvKehKQgAQksK4E1kEAM2u3C/h5WeJ9GPAV4ILAl4HLAp8YPABvBP4DuANwJHB74LrA9YsQng/4QyAzi5HLMSVLyflnUfYFTty1axf77RcXXJ9y8NHHVR+sAlgdsW8gAQlIQAIzJ9C7AGbZ9kxlefc3yhLvRYFLlGXe9wMRuswELsqLgIOK8J2uzBDeCPg+cD/gX4GPAtcCsnfwNkUk7wx8c5PnYaO9iCiAdT49CmAdrrYqAQlIQAL9EOhdAJcjdeYia38GfAiIAB5QDngs6r64HOy4wSZhflmZMfwq8HjgikAOg1wSuOUmr3EGsIBxBrCfHx6ORAISkIAE5ktg3QQwkXo78CXgySOWgJcje23gicCVyut/WeQvM4rvBc4x8lFwD+BIUFup5gzgVqj5GglIQAISWCcC6yaAmYnLvr8s8z6mLP0+HciMYMrpge8ODoEMn4UzlJm/I8q/nwn8qiwL55DJu4Gzjnx4FMCRoLZSTQHcCjVfIwEJSEAC60SgdwF8CvD3wDfK6d2kebkGcCng60X0HgrcCfgikAMi1xykgRk+C1nujSA+sHzx8DILeAhwb+C8wI1HPjwK4EhQW6mmAG6Fmq+RgAQkIIF1ItC7AL665PU7Z0ndkn1/jywHORLnRSLonPYdJoL+zNJDkP19SfeSmb6flO+dGnhOORH8eSAzg1laHlMUwDGUtlhHAdwiOF8mAQlIQAJrQ6B3AWw1kApgxcgogBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBYJ0E8KHA44FnAvct0dsHeApwW+CMwD8C9wBOLN8/O/By4FrAF4A7AZ8aRP55wJeBp674NCiAKwJbpboCuAot60pAAhKQwDoSWBcBvALwWuAk4F0DAXw+cAhwR+AHReQifZcDTi7/n/++G3AUcFUgbaVcCXg2cMVSd5XnRwFchdaKdRXAFYFZXQISkIAE1o7AOgjgWYCPl5m9RwCfLAK4P/A94PbAa0rkDwBOAG4EHA+8GXgT8ALgYsDHgDMDpwM+CtylfG3VB0cBXJXYCvUVwBVgWVUCEpCABNaSwDoIYJZwfwjcD3j3QACvXZZ8M+P3o0H0s8T7BuAY4AnAhYAjgD8Bbl1m/iKS5xzMJK768CiAqxJbob4CuAIsq0pAAhKQwFoS6F0AbwM8vCzb/mxJACN1LwWyD3BY3gZ8FTgSyCxhlomvAnytLAP/AjiuiODjgOuVWcC7Ars2eYryHsP32Tf7DHft2sV++8UF16ccfHTQ1S0KYF2+ti4BCUhAAvMn0LMAHljELIK2OLgxnAHcTADfXg523H2T8L6zHCQ5CLgJcGPgxWUP4QM2ec2xZUbxFN9WAOt8gBTAOlxtVQISkIAE+iHQswAeCrx+6YDGaYBfA78Crg+8A9jdEvBypO9cpO8WwOvK63MSOBL46HJ4ZKOnwxnAQsUZwH5+eDgSCUhAAhKYL4GeBTDLrJmlG5Ys+X4OeFI57JFDILcrJ4RT77wlBcziEMjwtecCPlJOAn8TeCOwmA2MbGaW7zIjHwX3AI4EtZVqzgBuhZqvkYAEJCCBdSLQswBuFMfhEnC+n/19WcZNGpgcFElOwHMM0sAM23gV8AHgOeWLDwYOL6eIkwcw+wbvOfLhUQBHgtpKNQVwK9R8jQQkIAEJrBOBdRfAMwBPLqd8h4mgkwpmWLJcnCXe5P7L8nHKmYCXATcoM4PZU/jdkQ+PAjgS1FaqKYBboeZrJCABCUhgnQismwC2ElsFsGIkFMCKcG1aAhKQgAS6IKAAThNGBbAidwWwIlybloAEJCCBLggogNOEUQGsyF0BrAjXpiUgAQlIoAsCCuA0YVQAK3JXACvCtWkJSEACEuiCgAI4TRgVwIrcFcCKcG1aAhKQgAS6IKAAThNGBbAidwWwIlybloAEJCCBLggogNOEUQGsyF0BrAjXpiUgAQlIoAsCCuA0YVQAK3JXACvCtWkJSEACEuiCgAI4TRgVwIrcFcCKcG1aAhKQgAS6IKAAThNGBbAidwWwIlybloAEJCCBLggogNOEUQGsyF0BrAjXpiUgAQlIoAsCCuA0YVQAK3JXACvCtWkJSEACEuiCQGsCeCrgGsDVgIOBMwHfAz4BvAM4oQvqoABWDKQCWBGuTUtAAhKQQBcEWhHAMwL3A+4BnAP4FPBN4KfA2YFLAgcAbwMeDXxo5vQVwIoBVAArwrVpCUhAAhLogkArApiZvQ8DLwOOB36xAd2DgCOAuwOPBV484wgogBWDpwBWhGvTEpCABCTQBYFWBDAzfJ8ZSfT0QGTwiyPrt1hNAawYFQWwIlybloAEJCCBLgi0IoBdwFxhEArgCrBWraoArkrM+hKQgAQksG4EWhbA0wJHAtcETgO8H3gu8LMOgqQAVgyiAlgRrk1LQAISkEAXBFoWwOcBvw28Djgd8EfAF4DbdkBeAawYRAWwIlybloAEJCCBLgi0JIA3B14/oPol4CLAyeVrFy2nf8/aAXkFsGIQFcCKcG1aAhKQgAS6INCSAP4D8EvgniUFzGuBXcDflRnAuwJJF3PdDsgrgBWDqABWhGvTEpCABCTQBYGWBDBAbwM8BngW8ArgkUt7AI8tiaHnDl8BrBhBBbAiXJuWgAQkIIEuCLQmgIGaJd4nA5cuh0A+2QXpUw5CAawYVAWwIlybloAEJCCBLgi0KIALsFcvp37fCvxpuRWkC+h4FVzVOCqAVfHauAQkIAEJdECgJQE8EHgKcHHg08ADgR8AjwBuDdwXeEsHzDMEZwArBlIBrAjXpiUgAQlIoAsCLQngu4DvlOvgrg9cCLhpoXwx4IXAvwOHd0BeAawYRAWwIlybloAEJCCBLgi0JIA/Bi4DfBk4FfBV4OAlyncDXtQBeQWwYhAVwIpwbVoCEpCABLog0JIAvgc4EXg5cB0gs36HdEH5fw9CAawYWAWwIlybloAEJCCBLgi0JIAHAU8t4peTvw8CvtUFZQXw/xE4+OjjqodUAayO2DeQgAQkIIGZE2hJAGeOcqXuOwO4Eq7VKiuAq/GytgQkIAEJrB+BVgTwzMBPVsC/av0Vmt6RqgpgRcwKYEW4Ni0BCUhAAl0QaEUAvw08u5wA3mzZNwdDsjfw/sB7gSfMOAIKYMXgKYAV4dq0BCQgAQl0QaAVAbwI8NiS9iX7/z5W9v/9DDhbyQ14JeAXRfxyEvjkGUdAAawYPAWwIlybloAEJCCBLgi0IoALmL8JHAbkFpCkgDkj8H3gE8DxwJuBX3VAXgGsGEQFsCJcm5aABCQggS4ItCaAXUAdMQgFcASkrVZRALdKztdJQAISkMC6EFAAp4m0AliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwRaFMCvAX9RkkJ/owvK/3sQCmDFwCqAFeHatAQkIAEJdEGgRQG8F3BH4HeAdwEvAV4P/LwL4v8zCAWwYjAVwIpwbVoCEpCABLog0KIALsBGAO8M3BY4LfCqMjP48Q7IK4AVg6gAVoRr0xKQgAQk0AWBlgVwAfh0wD2AJwH5788AzwReCvx6plFQACsGTgGsCNemJSABCUigCwItC2Bk7+bAnYDrAh8qy8EHAH9SloePmGkUFMCKgVMAK8K1aQlIQAIS6IJAiwJ42SJ9Wfo9GXgF8OfA5wbErwC8t9wVPMdAKIAVo6YAVoRr0xKQgAQk0AWBFgUw0vf2Mtv3BuAXG5A+M/CcIopzDIQCWDFqCmBFuDYtAQlIQAJdEGhRAA8Cvt4F3c0HoQBWDLACWBGuTUtAAhKQQBcEWhTArwBZ4v3BEuGzAjkBfMEOyCuAFYOoAFaEa9MSkIAEJNAFgRYF8FfAeYDvLhH+DSCJofdZgfxRQP45uLzms8CjgbeU/09bTympZs4I/GM5cXxi+f7ZgZcD1wK+UJacPzV4/+cBXwaeukKfUlUBXBHYKtUVwFVoWVcCEpCABNaRQEsCeNMSgOz7uwOwaxCQ0wB/UE4DX2SFQB1SDpJ8qbwm7T4I+F0gMvh8IHWSeDozjhG5SN/lyuvy//nvuxWRvGqZnUxzVwKeDVyx1F2hWwrgKrBWrasArkrM+hKQgAQksG4EWhLAzPylJLffqZYCkYMguSLuAcA/7GWQflgk8G+B7wG3B15T2kyKmROAGwHHA28G3gS8ALgY8DEgB1CSouajwF3K11btkjOAqxJbob4CuAIsq0pAAhKQwFoSaEkAFwH4apll+/42RySziIeVJd3MAGaZOUu+mfH70eC9ssSbWchjgCcAFwKSbzC5B29dZv4eAZwTuO8W+6gAbhHcmJcpgGMoWUcCEpCABNaZQIsCuN3xuBTwQeAMwH8WmcvMXqQut4ks7yl8GxAJPRLYvywTX6XMQGY/YWYjjysi+DjgemUW8K5Ly9bDceQ9hu+zL3Dirl272G+/uOD6lIOPDrq6RQGsy9fWJSABCUhg/gRaEcB7Ay8Cfgbkv3dXnrUi9tMD5wdyiviWZdn2GsBlNhHA5CDMwY67b/I+7yxX0SVdzU2AGwMvLnsIs0S9UTm2zCie4nsK4IqRHFldARwJymoSkIAEJLC2BFoRwMy4Xb5IVP57s5L9gXubBuYdRfCy729PS8DL/bhzkb5bAK8D0lZOAkcCc7o4B0Y2Ks4AFirOAK7tzxoHLgEJSEACDRFoRQB3EkmkLwc97lMOgdwOeG3pwHmzNDs4BDLs17mAjwA5CfxN4I3AYjbwUCCzfJlVHFPcAziG0hbrOAO4RXC+TAISkIAE1oZA7wL4+JLzL8KXfXe3AY4GblCum0samCzjJg1MTgcnJ+A5Bmlghg/Cq4APlCvo8vUHA4eXU8RJF5OZy3uOfHIUwJGgtlJNAdwKNV8jAQlIQALrRKAVAXzaCtDvv0Ldl5T8gZnZS17BTwNPKvKXZnIw5MnlQMgwEXSEcViuX5Z4k/tvka7mTMDLikxmZjCHSpaTV2/WVQVwhSCuWlUBXJWY9SUgAQlIYN0ItCKA7xoJPnsArz2ybsvVFMCK0VEAK8K1aQlIQAIS6IJAKwLYBcwVBqEArgBr1aoK4KrErC8BCUhAAutGQAGcJuIKYEXuCmBFuDYtAQlIQAJdEGhFAJNSJQcxTirpVXYHNylY5l4UwIoRVAArwrVpCUhAAhLogkArApgbOZIA+sclOfPu4N6pA/IKYMUgKoAV4dq0BCQgAQl0QaAVAewC5gqDUABXgLVqVQVwVWLWl4AEJCCBdSPQsgCeG7gIkJO/X1ghxcocYqgAVoySAlgRrk1LQAISkEAXBFoUwMjRc0vS5tMUyicDubotiZaTz2/uRQGsGEEFsCJcm5aABCQggS4ItCiAuZYtV6rdC/hgmQG8MvDMksg5t2/MvSiAFSO4EwLoncYVA2jTEpCABCRQnUCLAvgTIDdv/NPS6K8GvBU4c3Uq9d9AAazIWAGsCNemJSABCUigCwItCuA3gBsD/7JE+NLAm4Hf7IC8AlgxiApgRbg2LQEJSEACXRBoUQDvBhwG/BHw7UL5PMDLS47AF3ZAXgGsGEQFsCJcm5aABCQggS4ItCKAnyh7/RZQLwzsA2Q2MOX8wM+BLwKX7YC8AlgxiApgRbg2LQEJSEACXRBoRQCPWYHmo1ao22pVBbBiZBTAinBtWgISkIAEuiDQigB2AXOFQSiAK8BataoCuCox60tAAhKQwLoRUACnibgCWJG7AlgRrk1LQAISkEAXBFoUwCR/vh+QfH/Z+3f6JdJn74C8AlgxiApgRbg2LQEJSEACXRBoUQAfDdwFeBrwGOBxwMHAoUC+96wOyCuAFYOoAFaEa9MSkIAEJNAFgRYF8MvAvYHjgB+XW0EWX/t94IgOyCuAFYOoAFaEa9MSkIAEJNAFgRYFMDeBXKykgEkewCSF/jhwQSDpYvbvgLwCWDGICmBFuDYtAQlIQAJdEGhRAD9fkkB/GHhfmQl8InBr4NnAuTsgrwBWDKICWBGuTUtAAhKQQBcEWhTAyN5JwOOBWwF/DXytHAh5OnB0B+QVwIpBVAArwrVpCUhAAhLogkCLArgMNvv+rgx8CXhTF9RBAawYSAWwIlybloAEJCCBLgjMQQC7AL00CAWwYlQVwIpwbVoCEpCABLog0KoAXgS4VzkM8mvgc2X/X/YH9lAUwIpRVAArwrVpCUhAAhLogkCLArjY9/cx4IOFcpaBr1BSwPxNB+QVwIpBVAArwrVpCUhAAhLogkCLAvgV4JXAny4RfhRw+5IOZu7wFcCKEVQAK8K1aQlIQAIS6IJAiwL4X8Cly6GPIeQLA58CztQBeQWwYhAVwIpwbVoCEpCABLog0KIAvhnIMu9LlwjfCbgNcP0OyCuAFYOoAFaEa9MSkIAEJNAFgVYE8KYDmgeUO39fC3yofD17AA8DjgFe0AF5BbBiEBXAinBtWgISkIAEuiDQigD+aiTNnAg+zci6LVdTACtGRwGsCNemJSABCUigCwKtCGAXMFcYhAK4AqxVqyqAqxKzvgQkIAEJrBsBBXCaiCuAFbkrgBXh2rQEJCABCXRBoFUBvAbwwEEi6H8Dngy8rwvqXgVXNYwKYFW8Ni4BCUhAAh0QaFEAb1dOAL8OeD9wqnIX8M2BOwKv6oC7M4AVg6gAVoRr0xKQgAQk0AWBFgUws30vAp6+RPj+wF3LrODc4SuAFSOoAFaEa9MSkIAEJNAFgRYF8OfAJTZIBP1bwGeAM3RAXgGsGEQFsCJcm5aABCQggS4ItCiAXyr7/V64RPjIsi8wN4LMvSiAFSOoAFaEa9MSkIAEJNAFgRYF8CjgGcBfAB8AkvvvqmX/332AZTGcYyAUwIpRUwArwrVpCUhAAhLogkCLAhiwOfDxgMF+v8Up4Dd2Qd1TwFXDqABWxWvjEpCABCTQAYHWBDC3fGS279PAjzrgu9kQnAGsGFwFsCJcm5aABCQggS4ItCaAgfqzMvP31S4IbzwIBbBicBXAinBtWgISkIAEuiDQogB+FDga+McuCCuApyBw8NHHVQ+rAlgdsW8gAQlIQAIzJ9CiAF4PeBLwSOCfgZ8sMT5p5szTfWcAKwZRAawI16YlIAEJSKALAi0K4K8GZHMCeFFyI0j+P/sE514UwIoRVAArwrVpCUhAAhLogkCLAnjNInqbAX5PB+QVwIpBVAArwrVpCUhAAhLogkCLAtgF2D0MQgGsGGUFsCJcm5aABCQggS4ItCSAZyo3gBwKnA54B3Bv4PtdkD7lIBTAikFVACvCtWkJSEACEuiCQEsC+GTgHsBflVQwtwXeDRzWBWkF8L8JeAp4/NO8EyI7vjfWlIAEJCCBngi0JIBfBh4OvLoA/j3g/cAZgJN7gu4p4LrR3Alx6kVk60bC1iUgAQlIoFUCLQng/wEuAHxzAOunwG8DJ2wR4EOBWwAXBdJW7hZ+CPD5QXv7AE8BMuN4xpJ/MDORJ5Y6ZxtsgaQAACAASURBVAdeDlwL+AJwJ+BTg9c/D4i8PnWFProEvAKsVasqgKsSs74EJCABCawbgZYEMLN85wG+NwjCj4FLA1u9FeStZUYxyaVPCzwOuBRw8UF+wecDhwB3BH5QRC7Sd7ky8xixy3/fDTiqXFV3hdLHKwHPBq644iylAljxk6YAVoRr0xKQgAQk0AWBlgQw+f/eAvx8QDZi9s6lZNCZ0dtqORfwXeAawHuB/Ytw3h54TWn0gDLjeCPgeODNwJuAF5Qr6j4GnLkcVIlY3gXI11YpCuAqtFasqwCuCMzqEpCABCSwdgRaEsCXjqSfJditlt8CvlhmAT8DXLss+WbG70eDRrPE+wbgGOAJwIWAI4A/AW4NZObvEcA5gfuO6EyWmfPPouybJeZdu3ax335xwfUpveyd62Uc6/PkOVIJSEACEhgSaEkAa0cmN4m8ETgbcLXyZpG6iOdQzvKtt5Vl5yPLLGGWia8CfK0sA/8CyKW2EcEsK+f6uswC3hXYtcFAji0yeYpvKYB1Qu4MYB2utioBCUhAAv0QWCcBfC5w47KHb3HAYzMBfHs52HH3TUKdZelnAgcBNyntvrjsIXzABq9xBrBA6WXmrJdx9POjzJFIQAISkMAqBNZFAHNQIwmmr750oGTMEvAyzzsX6ctexNeVhNU5CRy5fHQ5MLKnGLgHcE+E9uL7zgDuBTxfKgEJSEACa0GgdwHMsm/k7+ZA7hjO/r9hWRwCuR3w2vKN85YUMItDIMP6OUTykTKLmHQ1WVJezAZGMLPUe5kRT44COALSVqsogFsl5+skIAEJSGBdCPQugJmZyzLvzZZy/2WfXvICpmR/X5ZxkwbmhyUn4DkGaWCGz8KrSi7B55QvPhg4HMgp4qSLSbqae454eBTAEZC2WkUB3Co5XycBCUhAAutCoHcB/PUmgcxJ4peV7+WmkVxDF1EcJoJeTj59/bLEm4MfSVmTkvuL084Nysxg2kiamT0VBXBPhPbi+wrgXsDzpRKQgAQksBYEehfAVoOoAFaMjAJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwQUwGnCqABW5K4AVoRr0xKQgAQk0AUBBXCaMCqAFbkrgBXh2rQEJCABCXRBQAGcJowKYEXuCmBFuDYtAQlIQAJdEFAApwmjAliRuwJYEa5NS0ACEpBAFwR6F8CrAw8CLgecF7g58IZB5E4FHAPcDTgb8GHgnsBnS519gD8HbgZ8GzgKeOfg9Q8GDgTuteLToACuCGyV6grgKrSsKwEJSEAC60igdwG8IXAV4OPA320ggA8BHg7cEfgC8Agg0ngR4MdF7CJ9hwFpKzJ5HuDXwAWA44HLAyet+PAogCsCW6W6ArgKLetKQAISkMA6EuhdAIcxjbQNZwAz+/ct4BnAkwYzft8BIoYvBJ5X5O5o4IzAfwHnBr4HvLXUef0WHhwFcAvQxr5EARxLynoSkIAEJLCuBNZZAC8IfBm4LPCJwQPwRuA/gDsARwK3B64LXL8I4fmAPwRuBRy6xQdHAdwiuDEvUwDHULKOBCQgAQmsM4F1FsArA+8HInSZCVyUFwEHFeE7XZkhvBHwfeB+wL8CHwWuVfYO3qaI5J2Bb27yMGUvYf5ZlH2BE3ft2sV++8UF16ccfPRx1QerAFZH7BtIQAISkMDMCSiAcEA54LEI5YvLwY4bbBLbl5UZw68CjweuCOQwyCWBW27ymmPLYZNTfFsBrPPpUQDrcLVVCUhAAhLoh8A6C+CYJeDlSF8beCJwJeDJwC+L/F0CeC9wDmcAd//hcAZw/A+PnRDZ8b2xpgQkIAEJ9ERgnQVwcQjk6cCflaCeHvju4BDIMNZnKDN/R5R/PxP4VVkWvgzwbuCsIx8O9wCOBLWVajshTj2IbA9j2Mrz4WskIAEJSAB6F8CzAL9VAp2DHvcH3gX8EPhGEb2HAncCvgg8DLjmIA3M8BnJcm8E8YHli4eXWcBDgHuXPIM3HvlQKYAjQW2lmgI4jpoCOI6TtSQgAQn0SKB3AYzMRfiWy8tL7r9FIuic9h0mgv7M0guyvy/pXjLT95PyvVMDzykngj8PZGbwSyMfEgVwJKitVFMAx1FTAMdxspYEJCCBHgn0LoCtxkwBrBgZBXAcXAVwHCdrSUACEuiRgAI4TVQVwIrcFcBxcBXAcZysJQEJSKBHAgrgNFFVACtyVwDHwVUAx3GylgQkIIEeCSiA00RVAazIXQEcB1cBHMfJWhKQgAR6JKAAThNVBbAidwVwHFwFcBwna0lAAhLokYACOE1UFcCK3BXAcXAVwHGcrCUBCUigRwIK4DRRVQArclcAx8FVAMdxspYEJCCBHgkogNNEVQGsyF0BHAdXARzHyVoSkIAEeiSgAE4TVQWwIncFcBxcBXAcJ2tJQAIS6JGAAjhNVBXAitwVwHFwFcBxnKwlAQlIoEcCCuA0UVUAK3JXAMfBVQDHcbKWBCQggR4JKIDTRFUBrMhdARwHVwEcx8laEpCABHokoABOE1UFsCJ3BXAcXAVwHCdrSUACEuiRgAI4TVQVwIrcFcBxcBXAcZysJQEJSKBHAgrgNFFVACtyVwDHwVUAx3GylgQkIIEeCSiA00RVAazIXQEcB1cBHMfJWhKQgAR6JKAAThNVBbAidwVwHFwFcBwna0lAAhLokYACOE1UFcCK3BXAcXAVwHGcrCUBCUigRwIK4DRRVQArclcAx8FVAMdxspYEJCCBHgkogNNEVQGsyF0BHAdXARzHyVoSkIAEeiSgAE4TVQWwIncFcBxcBXAcJ2tJQAIS6JGAAjhNVBXAitwVwHFwFcBxnKwlAQlIoEcCCuA0UVUAK3JXAMfBVQDHcbKWBCQggR4JKIDTRFUBrMhdARwHVwEcx8laEpCABHokoABOE1UFsCJ3BXAcXAVwHCdrSUACEuiRgAI4TVQVwIrcFcBxcBXAcZysJQEJSKBHAgrgNFFVACtyVwDHwVUAx3GylgQkIIEeCSiA00RVAazIXQEcB1cBHMfJWhKQgAR6JKAAThNVBbAidwVwHFwFcBwna0lAAhLokYACOE1UFcCK3BXAcXAVwHGcrCUBCUigRwIK4DRRVQArclcAx8FVAMdxspYEJCCBHgkogNNEVQGsyF0BHAdXARzHyVoSkIAEeiSgAE4T1ZUFsJdf1o5j/ANXW2R7icV4otaUgAQkIIEFAQVwmmdBAazIvbY4pes9yFMPY6j4GNm0BCQgga4JKIDThFcBrMhdARwHVwEcx8laEpCABHokoABOE1UFsCJ3BXAcXAVwHCdrSUACEuiRgAI4TVQVwIrcFcBxcBXAcZysJQEJSKBHAgrgNFFVACtyVwDHwe1FAHsZx7ioWUsCEpDA9hBQALeH46qtKICrEluhvgI4DlYv4tTLOMZFzVoSkIAEtoeAArg9HFdtRQFcldgK9RXAcbB6EadexjEuataSgAQksD0EFMDt4bhqKwrgqsRWqK8AjoPVizj1Mo5xUbOWBCQgge0hoABuD8dVW1EAVyW2Qn0FcBysXsSpl3GMi5q1JCABCWwPAQVweziu2ooCuCqxFeorgONg9SJOvYxjXNSsJQEJSGB7CCiA28Nx1VYUwFWJrVBfARwHqxdx6mUc46JmLQlIQALbQ0AB3B6Oq7aiAK5KbIX6CuA4WL2IUy/jGBc1a0lAAhLYHgIK4PZwXLUVBXBVYivUVwDHwepFnHoZx7ioWUsCEpDA9hBQALeH46qtKICrEluhvgI4DlYv4tTLOMZFzVoSkIAEtoeAArg9HFdtRQFcldgK9RXAcbB6EadexjEuataSgAQksD0EFMDt4bhqKwrgqsRWqK8AjoPVizj1Mo5xUbOWBCQgge0hoABuD8dVW1EAVyW2Qn0FcBysXsTJcYyLd2rtxGdjfG+sKQEJTElAAfwf+vcAHgScF/gscF/gfSUwTwPuCPwn8GDg1YOAHQ7cHjhkxSAqgCsCW6X6TvyS60E6ehhDngvHMf7TsROfjfG9saYEJDAlAQUQbg28okjg+4EjgbsAFwd+B3gxcBPgwsBfAL8J/AA4K/BR4A+Ab6wYRAVwRWCrVN+JX3I9SEcPY1AAV/lkOAO4Gi1rS6BvAgogfBj4OHDUINT/BrwB+BFwWeA25XvfKTIY8XsRkHpP38IjogBuAdrYlyiA40gpgOM4pZbP1HhW1pSABOZBYN0F8PTAfwGHAa8fhOyZwGWAxwPPBa4AXBB4F3AQcAngGcAVgZNHhHofIP8syr7AiSeccAL77RcX3HO55DHH77nSXtb4zKOuv5ct7PnljmPPjBY1asfDWLQTi/TEeIyLR+3PxbheWEsC8ycQATzwwAMzkP2Bk/ZmRKfamxdP9NoDgG8CVwE+MOjDw4A7ABcBjgVuB/wU+FPgOOCfy77AKwH3Ar4P3K3sH9xoKGnjmInG6NtKQAISkIAEJCCBzQhka1tcaMtlzgJ4ZeCDg5E/vBzuuOgGNCJzseWXAm8DLlWWhf8EuNwm9JZnAFPt7MAPt0x7zy/871nGsmfxx3uu3myNHsbRwxjygDiOdj4mxqKdWPTy2fCZWs9nKnH/FvDrvRn+HAVwT0vA11gCEiH8e+B3gTsDVwVyEvjM5ZTwXk+j7k0All773/sMt2Nqdxv7tJWmehhHD2NI7BzHVp7gOq8xFnW4brXVHuLRwxj8ObXVJ3gvXzdHAcyQcwgkS7pJBbMo/wq8EXjo4GsZ33uApwBvAu4HXB24eTkRnAMjZwP+Yy85btfL/TBvF8m9b8dY7D3D7Wyhh3j0MAZ/WW/nU733bflM7T3D7WxhVvGYqwAu0sDcvSwDZy/fXctBj68PopmvXw+4Vfna7wFvB3Jy4obl6zkc0kqZ1cOzG2g9jKOHMfjLupVP9v/0w2fKeGw3AZ+p7Sa6d+3NKh5zFcCEKLN/SfKcRNCfKbN77x3E7jfKTGH2CmatfFFyKOQ+wHfLoZGP7F28t/XV2XeYGcwnAD/f1pZ3trEextHDGBJ1x7Gzz/7u3s1YtBOLXj4bPlM+U1smMGcB3PKgfaEEJCABCUhAAhJYZwIK4DpH37FLQAISkIAEJLCWBBTAtQy7g5aABCQgAQlIYJ0JKIDrHH3HLgEJSEACEpDAWhJQANcy7A5aAhKQgAQkIIF1JqAArnP0t2/sFwZy2vo8JTP5d8o1fV/cvrewpREEktz8iA1i8X7gr4GfjGijhSr5uXSdTcbxj3ub/X4HB9jL58Jx7OBDs4e3MhbtxGJ3PUl+4UOAv2y5uwpgy9Fpv2+5RSUPeB703GCS1Dp5ps5Vcp7lBpY/2tsLq3cAQ+5UPGoTiX0BcMIO9GFv3+LiJcflmUry80h4YnFuILfjRP6SEzMJ01su5wP+oVzXmPROw3FcEvgUcNO9vQOzMoBePheOo/KDskLzxmIFWA1U/R3g48BpGujLpl1QANuIztWAI4ELleTUueD59sBXgX9qo4sb9iLyd5mShDu3swzLFYEXAZ8s+RZbHUauBnxLkbzcEz0UjusCB5ak4ZlFa7m8C/j3wvr/LHU01ye+rOTMvFbLgyi3+ZwFuB3w7aW+JufnK4Hck31ow+Po4XMRvI6jnYfMWLQTi/QkCZ93Vy5d/hBXANuKW3O9uSXwCuCvivRlJucrJdH1TYAbNdfj/9+hXKGXW1WW5W9R4/eBt5Zr91odxkeLZOeawI3K08v90VdodQClX/8FXH43M3yZPUvS88wQtlz+E7hKmenbqJ+50/t9QCSx1dLD5yJsHUc7T5ixaCcW6cmv9rAVJZNrv3YGsK2gtdibTwCRjPyFl5mNTB1HADOzFnnKvrpWS34oZVlxs9tUMgt4fOMC+NPC+vObQL4okBidsdUglH5l1ji34+Q+7I1KZsyeC2SJteXyPeBwIDOaG5VrA68p2wxaHUcPn4uFAM79893LOHym2vq0Z8vT43Yz+ZG9mi9UANsKWou9ycxNZv2+tiSAFyyzOWdosdOlT5m5zFT3HwMfW+pnZqNeDPxL2QfY6jAi248BXrpJB+8EPBJIPFouxwL3BR5b9gJmKTt/geYPiCxlPwx4BvDolgcBPBu4GXD/Mo78oE3JHqiM46nAG8p1jq0OpYfPRdg6jnaeMGPRTizSk/yBmq1Df7ZJtzKRk4mDU7fV7VP2xj2A00fny2X/3zuWBDCHJ44ucjh9LzfuwVnL6dIsA+cv1BwCiXTkHub8ws7sX06l5nutlsyaZQY2svr2sgdwKE53KWKVwyCtl4cUMVqcxk5/8xnP3sDI32Y/rFoaV/YrPhO4M3BaYLGfMV//JfCSEo/lfY4tjaGHz0V4Oo52nipj0U4s0pO7llWhZ23SrfwOvDvwqLa6rQC2Fo8Hl437+YUXAcmev4OKlGS25jmtdXiD/mSZ9EqD5eoIxweBz82g7+nirYHsAbzcYMr+ZOCfgacBr53JOBbdvMBSLHKYaG4lm6wzi5wfpCl5phKPk2Y0kLl/LhaoL1Y+38NYzOnzvRhHD/EwFjP6AdB6V50BbCNC2UsQAVks9/4ceEpZemyjh+vRi9MB5yxD/T7wi/UYtqOUgAQkIIF1I6AAthPxnM7MXsDsGUiutpyGnGPJ4ZVsgE0Kj6ROyXLqXEqO7EcA0+cfAJkFnGtJItI7DGLx8pnkMwzvHvIyLj83c/1c9JJcvId4GIu2fhrnYOBtS5aIpKjK74ustmSPchLWN18UwOZD1HQHX1X2L+b0ctJy/F3ZqJ+Zs8ymZckuG/db3gMYwDcHHliWHLPvLCX7zXKw5cnlA910IIBvleTJEdcsAX+gdDiHcLJstC+QtDytL8v3kJexl89FL8nFe4iHsWjrJ/BvAdm3n9972Y+cfddvLhMI2bryurL/Pb9Hmi0K4PShyV91OezxB+XWhuVTQy2fPs1fPPnLJ4c/IkrJaXirkgE9eeeydy6pbHKis9WSBNzZyPsX5dDKMBF0DrfkFPC9yiGRVseQfiUvVX4IJRa59i3/fWMgp8z3Af4W+BlwWMuDAHrIy9jD5yKPSS/JxXuIh7Fo6wdXZO8bJfVWfvbmd/jVyx7+rIDlUoGsuiQ7Q7NFAZw+NPllnau6csw/y6bLS6Y5EdlqGUpHru3KoZXhgYkcaMnp099udQDAl4AnlNOlG3Uzh3MeXm5paXgYpxDApLbJ6eV3DjqcnIyRwNxs0nLpIS9jD5+LPCO9JBfvIR7Goq2fWrlaM9s6FvfdJ0tBtm1lQiSrMEllld99WY1ptiiA04cmy6OZqWn9qrGNSOUHa04GJnlv/onIDu+azWnmLDm2nES5B+FYzAAuYpGk0Eng+9lB0A4usWg5r2S620Nexh4+F4lFL8nFe4iHsZj+d/WwB4nHIWW1K19Pmp4flvRn2RIV8fu3wcHOtnpfeqMATh+WbBrNTFkelrmV/GDNfb/56/QPy4bY4axT0qpkCfhcDQ8s+/zeAzxgkz4m8XDENvs6Wi6JRWZhs+ckSxDJI/n6QYezPJG9UDlg0XLpIS9jD5+LPCO9JBfvIR7Goq2fWrlbPX9UJ9dfsnZkFSkrXZct3Vys6p2/rW6fsjcK4PTRyaX3mS7Oic2I1JzKu5eWrF+5tJSaGzSyt/GaDQ8qH9TjgK+XfRvLN2hkFjOCnvtnWy7HLHXuQ2VP4+LL2aMZ+cuptdbL3PMy9vC5WDwjPSQX7yUexqKdn1znLtduZmtNtm1lP+Atyu0f6WX2wmc5ODcbNVsUwOlDk+tiLlRubMh1cMu55xZ/UUzf09V7kAMsOSF14uov3dFX5C+5o8op2cXdy4tk1rkBJHGx7DyBXvMyzuVzMYx4D8nFN3uC5xYPY7HzP4s2e8estuSQXbY6NX3id6MBKIDTP0jLMzfLPWr6Kpnp8dkDCUhAAmtLIDJ4whzlYylicZE55Yzd7IGbVTwUwLX9ueHA14xAZplz3/G1ZzDuXKSeDdbZVJ1T5bmVZVFyRVxO1+V0dsslB5+yBzZjGB6MSp9zEOdw4C9bHkDpW/J4Jjdj9slmf2/2kj60zHokc8FLZzCGdDG5MJMHc3GFXa6Fu08ZR7auDPcuz2RI/93NrLDk8zLHPeRDzo5jgqdOAZwA+iZvmV8W+SGVv4LyCyNLw5bpCeSH68cHdwRP36Ot9WAu48jp5b8v6RWSvDo35ESWkgctJSedk/Q6t7a0WrIZPHnAsgE8n+fsH83ey6R5mssY0s/sT47gfbpscE8+zKeXdEL53XH7cvgr6YVaLjco+7WSpiPPUxK/R74/VbbeZB9wcn62LIFJLLxRyf7x9DsnT1OyD63lkrvVNyqR8Yh4UqiktJw7Nv3rIh4K4PQflWwmfXU5KJGUMInJ/uUX3m1KepXpe7m+PYg4RcaXE3S3RuTee+jQ+cptJy2LU4aQG0wie8m9mM9Cbmj505LAOifK5yCAOX2dG2WSRDzpIfJLL4nRcxgqm8XnMIbEIs99BDCJ0nOYK2KeuEQCF7+kIxyZIWy55JmKJD0CyM/U5wHPL2NJv3MX+xVK6qRWx5GTzO8tV40N+5jT/m8a3LaUZ67lknFEvJdvh4qEJyND8uvlj6bWVyq6iIcCOP1H5TXlEEj+ml5M4+fan2QRT5LiOZzanJ7i1nuw2V9yixYj4/nF3bo45QdSZpiylLJRSaLSHHBpfRy7SiqFLw8Gkc9Alq/z74/MYAYwJ8mvA+QavkV5LnAT4Frll1zrs5jpd2bMLjWQjjxbSYeUGcGUi5T8pbk/u+WSZyorLPl5mj/kkrYjpzczs58SOc+1XosDYC2OJeKak/z5Y2i47J5Dg/kjdXmbQYtjSJ+yfeCuGySqn9s4uoiHAjj9xyQ/nPLLIldgDcvvlWWkzCDMoUQsDh0sY0dm31guyG65//nB83Ygv7Q3Kmcvv7hbF6fkk0yaiOFNLMPxJGt97mZufRy5yu6Gpa/D/ic1TK7rS77GyFTL4zipCMbyvqykhMhn5AggqUlaHkPY/6jsm/t8CUSWGSMbSdadkg3vyT2Z6yxbLkMBTD+XxzGHhPXpd/qZZdJ8RnLTT+IzN3HKODLbmnFkRjlCmDHMcRyzj4cCOP2PrfwwuhrwyaWu/G7ZeJ1N762XXIydXHrJM5dfFnmusg8qp9Nyy8lwNqe1sWQ2I9ftvWSTjs1FnLIPK5wjgRuVuSxlZ+9c/nnKBoPIDGBmxiNOLctTZikjezkksVyeU/bN5XPd8hjS7/xR+tjyh1z+P33Oz6vFac384RoZz0xgyyVLjvlcZAtBSmb8hmk7soSdPYEt37u+4JsZzGSOyFJvZtIiUfkZNZcZwMU4zlKenfQ9e03zx+kcxzHreCiA0//YyixZZvnyyy3LQinZr/VX5S+8bFhuveRi7DxLuQ0kpx5TzlH+ysvSZCSw1ZLllCTgvucmHczBnIyv6TsdgWwbyAb37KPZqCSn3gEl4XWrsUi/8rznpOn9NulkPid3K0uprY4jsxr5oy4JxDcq2YOWGwRa31eaWGRTfvaebVSOLrN/Sfjecgnr/DGaP1I3KtkDmH2ZmVWbS7lK+QMjs1BZpp+bAC44Zyk1p/pzW9ScxzHLeCiA03/cDyx/Yeev0vyQyl/X+VBnZirLRfla6yUbd5NiYbjnKX3OrFPuOM5fe62WJPHMTMzcbmFplaf9koAEdoZAfq4mvVO2Gmy293dnerJ375KVo+zRzD7M/C6Za5ldPBTAdh61LKdktikxyV9zrhWDwgAAGINJREFU+TDMpWTWLxvcc9puWPJXUZYoso/OIgEJSEACEpBAIwQUwDYCkRQL+ScpYZaXhVpPeBuC2T+TK+v+uJzSzNdyyi4nN7O3445tYLYXEpCABCQgAQmEgAI4/XOQDb052p+9W0njsXwdzhz2AGYPYzbn5/aGxV3GyYOW/FTZrLyc82l66vZAAhKQgAQksMYEFMDpgx/pe/AmJwan791qPchp4OEydvJuWSQgAQlIQAISaIyAAjh9QHLKLjn/Wk6VsidKmcFM2o7lgxS5D/VBwKP31IDfl8BuCCx+TvVwWbyBloAEJNAEAQVw+jA8qWTcf8z0XdlyD04GzlsSlA4bSSqYJC1tPd/Z8sBzKi2y8c0tE5n2hblWKVeoLe6WzinB3CKQO2nnVHLNVf6AuHDp9BfKODbKr9fquHJK875LsUjeybn9wdfLM9VDPIxFW5/22cZDAZz+Qcovg/yiS9qX/LPYQ7foWeuXYqefyfWXPFrfW8KZ+xxz1V1yPLVecvgmd4XmpolF2pokvX1quSs0Y5xDSVLV5DbMFXdJwZPP+JVLfr0cxnnVHAZRLoPPH0VJnLwYR06VJ19j4rS4j7bl4Vy/7INNkvdhLJIeKftlcwPNHEovz1QP8TAWbX1iZh0PBXD6hykX329WWr8UO1cRpY+5LzfXXw2X6DLrF5F6wW6SLE9P///34AnlFHMO5QyF49hymvnhLXV2N33JbN+LNhCk/CGRmwMyKziHkqvtEoucMB+WOwCJSeuJudPnTwDHA0mYPCxPBK5XTs7PIRa9PFM9xMNYtPWJmXU8FMC2Hqa59Sa/jPMM5Y7WLHPlzs1FSWLSrwEfnMmgcgtLbgzIyeVhuRmQmxtyO8scSi66v0S5+H7Y3xzQyb2tZ5jDIICflSu7lg8SZTk4CcfnMI6MIbcbfHGJea5JzGz/HMaQrvf0TM09HsairR9gs46HAtjWwzTX3mQPRGbNfjnXARThuDSQfWbDkntOs4SXAy1zKBGm7Pd74VJnjyz7Ahf76VofS2Q1y9WPX+poln9vXcSq9THkFp/MvP7NUkcPL4emzt/6AEr/enmmeoiHsWjrQzPreCiAbT1M9mY6Ah8G8s+9l7rwbOAK5aq76Xo3/p2PKndrZlY2N7NkWT6X3Wf/3302EMPxLe9szVuW/aO5ESd/XCzGkYTpEajX72x3tvRuOR2fO42z5DuMxUPK3tLHbqnVnX9RL89UD/EwFjv//O/uHWcdDwWwrYfJ3kxHILOYuSz+G2XZOsKRwxO5q/lGMztBm+ThOcyy2O+3OAX8xunwbumdcz9oBGqYWzKHcrKXaw4lP1+zNSKxOKB0OFsNMkP7rA2Svrc8ph6eqV7iYSza+qTMNh4KYFsPkr2ZlkB+SeeU6UUHdzJn/19+aVsksDcE9i0vzslyy/QEjMf0MVj0wFhMFAsFcCLwvm1zBLIfK3uENko2nO9lZnAO5StlyToJxocl1/V9HLjgHAYB9JBb8p3ALTa4CnE/4A1A0iTNofTyTPUQD2PR1idm1vFQANt6mOzNdAR6EI7QS77C82yQlDt5GiOx+0yHeKV33mwcmaVNEuU5HMrZbAznLknGT7cSkekq9/5MzSkexmK6z8FG7zzreCiAbT1MvfUmWfdfPJOZjs2SWR8E/Ctw5saDc9PSv8wsJT3PMCVPcjLm8MR1gZxqbrksDuEk0fMjyy05i/5mHFcHDgZ+t+FB5DR5Sk6PZ5bvh4O+Zgw3AHIqO+NoufTyTPUQD2PR1ieli3gogG09VL31JjceZNmx5avgnlag54RsZHV4n3H6fcWyHJlbKFoui5tKsoS9/LnO7TLJyZjDCP/Q8iCAJIBOiXifWNgvurzILZnTnDmx3WpJLBZbCTb6GftT4F4lf2arY0i/enmmeoiHsWjrk9JFPBTAth6qufVmOWXKcv+TPDl30rYsgIubWHIKOEmrIxnLwvGUDZL5thqrCFTS1ny/1Q6O7Ffikv1zuW1mbiXymp+t2R/0e0tXJOb5yv3Y2XIwlzL3Z6qneBiLtj41s46HAtjWwzS33uSvoG8vSdNwDKcv+9FaFsBFf3N/bmYBc6WdRQISkIAEJNA1AQWw6/BWH1z++klS29du8k6XAf658RnA6pB8AwlIQAISkEBrBBTA1iIyr/78bTmRGQncqGQPYJL2nnpew7K3EpCABCQggb4JKIB9x7f26C4OnAn42CZvlDQXSdvx9dodsX0JSEACEpCABMYTUADHs7KmBCQgAQlIQAIS6IKAAthFGB2EBP4fgQuXO4yTDDqpSL4DfGBGp5gzkPxcus4G43g/8I8zukP3LEDuMx7GInti/3Nmz2sPz1SQ9xAPY9HWh2fW8VAA23qYeuvN48svvzs3PrAkeT5iE+H4a+Anjfc/3dsf+EvgkJIEOqlG8vk+F5Crx/4e+KMZnHJO6qDkKrwU8JkisBlHbmu4JPApIElYv9lwTE4LPBW4K3CGcko+Y8iWiJ8BLwIeBCQ/Y8ull2eqh3gYi7Y+KV3EQwFs66HqrTcvBw5s/CaQ7GN8e9nL+J4l4UhuwMjf9cptIC3HJ/KXU9eRjuUkyUlmHenIzRS5JaTl8sYyU3O7kmJo2NfzAq8Efgwc2vAgngncsiTePn5wF3DuY74+8GTgdcB9Gx5DutbLM9VDPIxFWx+WLuKhALb1UNmbnSeQhMP/XsRomAQ6PUkew5cBEY9r7XzXVnrH/yhysdkNGb8PvBWIhLRcsjyaW1cy07dRyRVw7yuS2Oo4vgfcGnjnJh3MtXyvLrOzrY4h/erlmeohHsairU9KF/FQANt6qOzNzhPI1W+X380MX5YdP1JmCHe+d+PfMT+QMlOZvm5UMguY2ajWBTC/rA8HFje0LI8ld+u+pnF5isReGfj0JrHITO0/NS6xCwHs4ZnqIR69fL57iEU3nw0FcPwvWGtuTOA3gaM2OXjwAuCExsFlL9k9gCw9blSy1PhcIHvTWi6vAHLp/R9vkJYngpt7jv+l7ANseRzPBm4G3L8sze8qnc2em+uWvXVvKLe2tDqO7Lc8I/CHZUvBsJ+/ASRW2Qu4uFC+1XH08kz1EA9j0danpIt4KIBtPVRz681VgbcUyXvb0v65/LLO/r8bAjm92Wo5tuzFemwRjpyazenZnNzMGB4GPAN4dKsDKP3KzF4OrGSPWWYLcggk44hwRJ4y+5eDLvleyyXL7tmzlYND2by/WJbP138JvKTEa3m5vqUx5bl/M3DRwUGWxTOVGeV/BW4MnNhSpzfoSy/PVA/xMBZtfVi6iIcC2NZDNbfefLQsZd1vk44/HYgkXqHxgeUmk9wDvEjXke7ms5G9gZG/P2u8/8PuXQy4UhG/fD1j+CDwuRmNIV3NyeVFCpXFOJJCZS53Nef2m8h49l7muRrGIn8s5R7tuZSIbJ6p5XHM6ZnqJR7Goq1PzazjoQC29TDNrTc/LSdPP79Jx/PhyFVwWQ6bQ7nA0i+53HVskYAEJCABCXRHQAHsLqQ7OqCvAI8BXrrJu94JeCRwwR3t1fq+WQ/5DJejl9x5WS5NwtVvA6+fSV7GXpJZL8cjB1gWscjWjixtz6H0GA9j0daTN7t4KIBtPUBz600OT2SZNwcMkktvef/cXcp+rRwGmUs5W0kJs/gll1yGrR9kCdte8hnm1pIblb2KSWKdVCq/Xe6Tzl6u7G3MCduWE0H3kMw6z9SrgCNL3sXcovF3ZV9sElhHzLMkn32yre8r7SEexqKt3yBdxEMBbOuhmmNvku8sewCzX+s0ZQAnl18OTwNe2/igvlVunfgBkCXgCEhKTsxmP92+ZR9X6/udeslnmL1x2WsW0Uvy6uwfzUGi7GU8B/Cmsp8xp51bLT0ksw7bfI6TAzOxSPLqJLe+FfDxcitLPtvJLZkT2y2XHuJhLNp6wrqIhwLY1kM1595kRuCcZQDfn8E1VwvWQ+HIKdrIR5Yckx9wH+BvS8qOwxoPTi/5DIfxyN7SyMVxA/bXLFsOIuutlh6SWYftMBa5li8n4Yd/0GWmNoekMkPbcukhHsairSesi3gogG09VPZm5wkMP8jZ05hl6+ENDkmgHAnM8mPLpZd8holHUtckIXS2FOQGlqRNWZSDgIhh7thttfSQzHohgItYZEy5GnE5FpkZb/2QVw/xGH4ujMX0n/wu4qEATv8g2YNpCQw/yJGo3Hzw2UGXDi5Lji0LR7rbSz7DxCO5JX8OZLYvyZTz/4uStCpJBL1ISTLt07Pxu/eQzHohgFmGz+xy4nDbpT+Osu0jS8DZq9ly6SEe+VwYi3aesi7ioQC280DZk2kI5IOc5a0kGc7Bjz8qJ00Xvbl62QyfG09aLz3kM1w+UZ6Eyn8zAJ+9aJcCbtBwMHpIZh2871465fvKkoh7gT4n/HOvcUS95dJDPIxFW09YF/FQANt6qOzNzhM4ZuktP1RuzVh8OcIR+cvsx1xKz/kMk+omG7BzlVrrZe7JrPfEN+mdciNL6zeaLMbRczyMxZ6e1p39/izioQDu7EPhu0lAAhKQgAQkcEoCcZG55JTcXexmNQ4F0I+hBNaDQA6xPKrcsTvnEc9lHDkYkT1yP1w6OBH22U96OPCXMwhEL+NISqfsH11ci5hbinL9Y076Z2l7ePCr1bD0MIbN2GYm+XeAf2sV/sh+zWocCuDIqFpNAjMnkB+uyd+2yNU41+HMYRxJi5L7fs9fZjXeBxwBJOdkSk7W5r9bj8VG48hWiNzIMqdxZL9ocgEmHcyZgJsX+f5UufM7p5tzb3PLEtjDGPLMJDfsRiUyHhFPPtaU1nNLdjEOBXCuvwbttwROSeCmewCSPSlPnYF09DCOXFd3WiBXIZ61/NK7ZDks8Y0ZCWAv40hy98jdI4DbAM8Dng88vHxmHlcSjicDQKulhzGEbQ7dRbyXb4+JhH+sXPOYpeBrtxqI0q8uxqEANv6U2T0JjCSQH0j5wbm7z3S+3/qsUw/jSP7C65TbZBbhey5wk5LX8CczmQHsZRy7ynL8l4BTlxRDye+ZGfGUyPk7Gk8t1MMYwvqhwF03yLea6wUzuz/MMznyR98k1boYhwI4ybPjm0pg2wkkh+E9S468jRrPReW5u7V1AexhHCcBEYzl/UzJR3doWQ5OGonWY9HLOIbylM/Gj4tsJPF7SpKLt57QuocxLH4u5XrHLPf+fRHCyN/cBDBjmf04FMBt/z1sgxKYhEDuyP0k8KebvHv+uv5EmQGZpIMj37SHcXwEiOy9YoMxP6ckVU5KktYFsJdxZMkxOTKTtHox4xfhS+7PlKuWPYHZJtFq6WEMQ7ZnATIrnj9Mb1f+OM1/z2UGcDGWWY9DAWz1426/JLAagasByZG3+CW3/Op87/LAe1Zrdsdr9zCOLA9lHLkrd6OSPWh3n4GM9zKOsD5h6U7pYVyyBzAHc3INZKulhzFsxDZ7MnOfdG6TSYL3uQngYkyzHIcC2OrH3X5JQAISkIAE+ieQRPtJmZR9mNkfO9cyu3EogHN91Oy3BCQgAQlIQAIS2CIBBXCL4HyZBCQgAQlIQAISmCsBBXCukbPfEpCABCQgAQlIYIsEFMAtgvNlEpCABCQgAQlIYK4EFMC5Rs5+S0ACEpCABCQggS0SUAC3CM6XSUACEpCABCQggbkSUADnGjn7LQEJLAjcseQSy727tcrXynskZ9mcynuBFwCv2uFO7wN8Ebh5SfK7w2/v20lAAnsioADuiZDfl4AEahF4GXCH0vjJ5X7c44CHAT9a4U3PCOwLfHeF16xadawAJhdYrhjLPxddepODga8Cv1tubRl++w3AfwCR2ZRcFXeNclXWE5faeTNwQ+BRwLG7GUjuHn5a6UfuWN7pcm/gpuVe5J1+b99PAhLYAwEF0EdEAhKYikAEMDcw3Ak4LXBx4C+A9wG3napTm7zvWAF8RBGuq5cxvH/Q3qoCmKvJfgpcZNDGAUUufwi8aA8C+DbgXcATJmJ5jiL1ueJr+V7kibrk20pAAgsCCqDPggQkMBWBCGCWbQ8ddOCpZRYs8rAo9y+SGCGK+OQS+QcD/1kqLC8B597jLNXm6rtfl6XII4GPlfpXBjKrlsvcvw+8vsy0LW4hODfwkjJz9e9ApC7XhaXN3S0B5+fpl4B7ANcC0s6d90IAcy3W4cDNgIVIZnb094HzA5k13GwG8JxlRjTXa3120IfwyLVihwDXBr5e+vg94M8Lk0+X+1m/XF6X90iMnlXe7+zlnuM/AR4AJD6nBp5ZOA2fpwhohH6zO6qnevZ8XwmsPQEFcO0fAQFIYDICywIYwYvcRf7OM+jVfYFPAZmFuwCQu3TfWUQr1ZYF8DPAJ4qMZGk5M1BfKG1EiD4APLLcDZs7SJ9TvpeZyJQssR4I3A34P0V8smwb+dqdAEao/grIMnCWfz8MnBf4cWl31RnATwL5GZ17nBf31GYckd9I2e4EMML2SmA/YLj8GwH8ZpG2tP+kwidL1n8GfKPMwmY5OsvMKXmviF7umT4GuBDwt2V2Mf15LhCpzuztlYAPDWKX9n+vCPFkD5pvLAEJ/G8CCqBPhQQkMBWBCODtgJ8BpwHOUDqSGaWn76ZThwHPBzLLtZEAngTcC3j5Bm38ZVlWzYzgolwVeE8Rrcysfb7MskXgUiJzWcK83x4EMPKXfYiplxLBilxmZi1lKwIYqfqnIpK5L/VvimB+dA8CGGkOg8jasEQAH1sEOF/PbOIHgT8uApev5WL7lwLZW5kSAXxQkfKFzEYGszSd9heC+TkgMR3uWcw+wPCIuFskIIGGCCiADQXDrkhgzQhEFs4HHAWcqcxy/TaQwwu/HLDIcmpm37JHMDNa2S8YWTxLuTx+eQYwwvLwInW5YD7StFjOzHLobwG/GLSfn4N5/7Sf98/sVtrP7OGi5FBKDl1sNgOYpexvA5HJfy4veiBwizI7tlUBjMilvSy/hkOWrNNu5HJ3M4APLXJ9iQ0EMMvKYZISMcvsX2bpIpUpeZ/MsO4PRKbDM9I9bCtyHQG/8aD9SHT6GoFflLsW4cxeT4sEJNAQAQWwoWDYFQmsGYGN9gBmz1hmvLJEm3IQkJmlpDJ5TdkDGMnKHr2zDU7ORsyGaWAicpGTLGPmNG1mtbLXLzN5by9CtYw7y583KnKUNCbDpdM9CWD2/WUpdCiN+fmavXERp+znS3+zh/GaRU6H759Tv1nmvk/5Yv4/khcBvGc5LR1BjailrT0JYMQrwppDI8OSGcCkZok8pmw0K5n+JQ4Lvos9gFlKX5SNYjfs86LeQ4DbA5dcs2fb4UqgeQIKYPMhsoMS6JbARhIR+XhLWVr8FnBL4NXAUMhyKOMxexDAIbS/Lsu7SUmSZdrsL/yDTahmWTPCeUXgI6XO4mu7WwLOzFekKWMalszcfbzM2uXrWSLOXrunDCplqTXymf112d+YMpSpiFhYRBCzZJuyJwHMAZj0P/sphyl1dloAX1H6Gwm0SEACDRFQABsKhl2RwJoR2EgAgyCndXOQIKdMM+uUAx2ZCcsBkauUtCZZOt5oBjAy9eSyjJucezmQkeXKvwMyG3Xp0nb2uL24LCFfDLhu2TOX94+AZuYsh0CyFJ3Zxey/2+wQyKKPaSfyOCyZicsJ4vQ3y845wHF0menLYZSMIf3KrGZEM0uuywKY/8/sZl6/OKm8JwHMnspIY/b2/cOgQzstgDm4k9nchQiu2SPucCXQLgEFsN3Y2DMJ9E5gMwE8ohxCyF69E8ohghxCiATlZovM4uUwx0YCePoifBHF7DvLnrnXlUMMOWySkvQvkbKcWM3PwOwPzPLy48v3M0OYgxvXAb5T0sBkxnGzNDDPLilVlvfbpbmcMs7ewOy7Sz+yJJw0LDmEkgMUOW0b2Y0UJoXMomy0nDp8HvYkgKmb/H9Z4h3mVNxJAQzfnKiOTCefoUUCEmiIgALYUDDsigQkIIFtJBABzqGXzF4m399Olxw0yeztQqx3+v19PwlIYDcEFEAfDwlIQAL9EkgS6Rw8STLmnSzZs5lZ2yT2dvZvJ8n7XhIYSUABHAnKahKQgAQkIAEJSKAXAgpgL5F0HBKQgAQkIAEJSGAkAQVwJCirSUACEpCABCQggV4IKIC9RNJxSEACEpCABCQggZEEFMCRoKwmAQlIQAISkIAEeiGgAPYSScchAQlIQAISkIAERhJQAEeCspoEJCABCUhAAhLohYAC2EskHYcEJCABCUhAAhIYSUABHAnKahKQgAQkIAEJSKAXAgpgL5F0HBKQgAQkIAEJSGAkAQVwJCirSUACEpCABCQggV4IKIC9RNJxSEACEpCABCQggZEEFMCRoKwmAQlIQAISkIAEeiGgAPYSScchAQlIQAISkIAERhJQAEeCspoEJCABCUhAAhLohcD/BeHZAsFJ6lnFAAAAAElFTkSuQmCC\" width=\"640\">"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "{'Expected Raised': 51.84999999931541,\n",
- " 'Probability over 50mm': 0.41519298928515846,\n",
- " 'Raising No Capital': 0.036938174273510642}"
- ]
- },
- "execution_count": 140,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"df = mk.run_scenario(pool_size, rho, successprob, issuerweights, zero_recov)\n",
"mk.plot_prob_over(df)\n",
@@ -4926,10 +132,8 @@
},
{
"cell_type": "code",
- "execution_count": 135,
- "metadata": {
- "collapsed": true
- },
+ "execution_count": null,
+ "metadata": {},
"outputs": [],
"source": [
"#Current LMCG pipeline\n",
@@ -4956,20 +160,9 @@
},
{
"cell_type": "code",
- "execution_count": 136,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(114, 10)"
- ]
- },
- "execution_count": 136,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"bins = [0,0.1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, pool_size]\n",
"pool_size, sum(num)"
@@ -4977,1600 +170,9 @@
},
{
"cell_type": "code",
- "execution_count": 137,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "application/javascript": [
- "/* Put everything inside the global mpl namespace */\n",
- "window.mpl = {};\n",
- "\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",
- " if (mpl.ratio != 1) {\n",
- " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
- " }\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " 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 backingStore = this.context.backingStorePixelRatio ||\n",
- "\tthis.context.webkitBackingStorePixelRatio ||\n",
- "\tthis.context.mozBackingStorePixelRatio ||\n",
- "\tthis.context.msBackingStorePixelRatio ||\n",
- "\tthis.context.oBackingStorePixelRatio ||\n",
- "\tthis.context.backingStorePixelRatio || 1;\n",
- "\n",
- " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
- " canvas.attr('height', height * mpl.ratio);\n",
- " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
- " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
- " var x1 = msg['x1'] / mpl.ratio;\n",
- " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 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 * mpl.ratio;\n",
- " var y = canvas_pos.y * mpl.ratio;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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",
- " var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\n",
- " fig.close_ws(fig, msg);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.close_ws = function(fig, msg){\n",
- " fig.send_message('closing', msg);\n",
- " // fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var width = this.canvas.width/mpl.ratio\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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",
- " // select the cell after this one\n",
- " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
- " IPython.notebook.select(index + 1);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\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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ddr9syeffDLUvkWLFhV4pA8jgNFfNKwBdPulEhLAJle/p8zyu4auw1OFspmafceRnDXlxpjcEIAABAIhkF8IbLRs646cQO4d700qls2K+b0hv0BZWVdeeaXeeustffDBByHZa9++fUiGTJRsqnX06NE6/fTTQ+vs+vbtG5LFG264QV9//XXoeksmgLVq1dJ9992nww47TK+//rruvfdezZgxQ/vuu2/oGpO63r17q2HDhqHvm3hee+21oXv5AmjldunSRQ8//LBsd+3f//53de7cWW+++WbomngE0KaD69atGxrtPPLII2VP9LAzG4844ojQeX5PPfXUbtQHHHCAjjvuuNBUeEEJAUQA431dxnN9SACfGPajKlauujvf9p25evDLn0P//uXuo1Q2688HUMZTANdCAAIQgEAwBPILwZbsnWpz65fB3DzOu8y6o58qlSt8mrYggbKRsKOPPlp9+vSRjbyZ0NkGi+OPP353Lbp37662bdvq+eef3/290047TZs3b9Znn322WwAvvvjiP00jd+3aVSZWNjJYUHrwwQf17rvvatKkSbsF0CTRRuEaN24c+p6NRtoo4LJly0KjhvEIoOUvaAr4vffek9V1xYoVKl++vKZNm6b9999fCxYsCG0iQQDjDEDjHH+WpM5xqaTrJTWQ9JMk21L0XZQa24rUuyWdJGkPSQslXSfp8xhbWeAawG07ctT6li9Ct5gx+AhVrbBrqJwEAQhAAAKJI1CaBfCNN94IHWa8c+fO0DpAk71nn31Ws2bNCgmgTdE2avS/JUc1a9bUo48+Glon6KfHH39c9sekyRct21xyzjnn7L7mmmuuCe3o/fbbb0PfsxFGG0WcN2+e7DF6Vn61atW0atWq3QL42muv7b6nfdM2fdgopE3d9ujRIxABtCd7mGA+8cQTOuOMM3TVVVdp5syZ+uabbyIGFCOA0V9rqSSAp0t6XZJJ4BhJF0kaKKmNpMUFYLCHA9p1FsX3SFoqqYmkTZKmxfgrqkABtGmFZjfucshJg/qqdpXyMd6OyyAAAQhAoLgIlOYpYBtNszV9tvbOpmP9NXgmWSaAv//+++41d8bPBNDELVzu7N+2bm7+/PlRBdBG10aMGKHx48frkEMOCU2x9uvXT9WrV9c777wTmuq1NYmWbA1gfgH0D1keNWpUaGo5iBFAK+u6664LSd8nn3wS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\" width=\"640\">"
- ],
- "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",
- "\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",
- " if (mpl.ratio != 1) {\n",
- " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
- " }\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " 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 backingStore = this.context.backingStorePixelRatio ||\n",
- "\tthis.context.webkitBackingStorePixelRatio ||\n",
- "\tthis.context.mozBackingStorePixelRatio ||\n",
- "\tthis.context.msBackingStorePixelRatio ||\n",
- "\tthis.context.oBackingStorePixelRatio ||\n",
- "\tthis.context.backingStorePixelRatio || 1;\n",
- "\n",
- " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
- " canvas.attr('height', height * mpl.ratio);\n",
- " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
- " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
- " var x1 = msg['x1'] / mpl.ratio;\n",
- " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 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 * mpl.ratio;\n",
- " var y = canvas_pos.y * mpl.ratio;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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",
- " var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\n",
- " fig.close_ws(fig, msg);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.close_ws = function(fig, msg){\n",
- " fig.send_message('closing', msg);\n",
- " // fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var width = this.canvas.width/mpl.ratio\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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",
- " // select the cell after this one\n",
- " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
- " IPython.notebook.select(index + 1);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\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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\" width=\"640\">"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "{'Expected Raised': 7.599984351899801,\n",
- " 'Probability over 50mm': 0.025655670506988363,\n",
- " 'Raising No Capital': 0.38843746289255338}"
- ]
- },
- "execution_count": 137,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"df = mk.run_scenario(pool_size, rho, successprob, issuerweights, zero_recov)\n",
"mk.plot_prob_over(df)\n",
@@ -6580,10 +182,8 @@
},
{
"cell_type": "code",
- "execution_count": 141,
- "metadata": {
- "collapsed": true
- },
+ "execution_count": null,
+ "metadata": {},
"outputs": [],
"source": [
"#Current Agecroft pipeline\n",
@@ -6610,20 +210,9 @@
},
{
"cell_type": "code",
- "execution_count": 142,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(377, 54)"
- ]
- },
- "execution_count": 142,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"bins = [0,0.1, 50, 100, 150, 200, 250, 300, 350, pool_size]\n",
"pool_size, sum(num)"
@@ -6631,1600 +220,9 @@
},
{
"cell_type": "code",
- "execution_count": 143,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "application/javascript": [
- "/* Put everything inside the global mpl namespace */\n",
- "window.mpl = {};\n",
- "\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",
- " if (mpl.ratio != 1) {\n",
- " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
- " }\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " 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 backingStore = this.context.backingStorePixelRatio ||\n",
- "\tthis.context.webkitBackingStorePixelRatio ||\n",
- "\tthis.context.mozBackingStorePixelRatio ||\n",
- "\tthis.context.msBackingStorePixelRatio ||\n",
- "\tthis.context.oBackingStorePixelRatio ||\n",
- "\tthis.context.backingStorePixelRatio || 1;\n",
- "\n",
- " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
- " canvas.attr('height', height * mpl.ratio);\n",
- " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
- " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
- " var x1 = msg['x1'] / mpl.ratio;\n",
- " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 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 * mpl.ratio;\n",
- " var y = canvas_pos.y * mpl.ratio;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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",
- " var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\n",
- " fig.close_ws(fig, msg);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.close_ws = function(fig, msg){\n",
- " fig.send_message('closing', msg);\n",
- " // fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var width = this.canvas.width/mpl.ratio\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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",
- " // select the cell after this one\n",
- " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
- " IPython.notebook.select(index + 1);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\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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oP77X9u97P+TiZatfDVRLCvFQrTC6QEMrUdoD2Do67GoFwJYVuszB7BsQqUfERDAp7+ZrvP67eVaFvkhAAEIQCCOBJJZAIOHUA3ROeeco88//1xvvfWWDjjgAH311Ve64YYbNH36dA0dOjTwN5PDBx54QIsWLQqshL3xxht12mmnbSdsovXUU0/p008/1ciRI7Xjjjvqvvvu04ABA7Yfc8011wSGiW3vRHv9lFNO0c0336xKlSoFjvEFcMiQIfrPf/6jVatW6fDDD9dzzz23vccvkiFgGw62lbt+atasWaBuLVu21MSJE9WpU6ftrz3++OOB65s/f36xW/rQA1j6zcQcQLc3m4AANr30Xb11wQHq0aqBW2nkhgAEIACBuBEIFQLrLdu8tSBu5yut4KqVssLehzBUoKzciy++WG+++abef//9gOztvffeARkyUbKh1tGjR+uEE04IzLPr169fQBavvvpqffPNN4HjLZkA1q9fX/fcc4969eql1157TXfffbd++ukn7bHHHoFjTOoOPPBA7bTTToG/m3hefvnlgbJ8AbTz7rfffnrwwQdlq2vPOussdenSRW+88UbgmEgE0IaDGzZsGOjtPOSQQ2RP9LA9G/v37x/Yz+/JJ5/cjrVDhw468sgjA0PhxSUEEAGM5829XQDb7NJQQy/tFfYNHc9KUTYEIAABCPyTQKgQbMrLV9ubh1YIqpm3H6xqOWUP0xYnUNYTdthhh6lv376ynjcTOltgcfTRR2+/lh49emjPPffUs88+u/1vxx9/vDZu3KgvvvhiuwAOHjz4b8PIXbt2lYmV9QwWl+6//3698847mjx58nYBNEm0Xridd9458DfrjbRewCVLlgR6DSMRQF9MQxenvPvuu7K6Ll26VJUrV9a0adO07777au7cuYFFJAhg5GFMD2DkzIJzBARw96vf15aMKvr0wh7ae+dtk1xJEIAABCCQWASSWQBff/31wGbG+fn5gXmAJntPP/20Zs6cGRBAG6Jt0sQedrUt1atXTw8//HBgnqCfHn30UdmPSZMvWra45PTT/QdkSZdddllgRe+IEfYgLQV6GK0X8ffff5c9Rs/OX6tWLS1fvny7AL766qvby7Q/2qIP64W0odvevXvHRADtyR4mmI899phOPPFEXXLJJZoxY4aGDRtWYpDRA1j6/YcAur0/BQTw7GdH6Zs5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\" width=\"640\">"
- ],
- "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",
- "\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",
- " if (mpl.ratio != 1) {\n",
- " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
- " }\n",
- " fig.send_message(\"refresh\", {});\n",
- " }\n",
- "\n",
- " this.imageObj.onload = function() {\n",
- " if (fig.image_mode == 'full') {\n",
- " // Full images could contain transparency (where diff images\n",
- " // almost always do), so we need to clear the canvas so that\n",
- " // there is no ghosting.\n",
- " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
- " }\n",
- " fig.context.drawImage(fig.imageObj, 0, 0);\n",
- " };\n",
- "\n",
- " this.imageObj.onunload = function() {\n",
- " 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 backingStore = this.context.backingStorePixelRatio ||\n",
- "\tthis.context.webkitBackingStorePixelRatio ||\n",
- "\tthis.context.mozBackingStorePixelRatio ||\n",
- "\tthis.context.msBackingStorePixelRatio ||\n",
- "\tthis.context.oBackingStorePixelRatio ||\n",
- "\tthis.context.backingStorePixelRatio || 1;\n",
- "\n",
- " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\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 * mpl.ratio);\n",
- " canvas.attr('height', height * mpl.ratio);\n",
- " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\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'] / mpl.ratio;\n",
- " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
- " var x1 = msg['x1'] / mpl.ratio;\n",
- " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
- " x0 = Math.floor(x0) + 0.5;\n",
- " y0 = Math.floor(y0) + 0.5;\n",
- " x1 = Math.floor(x1) + 0.5;\n",
- " y1 = Math.floor(y1) + 0.5;\n",
- " var min_x = Math.min(x0, x1);\n",
- " var min_y = Math.min(y0, y1);\n",
- " var width = Math.abs(x1 - x0);\n",
- " var height = Math.abs(y1 - y0);\n",
- "\n",
- " fig.rubberband_context.clearRect(\n",
- " 0, 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 * mpl.ratio;\n",
- " var y = canvas_pos.y * mpl.ratio;\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\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\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",
- " var width = fig.canvas.width/mpl.ratio\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 + '\" width=\"' + width + '\">');\n",
- " fig.close_ws(fig, msg);\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.close_ws = function(fig, msg){\n",
- " fig.send_message('closing', msg);\n",
- " // fig.ws.close()\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
- " // Turn the data on the canvas into data in the output cell.\n",
- " var width = this.canvas.width/mpl.ratio\n",
- " var dataURL = this.canvas.toDataURL();\n",
- " this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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",
- " // select the cell after this one\n",
- " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
- " IPython.notebook.select(index + 1);\n",
- " }\n",
- "}\n",
- "\n",
- "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
- " fig.ondownload(fig, null);\n",
- "}\n",
- "\n",
- "\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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XAb4OnB14LMdRscBPwHuDRwC3BO4OXDLIoSXAP4SyMxi5LJPUwArqSmAlcDsLgEJSEACEmhYAPPY9nzl8e4flke8lweuVB7zfhSI0GUmcNaOAfYswnfuMkN4G+A04OHAF4ETgJsAWTt4tyKSBwOnrsM6awnzz6ztDJyyZcsWdtklLmjbiIACuBEhvy8BCUhAAhJYnMDWrVvZddddc0H+p3Yp21neKI9Uh97OX2Tt2cAngAjg7mWDx+zeX1E2dtxqnWBeXWYMvwk8A7g2kM0gVwbuvM41a21GQQFcfLgogIuzsqcEJCABCUhgIwKtCWB4vAf4GnDkAo+A5/ndFDgCuE65/tdF/jKj+GHgQusAdwZwo5G4wfcVwCUBerkEJCABCUigQ6A1AYyIZd1fHvM+rTz6fT6QGcG08wDf72wC6Q6WncrM3wHl/48CflseC2eTyQeB3RYcXa4BXBDUrJsCWAnM7hKQgAQkIIFtEJi6AD4H+Bfg22X3bsq83Ai4CvCtInqPBw4Cvgpkg8iNO2VguujyuDeC+Kjyxf3LLOA+wEOAiwO3XXC0KYALglIAK0HZXQISkIAEJLAAgakL4BtKXb8Ll9ItWff35LKRI3hmhaCz27dbCPrEOXZZ35dyL5np+2n53jmAo8uO4C8DmRnMo+VFmgK4CKVOH2cAK4HZXQISkIAEJNDwDOBQk68AVmZGAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpCAAji4MaAAVqZEAawEZncJSEACEpDAiARwB+BGwA2ASwHnA34AfBZ4L3DyRLKpAFYmUgGsBGZ3CUhAAhKQwAgE8LzAw4EHABcCPgecCvwcuCBwZWB34N3AU4FP9Mjq44FnAEcBDyvX7wg8B7g7kHt4X7mHU8r3896vAW4CfAU4qNzb7O1fAnwdeG7l/SiAlcAUwEpgdpeABCQgAQmMQAAzs/dJ4NXA8cCv1rjnPYEDgPsDTwdeUZHZvYE3AVuBD3QE8KXAPsCBwA+LyEX6rgH8pvx3/v1+wKHA9YG8Vtp1gBcB1y59K24HBbCGVqaDH/f2yiu2T/eTjrjt9nkhX0UCEpCABCQwIAJbt25l1113zR3lf+JHvVse3/ZtmeE7ccGLzwNEBr+6YP8/AD5TZvaeBPxHEcAEnMfL9wTeWF4rs4yR0dsUEX0H8DbgZcAVgE8D5wfODZwA3Kd8bcFb+f/dFMBKYgpgJTC7S0ACEpCABLZBYCgCeHYmKY9wf1QeMX+wI4A3LY98M+P3484N5PHzW4HDgGcCly0zjw8C7lpm/iKSF+7MJG50/3nUnH9mbWfglC1btrDLLnFB20YEFMCNCPl9CUhAAhKQwOIEhiyA5wIOAW4MnBP4KPBi4BeLh8fdgCeWx7a5riuAeZx87JyY5aWzzvCb5b0zS5jHxNcDTiqPgfN4Os8j8wj4b4BblFnA+wJb1rm3w4tQnuXbCuDimVQAF2dlTwlIQAISkMBGBIYsgNlg8SfAm8sj13uVjRjZsLFI26OIWQQts3ppiwjge8rGjqw1XKu9v2wkyWPo2wFZJJb1iFlD+Mh1rnEGcJGMbaOPArgkQC+XgAQkIAEJdAgMSQDvCLylc29fA/bqbLC4fNn9u9uCGdy3vF42c8xaZhLPAH4L3LKUltnWI+D5tzq4SN+dipimNE1ENRKY3cnZMLJIcw3gIpQ6fRTASmB2l4AEJCABCWyDwJAE8F+BXwMPLCVgsms3j1T/ucwA5hFrSrXcfMGMZp1dZum6LY98vwQ8q2z2yCaQe5Qdwul38azN62wC6V57EeBTZSdwStQcB8xmAyObecx7tQXvTQFcENSsmwJYCczuEpCABCQggZEIYG4za/aeBrwQeB3w5Lk1gJGsSFvf1n0EnNfI+r48xk0ZmGwUSU3A1CGclYHpvs/rgY8BR5cvPgbYv+wiTh3ArBuMvC7SFMBFKHX6KICVwOwuAQlIQAISGJEA5lbziPdI4KplI0bKtmyvNi+AO5X3yoaQbiHo+RNH8rg4j3iz8SOPj9NySknqFt6qzAzmNb6/4I0qgAuCmnVTACuB2V0CEpCABCQwMgGc3e4Ny67fdwF/XU4FmUoyFcDKTCqAlcDsLgEJSEACEhiJAGbXbh7BXhH4PPCosrM2NfdSfy/Ht71zItlUACsTqQBWArO7BCQgAQlIYCQCmCPavlceq+aRawow377ce07heDnw32Xd3diTqgBWZlABrARmdwlIQAISkMBIBPD0sov260COlcumikvN3XvO5D1mAhlVACuTqABWArO7BCQgAQlIYCQC+KFSgiVHt92snL27z0SzpwBWJlYBrARmdwlIQAISkMBIBDA1+1JOJY97s/P30cB3Jpo9BbAysQpgJTC7S0ACEpCABEYigC0lSgGszLYCWAnM7hKQgAQkIIERCOD5gZ9WZKq2f8VLb0pXBbASswJYCczuEpCABCQggREI4HeBF5UdwOs99s3GkKwNfATwYeCZI86sAliZPAWwEpjdJSABCUhAAiMQwL2Ap5eyL1n/9+my/u8XwAVKbcCcwvGrIn7ZCfybEWdWAaxMngJYCczuEpCABCQggREI4OwWLwnsB+QUkJSAyfFspwGfBY4H3tE5im3MiVUAK7OnAFYCs7sEJCABCUhgRALYSrIUwMpMK4CVwOwuAQlIQAISUAAHNwYUwMqUKICVwOwuAQlIQAISUAAHNwYUwMqUKICVwOwuAQlIQAISUAAHNwYUwMqUKICVwOwuAQlIQAISUAAHNwYUwMqUKICVwOwuAQlIQAISUAAHNwYUwMqUKICVwOwuAQlIQAISGJkAngT8bSkK/e2JZk8BrEysAlgJzO4SkIAEJCCBkQngg4EDgT8FPgC8CngL8MsJZVIBrEymAlgJzO4SkIAEJCCBkQng7HYjgAcDdwfOBby+zAx+ZgIZVQArk6gAVgKzuwQkIAEJSGCkAji77XMDDwCeBeTfTwSOAo4FzhhpdhXAysQpgJXA7C4BCUhAAhIYqQBG9u4IHATcHPhEeRy8O/Cg8nj4gJFmVwGsTJwCWAnM7hKQgAQkIIGRCeDVi/Tl0e9vgNcBrwS+1Iljb+DD5azgMSZYAazMmgJYCczuEpCABCQggZEJYKTvPWW2763Ar9a4//MDRxdRHGOCFcDKrCmAlcDsLgEJSEACEhiZAO4JfGviWVMAKxOsAFYCs7sEJCABCUhgZAL4DSCPeH84d9+7AdkBfJkJZFQBrEyiAlgJzO4SkIAEJCCBkQngb4GLAd+fu+8/BFIYescJZFQBrEyiAlgJzO4SkIAEJCCBkQjg7ct9Zt3fvYEtnfs+J/AXZTfwXhPIqAJYmUQFsBKY3SUgAQlIQAIjEcDM/KWltt8Oc/ecjSA5Iu6RwL9OIKMKYGUSFcBKYHaXgAQkIAEJjEQAZ7f5zbIG8LQJZ04BrEyuAlgJzO4SkIAEJCCBkQlgCwlTACuzrABWArO7BCQgAQlIYAQC+BDgGOAXQP59W+2FE8ioAliZRAWwEpjdJSABCUhAAiMQwDz2vWYp/ZJ/X69lfaBlYBoc0gpgg0k3ZAlIQAISONsIbN26lV133TWvn//ZuswbzW/cWOa1pn6tM4CVGVYAK4HZXQISkIAEJDCCGcDWkqQAVmZcAawEZncJSEACEpDACATweRVZekRF36F2VQArM6MAVgKzuwQkIAEJSGAEAviBBbOUNYA3XbDvkLspgJXZUQArgdldAhKQgAQkMAIBbC1JCmBlxhXASmB2l4AEJCABCSiAgxsDCmBlShTASmB2l4AEJCABCYxAAN8MHFi2Iefft9XuNIGMKoCVSVQAK4HZXQISkIAEJDACATy2FIA+Hci/b6sdNIGMKoCVSVQAK4HZXQISkIAEJDACAWwtSQpgZcYVwEpgdpeABCQgAQmMVAAvCuwFZOfvV4DvTyiTCmBlMhXASmB2l4AEJCABCYxMACNHLwbuBpyz3PtvgDcCDwS2TCCjCmBlEhXASmB2l4AEJCABCYxMAN8EXA14MPDxMgN4XeAo4PPA/hUZPRTIP5cq13wBeCrwzvLfOwLPAe4OnBd4H/AA4JTy/QsCrwFuUmYhs/7wc533fwnwdeC5FfeUrgpgJTAFsBKY3SUgAQlIQAIjE8CfArcE/m3uvm8AvAs4f0VG9wEye/i1cs29gUcDfwZEBl8KpE92IP+wiFyk7xrluohd/v1+RSSvD+xdXus6wIuAa5e+FbelANbASl8FsJaY/SUgAQlIQALrE9i6dSu77rprOuR/ti7DaodlLu5c+23gtsB/zr3eVYF3AJdc8n1+VCTwn4AfAPcsj5fzsrsDJwO3AY4v7/c24GXAFYBPFwE9N3ACcJ/ytdpbcgawkpgCWAnM7hKQgAQkIIGRzQBmtm0/4F7Ad8u9X6w8ik2NwJf3zGjWE+Z180g3M4B5zTzyzYzfjzuvmUe8bwUOA54JXBY4AHgQcFcgM39PAi4MPGzBe8mj5vwzazvnMfOWLVvYZZe4oG0jAgrgRoT8vgQkIAEJSGBxAkOZAfxsWes3u/PLFWHKbGDaHwG/BL4KXH3x8H7X8yplLeFOwP8UmctMYqQuNQe7Ypb+7wa+CRxSpkXzmPh6wEnlMfCvgLcXEfwb4BZlFvC+29igcngRyrPcugK4eCYVwMVZ2VMCEpCABCSwEYGhCGBm2xZtT1m0Y+l3niKQuwF3Lo9tb1Q2mqwlgO8pGzvuv877vL9sSNkTuF15XP2Ksobwketc4wxgZdLmuyuASwL0cglIQAISkECHwFAEcDOT8t4ieCkrs9Ej4Pn7OrhIX46jy+PovFZ2AmfNYnYXZ8PIIs01gItQ6vRRACuB2V0CEpCABCSwDQItCmCkLxs9Hlo2gdwDSOmZtIuXEjCzTSBddBcBPgVkJ/CpwHHAbDZwXyCPeVO+ZpGmAC5CSQGspGR3CUhAAhKQwGIEhiiA2azx8FLvL2v/8gi327JpY9H2jFLzL8KXjRcpLv044FZAHvVmfV8e46YMTHYHpybghTplYLrv83rgY8DR5YuPKfeYXcQpF5N1gylUvUhTABehpABWUrK7BCQgAQlIYDECQxTAPEpNeZXnAU8DstEihZwzy5bvvXCx0H7X61XAX5SZvZwgkkLSzyryl+9nY8iRZUNItxB0hLHbUpcw750dwL8t3zgf8Ooik5kZzKaSRY+rUwArkpiuPgKuBGZ3CUhAAhKQwDYIDFEAc7LGQ8pO29PLY9XZ1/68iNbYk6oAVmZQAawEZncJSEACEpDAyAQwJ4Gk6HJKwKQOYDZYfAa4DJByMb8rWz3ypgBWJlABrARmdwlIQAISkMDIBPDLpQj0J4GPlJnAI0oR5hy9dtEJZFQBrEyiAlgJzO4SkIAEJCCBkQlgZC9n0mUDx12AfyhFmLMh5PllE8fYk6oAVmZQAawEZncJSEACEpDAyARw/naz7u+6wNeAnMs7haYAVmaxRQFsMebKYWF3CUhAAhLoSWCIm0B6hjKqyxTAynS1KEMtxlw5LOwuAQlIQAI9CQxVAPcCHlw2g5wBfAnI+r+sD5xCUwArs9iiDLUYc+WwsLsEJCABCfQkMEQBnK37+zTw8RJXHgPvXUrA/GPPWId0mQJYmY0WZajFmCuHhd0lIAEJSKAngSEK4DeAvwP+ei6mpwA5dSPlYMbeFMDKDLYoQy3GXDks7C4BCUhAAj0JDFEAfwZctWz66IZ1OeBzQE7gGHtTACsz2KIMtRhz5bCwuwQkIAEJ9CQwRAF8B5DHvMfOxXRQOcs3x7KNvSmAlRlsUYZajLlyWNhdAhKQgAR6EhiKAN6+c/+7l3N33wR8onw9awD3Aw4DXtYz1iFdpgBWZqNFGWox5sphYXcJSEACEuhJYCgC+NsF7z87gs+5YN8hd1MAK7PTogy1GHPlsLC7BCQgAQn0JDAUAex5+6O9TAGsTF2LMtRizJXDwu4SkIAEJNCTgALYE9ySlymAlQBblKEWY64cFnaXgAQkIIGeBIYqgDcCHtUpBP1fwJHAR3rGObTLFMDKjLQoQy3GXDks7C4BCUhAAj0JDFEA71F2AL8Z+CiwQzkL+I7AgcDre8Y6pMsUwMpstChDLcZcOSzsLgEJSEACPQkMUQAz23cM8Py5mB4B3LfMCvYMdzCXKYCVqWhRhlqMuXJY2F0CEpCABHoSGKIA/hK40hqFoP8YOBHYqWesQ7pMAazMRosy1GLMlcPC7hKQgAQk0JPAEAXwa2W938vnYjqkrAvMiSBjbwpgZeIHpiMAACAASURBVAZblKEWY64cFnaXgAQkIIGeBIYogIcCLwD+FvgYkNp/1y/r/x4KzIthz9BXepkCWIm/RRlqMebKYWF3CUhAAhLoSWCIAphQsuHjkZ31frNdwMf1jHNolymAlRlpUYZajLlyWNhdAhKQgAR6EhiaAOaUj8z2fR74cc+YxnCZAliZpRZlqMWYK4eF3SUgAQlIoCeBoQlgwvhFmfn7Zs+YxnCZAliZpRZlqMWYK4eF3SUgAQlIoCeBIQrgCcDjgPf1jGkMlymAlVlqUYZajLlyWNhdAhKQgAR6EhiiAN4CeBbwZODfgZ/Oxba1Z6xDukwBrMxGizLUYsyVw8LuEpCABCTQk8AQBfC3nViyA3jWciJI/jvrBMfeFMDKDLYoQy3GXDks7C4BCUhAAj0JDFEAb1xEb72QPtQz1iFdpgBWZqNFGWox5sphYXcJSEACEuhJYIgC2DOUUV2mAFamq0UZajHmymFhdwlIQAIS6ElgSAJ4vnICyL7AuYH3Ag8BTusZ25AvUwArs9OiDLUYc+WwsLsEJCABCfQkMCQBPBJ4APD3pRTM3YEPAvv1jG3IlymAldlpUYZajLlyWNhdAhKQgAR6EhiSAH4deCLwhhLLtYCPAjsBv+kZ31AvUwArM9OiDLUYc+WwsLsEJCABCfQkMCQB/F/g0sCpnVh+DvwJcHLP+IZ6mQJYmZkWZajFmCuHhd0lIAEJSKAngSEJYGb5Lgb8oBPL6cBVgamdCqIAVg7YFmWoxZgrh4XdJSABCUigJ4EhCWDq/70T+GUnln2A988Vg75Tz1iHdJkCWJmNFmWoxZgrh4XdJSABCUigJ4EhCeCxC8Zw0IL9htxNAazMTosy1GLMlcPC7hKQgAQk0JPAkASwZwijvEwBrExbizLUYsyVw8LuEpCABCTQk4AC2BPckpcpgJUAW5ShFmOuHBZ2l4AEJCCBngQUwJ7glrxMAawE2KIMtRhz5bCwuwQkIAEJ9CSgAPYEt+RlCmAlwBZlqMWYK4eF3SUgAQlIoCcBBbAnuCUvUwArAbYoQy3GXDks7C4BCUhAAj0JKIA9wS15mQJYCbBFGWox5sphYXcJSEACEuhJQAHsCW7JyxTASoAtylCLMVcOC7tLQAISkEBPAlMXwMcDKRx9eSDHyn0MeCzw5Q6vHYHnAHcHzgu8D3gAcErpc0HgNcBNgK8AqUP4uc71LwFyjvFzK3KgAFbAStcWZajFmCuHhd0lIAEJSKAngakL4LuANwAnAOcC/ga4CnDFzukiLwVy4siBwA+LyEX6rgHkeLqIXf79fsChwPWBvQvv6wAvAq5d+i6aBgVwUVKlX4sy1GLMlcPC7hKQgAQk0JPA1AVwHstFgO8DNwI+DOxazh6+J/DG0nl34GTgNsDxwDuAtwEvA64AfBo4P3DuIpb3KV+rSYECWEPLGcBKWst1P+mI2y73Al4tAQlIQAKDJ9CaAP4x8NUyC3gicNPyyDczfj/uZCuPeN8KHAY8E7gscADwIOCuQGb+ngRcGHhYjywrgJXQWpwNazHmymFhdwlIQAIS6EmgJQHcATgOuABwg8IrUpcziLMOsNveDXwTOKTMEuYx8fWAk8pj4F8Bby8imMfKtyizgPcFtqyRi7x+9z12zhrDLVu2sMsucUHbRgRalKEWY95oHPh9CUhAAhLYPgRaEsAXA3m2lTV8sw0e6wnge8rGjvuvg/n9wFHAnsDtyuu+oqwhfOQa1xxeZhPP8i0FcPFB3KIMtRjz4iPCnhKQgAQksAyBVgQwGzX2BW5YZvZmzBZ5BDzP9+Aifdld/GbgvUB2Akcun1o2jMxf4wzgMqPUNYBL0qu73DWAdbzsLQEJSGCMBKYugHnsG/m7I3Djsv6vm6fZJpB7AG8q37h4mSGcbQLp9s8mkk+VWcRTyyPl2WxgBDMzfVdbYCC4BnABSN0uLc6GtRhz5bCwuwQkIAEJ9CQwdQHMzFwe895hrvZf1umlLmBa1vflMW7KwPyo1AS8UKcMTBft60stwaPLFx8D7A9kF3HKxWTd4AMXyIUCuAAkBTDLTDe/OQO4+cx9RwlIQAKbTWDqAnjGOkBTzPnV5Xs7AUcWUewWgk4pmG67ZXnEmx3Avy3fOF95nVuVmcHIZsrMbNQUwI0IzX2/xdmwFmOuHBZ2l4AEJCCBngSmLoA9sZztlymAlYhblKEWY64cFnaXgAQkIIGeBBTAnuCWvEwBrATYogy1GHPlsLC7BCQgAQn0JKAA9gS35GUKYCXAFmWoxZgrh4XdJSABCUigJwEFsCe4JS9TACsBtihDLcZcOSzsLgEJSEACPQkogD3BLXmZAlgJsEUZajHmymFhdwlIQAIS6ElAAewJbsnLFMBKgC3KUIsxVw4Lu0tAAhKQQE8CCmBPcEtepgBWAmxRhlqMuXJY2F0CEpCABHoSUAB7glvyMgWwEmCLMtRizJXDwu4SkIAEJNCTgALYE9ySlymAlQBblKEWY64cFnaXgAQkIIGeBBTAnuCWvEwBrATYogy1GHPlsLC7BCQgAQn0JKAA9gS35GUKYCXAFmWoxZgrh4XdJSABCUigJwEFsCe4JS9TACsBtihDLcZcOSzsLgEJSEACPQkogD3BLXmZAlgJsEUZajHmymFhdwlIQAIS6ElAAewJbsnLFMBKgC3KUIsxVw4Lu0tAAhKQQE8CCmBPcEtepgBWAmxRhlqMuXJY2F0CEpCABHoSUAB7glvyMgWwEmCLMtRizJXDwu4SkIAEJNCTgALYE9ySlymAlQBblKEWY64cFnaXgAQkIIGeBBTAnuCWvEwBrATYogy1GHPlsLC7BCQgAQn0JKAA9gS35GUKYCXAFmWoxZgrh4XdJSABCUigJwEFsCe4JS9TACsBtihDLcZcOSzsLgEJSEACPQkogD3BLXmZAlgJsEUZajHmymFhdwlIQAIS6ElAAewJbsnLFMBKgC3KUIsxVw4Lu0tAAhKQQE8CCmBPcEtepgBWAmxRhlqMuXJY2F0CEpCABHoSUAB7glvyMgWwEmCLMtRizJXDwu4SkIAEJNCTgALYE9ySlymAlQBblKEWY64cFnaXgAQkIIGeBBTAnuCWvEwBrATYogy1GHPlsLC7BCQgAQn0JKAA9gS35GUKYCXAFmWoxZgrh4XdJSABCUigJwEFsCe4JS9TACsBtihDLcZcOSzsLgEJSEACPQkogD3BLXmZAlgJsEUZajHmymFhdwlIQAIS6ElAAewJbsnLFMBKgC3KUIsxVw4Lu0tAAhKQQE8CCmBPcEtepgBWAmxRhlqMuXJY2F0CEpCABHoSUAB7glvyMgWwEmCLMtRizJXDwu4SkIAEJNCTgALYE9ySlymAlQBblKEWY64cFnaXgAQkIIGeBBTAnuCWvEwBrATYogy1GHPlsLC7BCQgAQn0JKAA9gS35GUKYCXAFmWoxZgrh4XdJSABCUigJwEFsCe4JS9TACsBtihDLcZcOSzsLgEJSEACPQkogD3BLXmZAlgJsEUZajHmymFhdwlIQAIS6ElAAewJbsnLFMBKgC3KUIsxVw4Lu0tAAhKQQE8CCmBPcEtepgBWAmxRhlqMuXJY2F0CEpCABHoSUAB7glvyMgWwEmCLMtRizJXDwu4SkIAEJNCTgALYE9ySlymAlQBblKEWY64cFnaXgAQkIIGeBBTAnuCWvEwBrATYogy1GHPlsLC7BCQgAQn0JKAA9gS35GUKYCXAFmWoxZgrh4XdJSABCUigJwEFsCe4JS9TACsBtihDLcZcOSzsLgEJSEACPQlMXQBvCDwauAZwceCOwFs7rHYADgPuB1wA+CTwQOALpc+OwCuBOwDfBQ4F3t+5/jHAHsCDK/krgJXAWpShFmOuHBZ2l4AEJCCBngSmLoC3Bq4HfAb45zUE8LHAE4EDga8ATwIijXsBpxexi/TtB+S1IpMXA84ALg0cD1wT2FrJXwGsBNaiDLUYc+WwsLsEJCABCfQkMHUB7GKJtHVnADP79x3gBcCzOjN+3wMihi8HXlLk7nHAeYGfARcFfgC8q/R5Sw/2CmAltBZlqMWYK4eF3SUgAQlIoCeBlgXwMsDXgasDn+3wOw74CXBv4BDgnsDNgVsWIbwE8JfAXYB9F+SeR8n5Z9Z2Bk7ZsmULu+wSF7RtRKBFGWox5o3Ggd+XgAQkIIHtQ6BlAbwu8FEgQpeZwFk7BtizCN+5ywzhbYDTgIcDXwROAG5S1g7erYjkwcCp66Tl8LLW8CzfVgAXH8QtylCLMS8+IuwpAQlIQALLEFAAYfeywWPG8RVlY8et1gH76jJj+E3gGcC1gWwGuTJw53WucQZwmVEKtChDLca85DDxcglIQAISWJBAywK4yCPgeYw3BY4ArgMcCfy6yN+VgA8DF1qQu2sAFwQ169aiDLUYc+WwsLsEJCABCfQk0LIAzjaBPB94duF3HuD7nU0gXaw7lZm/A8r/HwX8tjwWvhrwQWC3BfOgAC4ISgGsBLUdup90xG23w6v4EhKQgAQkMGQCUxfAPwD+uCQgGz0eAXwA+BHw7SJ6jwcOAr4KPAG4cacMTDd3edwbQXxU+eL+ZRZwH+Ahpc7gor85FcDKn4oWZ8NajLlyWNhdAhKQgAR6Epi6AEbmInzz7TWl9t+sEHR2+3YLQZ84d0HW96XcS2b6flq+dw7g6LIj+MtAZga/tmAeFMAFQTkDWAlqO3R3BnA7QPQlJCABCQycwNQFcKj4FcDKzLQ4G9ZizJXDwu4SkIAEJNCTgALYE9ySlymAlQBblKEWY64cFnaXgAQkIIGeBBTAnuCWvEwBrATYogy1GHPlsLC7BCQgAQn0JKAA9gS35GUKYCXAFmWoxZgrh4XdJSABCUigJwEFsCe4JS9TACsBtihDLcZcOSzsLgEJSEACPQkogD3BLXmZAlgJsEUZajHmymFhdwlIQAIS6ElAAewJbsnLFMBKgC3KUIsxVw4Lu0tAAhKQQE8CCmBPcEtepgBWAmxRhlqMuXJY2F0CEpCABHoSUAB7glvyMgWwEmCLMtRizJXDwu4SkIAEJNCTgALYE9ySlymAlQBblKEWY64cFnaXgAQkIIGeBBTAnuCWvEwBrATYogy1GHPlsLC7BCQgAQn0JKAA9gS35GUKYCXAFmWoxZgrh4XdJSABCUigJwEFsCe4JS9TACsBtihDLcZcOSzsLgEJSEACPQkogD3BLXmZAlgJsEUZajHmymFhdwlIQAIS6ElAAewJbsnLFMBKgC3KUGsxryreDMWTjrht5Yi0uwQkIIFxE1AAV5M/BbCS+6rkYJVi0FrMq4pXAaz8YbS7BCQwCQIK4GrSqABWcl+VHCiAlYlaovuqcqwALpE0L5WABEZLQAFcTeoUwEruq5IDBbAyUUt0X1WOFcAlkualEpDAaAkogKtJnQJYyX1VcqAAViZqie6ryrECuETSvFQCEhgtAQVwNalTACu5r0oOFMDKRC3RfVU5VgCXSJqXSkACoyWgAK4mdQpgJfdVyYECWJmoJbqvKscK4BJJ81IJSGC0BBTA1aROAazkvio5UAArE7VE91XlWAFcImleKgEJjJaAAria1CmAldxXJQcKYGWilui+qhwrgEskzUslIIHRElAAV5M6BbCS+6rkQAGsTNQS3VeVYwVwiaR5qQQkMFoCCuBqUqcAVnJflRwogJWJWqL7qnKsAC6RNC+VgARGS0ABXE3qFMBK7quSAwWwMlFLdF9VjhXAJZLmpRKQwGgJKICrSZ0CWMl9VXKgAFYmaonuq8qxArhE0rxUAhIYLQEFcDWpUwArua9KDhTAykQt0X1VOVYAl0ial0pAAqMloACuJnUKYCX3VcmBAliZqCW6ryrHCuASSfNSCUhgtAQUwNWkbikBbPEX5apiVgA37wdkVTlWADcvx76TBCQwHAIK4GpyoQBWcl+VHCiAlYlaovuqcqwALpE0L5WABEZLQAFcTeoUwEruq5IDBbAyUUt0X1WOFcAlkualEpDAaAkogKtJnQJYyX1VcqAAViZqie6ryrECuETSvFQCEhgtAQVwNalTACu5r0oOFMDKRC3RfVU5VgCXSJqXSkACoyWgAK4mdQpgJfdVyYECWJmoJbqvKscK4BJJ81IJSGC0BBTA1aROAazkvio5UAArE7VE91XlWAFcImleKgEJjJaAAria1CmAldxXJQcKYGWilui+qhwrgEskzUslIIHRElAAV5M6BbCS+6rkQAGsTNQS3VeVYwVwiaR5qQQkMFoCCuBqUqcAVnJflRwogJWJWqL7qnKsAC6RNC+VgARGS0ABXE3qFMBK7quSAwWwMlFLdF9VjhXAJZLmpRKQwGgJKICrSZ0CWMl9VXKgAFYmaonuq8qxArhE0rxUAhIYLQEFcDWpUwArua9KDhTAykQt0X1VOVYAl0ial0pAAqMloACuJnUKYCX3VcmBAliZqCW6ryrHqxTAVcW8ynG9xBDxUglIYDsSUAC3I8yKl1IAK2Cla4u/KFuLeVXxKoCVP4x2l4AEJkFAATwzjQ8AHg1cHPgC8DDgIyXDzwMOBP4HeAzwhk7m9wfuCexTORoUwEpgq5KDVc6UtBbzquJVACt/GO0uAQlMgoACCHcFXlck8KPAIcB9gCsCfwq8ArgdcDngb4FLAj8EdgNOAP4C+HblaFAAK4GtSg4UwMpELdF9VTlWAJdImpdKQAKjJaAAwieBzwCHdrL4X8BbgR8DVwfuVr73vSKDEb9jgPR7fo/sK4CV0FYlBwpgZaKW6L6qHCuASyTNSyUggdESaF0AzwP8DNgPeEsni0cBVwOeAbwY2Bu4DPABYE/gSsALgGsDv1kg+zsC+WfWdgZOOfnkk9lll7hgXbvyYcfXXbAde5/4lFtux1db/KVWFfOq4g2Z1mJeVbxhvao8ryrmVcXb4rhe/FPOnhLYXAIRwD322CNvuiuwdZl332GZi1d07e7AqcD1gI917uEJwL2BvYDDgXsAPwf+Gng78O9lXeB1gAcDpwH3K+sH1wolr3HYimL0bSUgAQlIQAISkMB6BJoWwOsCH++QeWLZ3HH5NWhF5gLrWODdwFXKY+EHAddYh+78DGC6XRD40SaPx9/NPJZ1jKdv8nuv6u2MeVXkN/d9W8tza/FmNBnz5v5MreLdzPEqqEN84Ixl3nqMM4AbPQK+0RyQCOG/AH8GHAxcH8hO4POXXcJLW/QyCVjg2t+tPdwe070LvNdQuhjzUDJx9t5Ha3luLd6MHmM+e3+GhvDq5ngIWehxD2MUwISZTSB5pJtSMLP2ReA44PGdryW+DwHPAd4GPBy4IXDHsiM4G0YuAPykB7vNusQfrs0ivdr3Mc+r5b8Z726ON4Py6t+jtTy3Fu9k/rAZqwDOysDcvzwGzlq++5aNHt/q/Pzn67cA7lK+di3gPUB2Rdy6fD2bQ4bc/OEacna2372Z5+3HcqivZI6Hmpnte1+t5bm1eBXA7fvz0uvVMvuXIs8pBH1imd37cOeV/rDMFGat4Hc6X8+mkIcC3y+bRj7V690376KsRcys5jOBX27e2670nYx5pfg37c1by3Nr8WYgGfOm/Tit7I3M8crQL/fGY50BXC5qr5aABCQgAQlIQAINE1AAG06+oUtAAhKQgAQk0CYBBbDNvBu1BCQgAQlIQAINE1AAG06+oUtAAhKQgAQk0CYBBbDNvBu1BCQgAQlIQAINE1AAG07+gEK/HJDd2hcrlc2/V475++qA7tFbWY5ACq8fsEaePwr8A/DT5V5+cFfns/Vm68T7vmUr+A8u2t/fUIs/y63F3FK8OSksNYcn2RTASaZ1NEHlFJbXAvuU005Smidj8iLlBIGc4HKvZQ+8HiCNSwKHriO9LwNOHuA9L3NLVyz1N89XCrNH8JPniwI5uSfyl3qdKeY+hXYJ4F/LkZMpUdWN98rA54DblzPNpxBvYmjxZ7m1mFuLN+P6t8A3gVcBr5nYz+zvPoRtwyVwA+AQ4LKlaPWp5bzjDMh/G+5tL3xnkb+rlSLeOd2l264NHAP8R6nXuPCLDrxjjiJ8Z5G8nEvdlYObA3uUIuWZGZtK+wDw3yWP/zsXVI52fHWp53mTiQScE4n+ALgH8N25mFK39O848xzPfScSb8Jo8We5tZhbi3cmgK8sf7BdCDgeyH9ncuI3Y//5VQCHm8E7A68D/r5IX2ZRvlGOv7sdcJvh3vrCd5Yj+HIqy7z8zV7gz4F3lWP7Fn7RgXc8och7jiVcqz2/nFe998DjqLm9nwHX3MYMX2bFUpA9M4RTaP8DXK/M9K0VT84l/0iRxCnEmxha/FluLebW4p0JYJYm/Qi4A3Bw+Z11WpkR/Fvgy2P9IVYAh5u5zwKRgfzVldmCPy0CmBmzSFEG5dhbPlDy6G+901gyC5i/uHYbe6Cd+/95mfVc70Pj8kByf94JxZyZ65zck5mxtVpmwl4M5NHpFNoPgP2BzHyu1W4KvLEsdZhCvDMBbO1nubXPr9bi7QpglifNWj6nIoIHApcC8rTmhmP8QVYAh5u1zJpk1u+kOQG8TJlJ2Wm4t77wnWWG86rAXwGfnrsqM0avAP6zrANc+EUH3jGzuE8Djl3nPg8Cngwkz1NphwMPA55e1gLmsfcZ5Y+YPPZ+AvAC4KkTCfhFZbbgESXeLSWurKFKvM8F3lqOpJxIyL97WtHaz3JrMbcWb34285g3yza6Atj9mf2LIoN/OcYfZAVwuFn7eln/9945AcymiMcVORzu3S92Z5nZyw7QPAbOX5f5IYsY5Bzn/LLM7F92juZ7U2mZCcvMbuT2PWUNYFeG7lNkKZtBptQeW4RnttM7seXzJ2sDI3/PnlCwWdd4VPnFcC5gtu4xX/91WVAeIZ5fDzlmBC3+LLcWc2vx5ucxm0DymbWeAI75Z9ZNIAPO3mPKovlMNUcUsuZvzyIPmSk5esD3Xntreex5nc5j7UjBx4Ev1b7QSPrfFcgawJQYOGe55/ylmXIDzwPeNJI4+tzmpefynA1NU227lLWP+YMmLeM6Od461YCB1n6Wk8orlM+vbp6n/PnVUo5TpSCPePOH2+SaM4DDTunfFFGYPe79JfCc8ohw2Hfu3S1C4NzAhUvHLCr+1SIX2UcCEpCABCSwLAEFcFmCZ//12RmZtYDnKGv/ssNwyi2bXFJoNOUz8pdXHo9OtWX2LwKYGH84hbICCybqAmV2e5bn1NeaWu3D1mo9rpX6Fn6WWytwPp/nqef4kcA/Ad9a8LNtVN0UwFGla3I3+/qyzjG7nFM37Z/LIvnMhGV2LI/Lsmh+SmsAk8Q7Ao8qjwezRiwtjxiyEebIskFgSsn+TimKHMnNI+CPleCywSePz3YGUvJnKo/8W6z12OLPcmsFzlvMcdYA5p/s6E/9v7dMae2uAjjcX7P5yzKbPbLLKCcmZAaw26awS7S7wyrik9qHdwE+A6Q2XNbCpeRNdlNOpaWw9wuB1I/KJpduIehshsku4AeXTSJTibm7kDqbfrKo+rZAdrrvWP7C/gWw30QCbrHWY4s/y60VOG8xx/nsyjr8lKrKOvys300h98hgTvkZdVMAh5u+/KLMAtRsvc/j0PlHodllOPbWFYP8MGVzS3cDRH7gskP0T8YeaOf+vwY8s+wEXSusfNg8sZz+MpWwu3lOGZzsdH5/J7jUe8xjlpyCMoXWYq3HFn+WWytw3mKOuzFnIia1//JHen4n5QlVqjm8oVTqGN1nlwI43JTlsWdmSaZ0JNg87fxwZedcCufmnwhv9zzY7HrOY8EpFUVuVQ5meU5R6BQM/kJnMKSYavI8hdqWCavFWo8t/iy3VuC8xRyvVwYmx7Smfm2eWKVlCdPomgI43JSlPEZmwP5ruLe49J3lhyvn/eYv6RTSvPvczFDKpOQR8EWWfqfhvEDW+X0IyOLitVqKBEeEUwh7Ki15zgxv1jlm40dqWWYtzaylin7WF2XjxBRai7UeW/xZbq3AeYs53qgQdEo9paxXZgJH1xTA4aYsB8nn7MF7F0Ea7p32v7MPzj3aztqKV3VeLidiZA3kjfu/xeCujNy9vewqe/cahaAz6xnxz1mxU2mHzQXyibL+cfblrP+M/OUPgKm01mo9tviznLHaUoHzFnNsIeipfCKPLI6cB3vZclpCjoObrxF39ZHF0+d2s9ElpyWc0ufiAV+TR56Hlp2vszOdZ8WvcwJI8m2bBgFrPZ6Zx6n+LM9GaUsFztf7yZx6jqfxidSJwhnA4aZ0ftZk/k6fMtxb984kIAEJSEACEhgyAQVwyNnx3iTQBoHMdGcNzU0nFO6fAvsAPyo723PSy6xl3VB2t2fH95RaNmtl3W5i7m7mSozZ4LM/8NopBVzqlKbuY9b1Zmd71rM+vpQ3SgWHYycWb+p2pmbn7Ki7HAv30BJvlvB0d/dPJfTUop1kjhXA4Q/RfKDmhy5lYPKhmkfDtukSiDikDuLsjODpRvr7yKYWc3Y5/wvw1VLkOqf5RH5SNy4tO6JTHHtKOU5ZjKxp/aPyWZU1rFnTmRJWU40567QjeJ8vZUFSv/P5paRRfrfes2xuS4mjKbRbAccBOY0qYzoF7SP0nytLlbK+ObVMpySBk86xAjjcH8vUHEp9oWyASEmY5GrX8kvkbqVsynDv3jvrSyAyFMmfL/zd9/WGcN1DNriJS5STUaYiRDnpJLKXeo75uc2pL39dCl1nV/sUBTC7unOqTWqk7QY8rxRzz+fXtycac35OI4Ap7J7NapH+5DwSmJYC9ncqs0dD+Dlc9h4yriN3TwLyO+glwEtLzHntnF2/dynztOx7DeX6SedYARzKMPu/9/HGsgkkf0XOSsHk6KGcm5piwlPaMTncLGz/O3vzBi8Zyc8vzanIUMLNTrrMBGVDz1rtPOV0kKnEvAXIJq2vd4LNz2sec+f/PzXBGcCcaHMzIMf7zdqLgdsBNwF+OsGYMxN2FSAlu9IyvlO+KTOCjLOXagAAGfBJREFUaXuVOq4573sKLeM6T6Ty+yd/oP4SSBH3PLFIy+lN7y0/y1OINzFMOscK4HCHaX7Y8oGaY6W67VrlUUv+yp5Syy//HLcze9wd6c3jhtRhmlLLbu73lPIva8V1wfJLcyoylBjzCzLlMrqnvHRjz4Hyqao/lZi/D9y6xNSNM6VhcgRgakBGjqYSb2LMEVmRgfm6pS8qP9cHACkjMqWYf1zWw325JDlnmmcGP4XA07IzOPUvc6znFFpXABPPfLxTLNw/6RwrgMP9scwPV6qN/8fcLf5ZWXCcheRTaX9cauOlFlw+TDMus6bo5HIaSncmZewxZ3Ygx/h16x1OWYYSW9ZAJYeRwLXa1B57Zy1c/nnOGsFmBjCz+BGhKclQZjUje9n4MN+OLmvh8pk1pZjzx/nTyx+qiTnx5XN7dmxn/oCP6GcmcAota/3yM5xlDGmZ8csJPinwnpaNElkTOIVz6mf5mnSOFcDh/lhm9iuzfPmFkQXjaVkr9fdA/irJAtyptHcU6ctpINlBmHahcuh2Hh/mSLyptKwZysknD1wnoMyAhkdmD6bSsnQhi8ZzCspaLbXydi/FsacQc342sxv04esEk5/p+5VHo1OINzFk52v+YE0R87Va1ovdf2JrW5PnHwIfXifmx5XZvxS0n0JL/vJHeQrZr9WyBjDrW3PW91TapHOsAA53mO5R/rLMX1n5octflZlizwxSHpXma1NpWR+U0gLd9UOJLTNDOQt5lOcsrpOcHcssSCTQJgEJSEACElgJAQVwJdir3jSPETIrlFylDEwW2U6tZdYvi8Wzy6zbrld21mVdnE0CEpCABCQgge1EQAHcTiDPppdJaYH8k5Iw82VBplRENutGsmvyr8oOyeDMgvLsmszmgAPPJr6+rAQkIAEJSKBJAgrgcNOeo+BSOyzrplJCY7aweHbHU1oDmLWOWRifkxNmZx6nptjbSl2x1EG0SUACEpCABCSwnQgogNsJ5NnwMpG+x6yzq+5seLtBvGR2A3cfd6felE0CEpCABCQgge1MQAHczkC348tld1lq/k2pBMp6eDLTmZIZ8xsjcrboo4GnbkeuvpQEVkFg9lk7P5O/invxPSUgAQn8bmOBbZgEnlWqkD9tmLe3Xe8qxZ4vDqSAbrelFEy+NqXaYWuBS/3DiMGp25XqMF8s54XmaLRuwe8jgZwdO8V2r/JHzOVKcF8BEu9a9fKmEv9lgYfN5Ti1L6f8x2xr49ocn1n0fNSfXQrgcD9y84GZXx4p+5J/ZmvjZneccyan0lLrL/WjfjAX0E2BHIl3kakE2okjm3pypmZOhZiVuUkR2eeWMzXDZGptdrB6jsNLeZ98/ly31LTMRp/XTyzg/IzmD7gUQp7Fm53tqQGZ3M/OjJ1S2Lcsa3dTwL6b45R0yhrfnIIztdbauDbHE/nsUgCH+1GUw+TXa5ktihyNvaWgdWLJ+bc5Sqr7eCyzfhGjl22jaPKY439m2fWczT5dOTi87H7OofJTa/mL+Zg1xCeidN8yYzSlmHMEXvKbXe7ddm8geZ5Sse9ZfJ8FjgdSBLnbjgBuUXb7TynHiaW1cW2Ofz+CR/3ZpQBO7aNoXPHkF2HGYM5HzSOjnDU5azlY/STg4+MKaeG7zekuqayfnc7ddgcgpybk1JeptRwef6VymHw3tmz+yZmpO00s4F+U47LmNzPlcXCKnk8t3qQvMV8F+OpcLnO0Y55kTDHmFse1OT5zgI/6s0sBnNhvnJGGk/UzmQWbnSk50jCqbju/KK8KZE1Yt+Xc0Dw+ywaYqbWIUNbMvHwusEPKusDZOrmpxB2pzWPtZ8wFlMe/dy2iNJVYZ3HkhKLMivzjXGD7l41efzS1gMsfNC2Na3P8+0E86s8uBXCCn0aGNAoCnwTyz0Pm7vZFwN7laLxRBFJxk4cCLygzvjn1JY/8c4B81v89dA0xrHjpQXa9c1nDmtN78gfOLN4Ud48QvWWQd73cTWVHf85AziPfbo4fW9a3Pn25lx/k1a2Na3M8kc8uBXCQnyfeVAMEMuuZQ9W/XR5zRw6yISJnQN9mwrtiU8A8G1+yCzhttpPuuInm/BpFiLr1LbPRJ+uoptjyOyXLOZLj3UuAWe6QGbIXrlHQfioMWhrX5ngin10K4FQ+foxjjATyCzI7Qi/fOes56//yC9MmgbET2LkEkN3ttmkSMMcjzqsCOOLkeeujJpC1UFlLs1Zh4HwvM4NTa98oj7dT5LzbchTgZ4DLTCzgFutbvh+4EzB/fOMuwFsnUr1gfpi2Nq7N8e9HwKg/uxTAif3GMZzREGhRDlLb8GJrFPxODcgI746jyd5iN7pevJn5TVHkKW70WS/mi5ZC5+deDN2oejmuz0yXOR7VsD2zBIdNAkMlkGrzr5jorMF6xa/3BL4InH+oSelxX7cv12QGKKV/uuV+Uu8xmyJuDmQH9BTabGNPCj0/uZzoM4sr8d4QuBTwZ1MItsSQHe1p2cGeGqU/6sSWmG8FZMdk4p5Ka21cm+OJfXYpgFP5KJpmHDk9II8Gp3QU3PNKqrLrNXLbPf84cV4byOxgToyYSpudapLH3fOfOTnhJvUes2ngXycScApAp0XmTyn5nIU2q2+ZnZTZBT6VlhzPljOs9Xvl58CDyw7wKcWcWFoZ1+b4rCN39J9dCuBUPorGGcd8CZT5KFIMOefGTkkAZye8ZBdwilxHCObl4DlrFNIdZ4bPetcRo5S4OW0KwSwQQ3Kd9XA58WbqLbKb3ydZD3etuWMdM8Zzpnf+sJlia2Vcm+OJfXYpgFP8OBpPTPmL8rtzEtS9+/OUNWNTEsBZfMeW2nc5As8mAQlIQAIS2FQCCuCm4vbN5gjkL+cUiH3TOmSuBvz7xGYAHQQSkIAEJCCBlRNQAFeegqZv4J/KbshI4FotawBTMPccTVMyeAlIQAISkMB2JqAAbmegvlwVgSsC5wM+vc5VKRmRkhnfqnpVO0tAAhKQgAQksE0CCqADRAISkIAEJCABCTRGQAFsLOGGK4EVErhcOe84xaBTOuN7wMcmuuM5n603WyPejwLvm/CZuH8A5Pzjbo6zjvd/Vjjuzu63bmlch6U5nshnlwJ4dn80+PrLEHhG+UVy8DIvMsBrU+T5gHXk4B+Anw7wnpe5pV2B1wL7lCLQKQmSz56LADki7F+AewFT2RGd8kWpaXgV4MQiuok3JyVcGfgckCLCpy4DdWDXngt4LnBfYKeysz8xZxnHL4BjgEcDqZ02ldbauDbHZ5YzmsxnlwI4lY+iacbxGmCPiZ0EknWP7ylrHz80JwepDRj5u0U5DWQqWY38ZUd35GC++HEKX0cOcoJETgmZQjuuzJLco5Q56sZ0ceDvgNOBfacQbInhKODOpaD38Z2zgHNW6i2BI4E3Aw+bUMytjWtzfNbBO/rPLgVwQp9GhjIKAikO/N9FdrpFoHPzqXv4aiCScJNRRLPYTf6kSMB6J1/8OfAuILIwhZbHnTnJJTN9a7UcAfeRIolTiDcx/AC4K/D+dQLKcX9vKLO+U4m5tXFtjv/vyB31Z5cCOJWPIuMYC4Ec/XbNbczw5RHhp8oM4Vhi2ug+84sys5qJa62Wv6QzazQVAcwvyv2B2akv8zHnrNw3TkyGIr3XBT6/To4zA/xvE5Pe1sa1Of6/g3vUn10K4Ea/uvz+2U3gksCh62wOeBlw8tl9A5v8+ln39QAgjwnXanks+GIg68im0l4H5CD5v1qj5E9kOGci/2dZBziFmF8E3AF4RHncv6UElTVjNy9r5d5aToKZQryJIes4zwv8ZVnW0I3rD4GMgawFzNrHqbTWxrU5PuvIHf1nlwI4lY+iccZxfeCdRfLePbceLr8os/7v1kB2Tk6lHV7WQT29yEF2wmZHbHZNJuYnAC8AnjqVgMvMXja3ZC1YZk2ykDoxRwwiRZn9y6aYfG8KLY/ys14qm5eycH72qD9f/zXwqjIG5pcAjDn2/Ky+A7h8Z+PLbFxnVvuLwG2BU8Yc5Ny9Z8a6pXFtjif22aUATujTaIShnFAeCz18nXt/PhBJ3HuEsW3rlnPyyUM7pTLSNz+LWRsY+Xv2xOKdhXMF4DpF/PK1xPtx4EsTjTc7nGclUWbxpiTKVHY7z6ctJ/ZE8rMuKn/QdHOcP/By9vcUW6Q343o+5imOa3N81nE96hwrgFP8OBpPTD8vu0O/vM4t54M1R8Hl0dIU26XnfmnkbGSbBCQgAQlI4GwnoACe7Yh9g20Q+AbwNODYdfocBDwZuIwUR0+gtdqH3YSlFl4ef6Zg8HeBt0yw1mPibbX4dTfX2ewyy3OWruQx+JSaOT6zpNUkcqwATulHc3yxZDNEHvNmE0Bq482vh7tPWSuVzSBTbRcoJWFmHyipfTi1jS+t1T7M6Sa3KWsaU+w6pVH+pJxpnXVUWQOZHbNTKgTdYvHr1wOHlJqOOR3jn8s63hS7jvTncX/W9U5lbas5nliOFcCpasV44krtsKwBzFqpc5bb/k358Hwe8KbxhLLQnX6nnBDxQyCPgCMLadkFmzVyO5c1VKNeWzJHorXah1nrlvVgEb0Uuc4a1mxmyprHCwFvK+sesyt6Kq3F4tf5nErNzuQ5ha5TCPsuwGfKiS/57Ep9y+wGn0IzxxPLsQI4hR/LacSQv5gvXEI5bWJHRnUz1JWD7CCMKOTxYOoD7gj8UymXsd800vq7KFqrfdjNcda3RgDe3snnjcuyh/wBMJXWYvHrbp5z5F927nf/YM0scDZ1ZfZ3Cs0cTyzHCuAUfiyNYUwEur80sgYyj7m7pyeksGgkMI8Kp9Jaq32YHKfETQpCZ1lDTnVJGZRZ2xOIGObM3Km0Fotfd/Oc+HOU43yeM5M/lU1s5nhiOVYAp/LxaxxjIdD9pRExygkZX+jc/KXK48EpyUFrtQ+T49S3/CWQ2b4UR85/z1rKpKQQ9KxsyFjG7rbus8Xi18lzHvFnhjs5vvvcH3NZ1pJHwFkHOoVmjieWYwVwCj+WxjAmAvmlkcdFKQicjR/3KrtCZzHcEMji8pyQMqXWUu3D+V3tKZD8j51kZr3YVYBbTSjBLRa//uDcLt+/K0W+Z2lNBYOcgZw/AqbQzDFMKscK4BR+LI1hTAQOm7vZT5STMGZfjhxE/jKbMMVm7UNISZxsIMjRaFNrrRW/3lb+Ur4qp71M6fSTxGuOf5/1UedYAZzax6/xSEACEpCABCQggQ0IKIAOEQlIYNUEsuHlKeXs3FXfy2a8/1TjzWaHrHv70dxmiDDNmtb9gdduBuBNfI/WYk6pqqxhnR3hmNOacqxlKhjk8Wh3Q9smpuFsfavJxqwAnq3jxheXgAQWIPCnpXbarA7kApeMussU402pk5z3+0dlXdxHgAOA1L1My67o/PuUcrxWzFm6kdNephhz1qymFmDKwZwPuGMR+s+VU2CyCzpnQU9JAicdswI46t8j3rwERkHg9hvcZdbRPHdCctBavElvjrc7F5DjG3cDUsT9ymUDxLcnKoCtxZyi9ZG7JwF3A14CvBR4Yvn5/ptS9DyVDabSJh2zAjiVYWocEhgugex8zpmo2/q8yfenMjvUWrwZeal3eLNyos1sJL4YuF2pg/jTCc4AthbzlvKI/2vAOUqZo9QtzcknaRH+906svNGkY1YAh/tL0zuTwFQIpN7hA0vtu7ViyuHqOTd1KgLYWrzJ6VYgMvBfcwlO7bh9y+PglE2ZSo5bjLkrQ4n/dCDLGVLQPi0FzqdU+DoxTTpmBXAqv2KNQwLDJZCzb/8D+Ot1bjG/RD5bZhWGG8Xid9ZavCHzKSCy97o1MB1dCiWnfMiUBLC1mLPWL/U8U9x6NuMX4UtN07TrlzWBWdIxlTbpmBXAqQxT45DAcAncgDNr381+cczfab53TeBDww2h6s5aizdwHg8k7px/u1bLerH7T0jyW4w5+Tt57lzrbq6zBjCbfXK85VTapGNWAKcyTI1DAhKQgAQkIAEJLEhAAVwQlN0kIAEJSEACEpDAVAgogFPJpHFIQAISkIAEJCCBBQkogAuCspsEJCABCUhAAhKYCgEFcCqZNA4JSEACEpCABCSwIAEFcEFQdpOABCQgAQlIQAJTIaAATiWTxiEBCUhAAhKQgAQWJKAALgjKbhKQwGAJHAi8oJxBe3bd5EnlPfI+Y2ofBl4GvH6Tb3pH4KvAHcspL5v89r6dBCSwEQEFcCNCfl8CEji7CLwauHd58d+Us2LfDjwB+HHFm54X2Bn4fsU1tV0XFcBLlqOxcjzW5efe5FLAN4E/KyejdL/9VuAnQGQ2Lcem3agUWD5i7nXeAdwaeApw+DYCyTm8zyv3kfOJN7s9BLh9OSN4s9/b95OABDYgoAA6RCQggVURiADm5ICDgHMBVwT+FvgIcPdV3dQ677uoAD6pCNcNSwwf7bxerQDmSK2fA3t1XmP3Ipg/Ao7ZQADfDXwAeOaKWF6oSH3Oep4/I3hFt+TbSkACMwIKoGNBAhJYFYEI4G7Avp0beG6ZBYs8zNojiiRGiCI+/wI8Bvif0mH+EXDOFs6j2hwvd0Z5FHkI8OnS/7pAZtX2Bk4D3lJm2n5avn9R4FVl5uq/gUhdjrnKa27rEXA+T78GPAC4CZDXOXgJAfwisD9wB2Amkpkd/XPgj4DMGq43A3jhMiN6FeALnXsIjxxvtQ9wU+Bb5R5/ALyyMPk8cA/g6+W6vEdy9MLyfhcsZ/4+CHgkkPycAziqcOqOpwhohH69c6BXNfZ8Xwk0T0ABbH4ICEACKyMwL4ARvMhd5O9inbt6GJBD2TMLd2kg58q+v4hWus0L4InAZ4uM5NFyZqC+Ul4jQvQx4MnlTNOLAEeX72UmMi2PWPcA7gf8bxGfPLaNfG1LACNUfw/kMXAe/34SuDhwennd2hnA/wDyGZ2zkmfnqyaOyG+kbFsCGGH7O2AXoPv4NwJ4apG2vP6zCp88sn428O0yC5vH0XnMnJb3iujlLOfDgMsC/1RmF3M/LwYi1Zm9vQ7wiU7u8vrXKkK8soHmG0tAAv+XgALoqJCABFZFIAKYmaZfAOcEdio3khml52/jpvYDXgpklmstAdwKPBh4zRqv8dryWDUzgrN2feBDRbQys/blMssWgUuLzOUR5sM3EMDIX9Yhpl9aBCtymZm1tD4CGKn6tyKS1wD+sQjmCRsIYKQ5DCJr3RYBfHoR4Hw9s4kfB/6qCFy+djfgWCBrK9MigI8uUj6T2chgHk3n9WeC+SUgOe2uWcw6wPCIuNskIIEBEVAAB5QMb0UCjRGILFwCOBQ4X5nl+hMgmxd+3WGRx6mZfcsawcxoZb1gZPEPgDy2nZ8BjLA8sUjde4s0zR5n5nHoHwO/6rx+Pgfz/nn9vH9mt/L6mT2ctWxKyaaL9WYA8yj7u0Bk8t/LRY8C7lRmx/oKYEQur5fHr+GQR9Z53cjltmYAH1/k+kprCGAeK0ck0yJmmf3LLF2kMi3vkxnWXYHIdHhGuruvFbmOgN+28/qR6NxrBH7W7luEM2s9bRKQwIAIKIADSoa3IoHGCKy1BjBrxjLjlUe0aXsCmVlKKZM3ljWAkays0btAZ+fsfBmYiFzkJI8xs5s2s1pZ65eZvPcUoZrHnceftylylDIm3UenGwlg1v3lUWhXGvP5mrVxEaes58v9Zg3jjYucdt8/u37zmPuh5Yv570heBPCBZbd0BDWiltfaSAAjXhHWbBrptswApjRL5DFtrVnJ3F/yMOM7WwOYR+mztlbuuvc86/dY4J7AlRsb24YrgcETUAAHnyJvUAKTJbCWREQ+3lkeLX4HuDPwBqArZNmU8bQNBLAL7R/K492UJMlj2qwv/It1qOaxZoTz2sCnSp/Z17b1CDgzX5GmxNRtmbn7TJm1y9fziDhr7Z7T6ZRHrZHPrK/L+sa0rkxFxMIigphHtmkbCWA2wOT+s56yW1JnswXwdeV+I4E2CUhgQAQUwAElw1uRQGME1hLAIMhu3WwkyC7TzDplQ0dmwrJB5HqlrEkeHa81AxiZOrI8xk3NvWzIyOPKfwYyG3XV8tpZ4/aK8gj5CsDNy5q5vH8ENDNn2QSSR9GZXcz6u/U2gczuMa8Teey2zMRlB3HuN4+ds4HjcWWmL5tREkPuK7OaEc08cp0XwPx3HjHn+tlO5Y0EMGsqI41Z2/evnRvabAHMxp3M5s5EsLEhbrgSGC4BBXC4ufHOJDB1AusJ4AFlE0LW6p1cNhFkE0IkKCdbZBYvmznWEsDzFOGLKGbdWdbMvblsYshmk7SUf4mUZcdqPgOzPjCPl59Rvp8ZwmzcuBnwvVIGJjOO65WBeVEpqTK/3i4vl13GWRuYdXe5jzwSThmWbELJBorsto3sRgpTQmbW1nqc2h0PGwlg+qb+Xx7xdmsqbqYAhm92VEemU8/QJgEJDIiAAjigZHgrEpCABLYjgQhwNr1k9jL1/ja7ZaNJZm9nYr3Z7+/7SUAC2yCgADo8JCABCUyXQIpIZ+NJijFvZsuazczaprC3s3+bSd73ksCCBBTABUHZTQISkIAEJCABCUyFgAI4lUwahwQkIAEJSEACEliQgAK4ICi7SUACEpCABCQggakQUACnkknjkIAEJCABCUhAAgsSUAAXBGU3CUhAAhKQgAQkMBUCCuBUMmkcEpCABCQgAQlIYEECCuCCoOwmAQlIQAISkIAEpkJAAZxKJo1DAhKQgAQkIAEJLEhAAVwQlN0kIAEJSEACEpDAVAgogFPJpHFIQAISkIAEJCCBBQkogAuCspsEJCABCUhAAhKYCgEFcCqZNA4JSEACEpCABCSwIAEFcEFQdpOABCQgAQlIQAJTIaAATiWTxiEBCUhAAhKQgAQWJKAALgjKbhKQgAQkIAEJSGAqBP4fmRnulCB4ESMAAAAASUVORK5CYII=\" width=\"640\">"
- ],
- "text/plain": [
- "<IPython.core.display.HTML object>"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "{'Expected Raised': 44.24999999996098,\n",
- " 'Probability over 50mm': 0.35838949329068376,\n",
- " 'Raising No Capital': 0.035269140811299796}"
- ]
- },
- "execution_count": 143,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"df = mk.run_scenario(pool_size, rho, successprob, issuerweights, zero_recov)\n",
"mk.plot_prob_over(df)\n",
@@ -8235,9 +233,7 @@
{
"cell_type": "code",
"execution_count": null,
- "metadata": {
- "collapsed": true
- },
+ "metadata": {},
"outputs": [],
"source": []
}