{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Subplots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib notebook\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "plt.subplot?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4XuydCbhW4/qH7/Zu2M0qUgiREBKFJqUBhU5mcnLMVCIyxnHwN3QyR2Q85oTokEOkUbNKKZWUlNKc9m7a1R7+19qDdrthf9/3rrW+9a71+67rXOecep93uN9n3/vp/dZQCn1EQAREQAREQAREQAQiRaBUpFarxYqACIiACIiACIiACKACUEkgAiIgAiIgAiIgAhEjoAIwYhuu5YqACIiACIiACIiACkDlgAiIgAiIgAiIgAhEjIAKwIhtuJYrAiIgAiIgAiIgAioAlQMiIAIiIAIiIAIiEDECKgAjtuFargiIgAiIgAiIgAioAFQOiIAIiIAIiIAIiEDECKgAjNiGa7kiIAIiIAIiIAIioAJQOSACIiACIiACIiACESOgAjBiG67lioAIiIAIiIAIiIAKQOWACIiACIiACIiACESMgArAiG24lisCIiACIiACIiACKgCVAyIgAiIgAiIgAiIQMQIqACO24VquCIiACIiACIiACKgAVA6IgAiIgAiIgAiIQMQIqACM2IZruSIgAiIgAiIgAiKgAlA5IAIiIAIiIAIiIAIRI6ACMGIbruWKgAiIgAiIgAiIgApA5YAIiIAIiIAIiIAIRIyACsCIbbiWKwIiIAIiIAIiIAIqAJUDIiACIiACIiACIhAxAioAI7bhWq4IiIAIiIAIiIAIqABUDoiACIiACIiACIhAxAioAIzYhmu5IiACIiACIiACIqACUDkgAiIgAiIgAiIgAhEjoAIwYhuu5YqACIiACIiACIiACkDlgAiIgAiIgAiIgAhEjIAKwIhtuJYrAiIgAiIgAiIgAioAlQMiIAIiIAIiIAIiEDECKgAjtuFargiIgAiIgAiIgAioAFQOiIAIiIAIiIAIiEDECKgAjNiGa7kiIAIiIAIiIAIioAJQOSACIiACIiACIiACESOgAjBiG67lioAIiIAIiIAIiIAKQOWACIiACIiACIiACESMgArAiG24lisCIiACIiACIiACKgCVAyIgAiIgAiIgAiIQMQIqACO24VquCIiACIiACIiACKgAVA6IgAiIgAiIgAiIQMQIqACM2IZruSIgAiIgAiIgAiKgAlA5IAIiIAIiIAIiIAIRI6ACMGIbruWKgAiIgAiIgAiIgApA5YAIiIAIiIAIiIAIRIyACsCIbbiWKwIiIAIiIAIiIAIqAJUDIiACIiACIiACIhAxAioAI7bhWq4IiIAIiIAIiIAIqABUDoiACIiACIiACIhAxAioAIzYhmu5IiACIiACIiACIqACUDkgAiIgAiIgAiIgAhEjoAIwYhuu5YqACIiACIiACIiACkDlgAiIgAiIgAiIgAhEjIAKwIhtuJYrAiIgAiIgAiIgAioAlQMiIAIiIAIiIAIiEDECKgAjtuFargiIgAiIgAiIgAioAFQOiIAIiIAIiIAIiEDECKgANNtwh99BwEazbhQtAiJgQKAy8AeQa9CH36Fyh9/ENZ4I7E7ARne4to8qAM1QHgwsM+tC0SIgAi4QOARY7kI/fnUhd/hFWuOIwL4J2OYO1/ZTBaAZyipA+u+//06VKs7/1EcERMBPAhkZGdSpU8cZsiqQ4efYhmPJHYYAFS4CJgQsdofJsneJVQFohjJP4unp6SoAzTgqWgQSIuBIvGpVp/azswCUOxLadgWJgDEBi91hvPbCDlQAmqFUAWjGT9EiYETAYonLHUY7r2ARMCNgsTvMFl4kWgWgGUpJ3IyfokXAiIDFEpc7jHZewSJgRsBid5gtXAWga/wkcddQqiMRiJ+AxRKXO+LfbkWIgGsELHaHawx0AmiGUhI346doETAiYLHE5Q6jnVewCJgRsNgdZgvXCaBr/CRx11CqIxGIn4DFEpc74t9uRYiAawQsdodrDHQCaIZSEjfjp2gRMCJgscTlDqOdV7AImBGw2B1mC9cJoGv8JHHXUKojEYifgMUSlzvi325FiIBrBCx2h2sMdAJohlISN+OnaBEwImCxxOUOo51XsAiYEbDYHWYL1wmga/wkcddQqiMRiJ+AxRKXO+LfbkWIwD4JZOfkMnXxelZvzKRm5TROrVud1JQ9n3NZ7A7XskAngGYoJXEzfooWgZ0ERveFlFRofffuVMY+ATnZ0KbPLn9nscTlDuW+CLhIYPicFTw8bC4r0jP/6rV21TQe7NSADsfX3m0ki93hGjUVgGYoJXEzfooWgZ0EnCJv9GPQ5v5di8C9/bnz8l+9Ck4ZJAKRJ+AUf93fm0FuMRKFBc7ArifvVgRa7A7X9lsFoBlKFYBm/BQtArsSKF7s7aP4cwItlrjcodwXARcIOF/7tuw3apeTv6LdOkVOrappjL+n7S5fB1vsDheo5XehAtAMpSRuxk/RIrA7gcKir1QK5ObsfiJYJMJiicsdyn0RcIHApEXr6PLa5BJ7+uCGpjQ7ssZf7Sx2R4lrjbWBCsBYSe25nSRuxk/RIrA7gazt8OgB+X+eUhr+tW6vlCyWuNyh3BcBFwh8NnM5vQbPLLGn/pc3onOjg1UAFiGlArDEtNlnA0ncjJ+iRWB3AkOugzlDdv558WsCdQKorBEBESggoBPAxFNBBWDi7JxIFYBm/BQtArsSKPz61/nTZj0hreqebwwpiNIJoBJIBKJNQNcAJr7/KgATZ6cC0IydokVgz8VfqVTIzYZuE6DW8aC7gJUpIiAC+yDg3AXc7b0Zu7XQXcD7ThsVgGY/VjoBNOOnaBHYScB5DuCKmbBgOBx4AnQfv/Pv9BxAZYoIiMBeCOTm5nLqY9+yZtP2XVroOYAqAL38oVEB6CVd9R09Aq+fCcumwlmPQvNbSly/vgIuEZEaiEDoCUxfsp6LBk6ifJkUBnZtTPrWHXoTSAy7rhPAGCDto4kKQDN+ihaBnQTWLYIXTgbn8S+950HlWiXSUQFYIiI1EIHQE7h/6Gzen7KUC08+mGcubRTTei12R0zri6WRCsBYKO29jQpAM36KFoGdBEY/DmP7Qb320PWTmMhYLHG5I6YdViMR2DeBbVnZnPLot2RkZvH+9afRot7+MSGz2B0xrS+WRioAY6GkAtCMkqJFoCQCOTnw/ImwYSlc+Do0vKSkiLy/t1jiKgBj2mE1EoF9E/hq9gq6vz+DWlXSmHDvrm/72Fekxe5wLSVUAJqhlMTN+ClaBPIJLJkIb3aEspXgzl+gbIWYyFgscbkjph1WIxHYN4Hr357Gt/NW0a31kdzb8ZiYcVnsjpjXWFJDFYAlEdr330viZvwULQL5BD6/FWa8DY26wvkvxkzFYonLHTHvshqKwJ4JrN+8Pe/u36ycXL65vRX1D6wcMyqL3RHzGktqqAKwJEIqAM0IKVoESiKwYys8dTRsS4erhkHdViVF/PX3FktcBWDMu6yGIrBnAm9P/I0HP/+J4w+uwhe3nB4XJovdEdc699VYBaAZSkncjJ+iRQDmfApDroEqh8BtsyElJWYqFktc7oh5l9VQBPZMoPOA8cxals6/zmvAtS3rxoXJYnfEtU4VgK7h2q0jSdw7tuo5KgQGXZb/8OfT74B2/4pr1RZLXO6Ia6fVWAR2JbBw9SbaPzOW1JRSTLmvHftXKhcXIovdEdc6VQC6hksFoHco1XMkCWxaA08fnf/qt5u/hwPqx4XBYomrAIxrp9VYBHYl8OTX83lx9CLaHVOTN64+JW48Frsj7rXuLUBfAZuhlMTN+Ck66gQmD4Th98JBJ8ONo+OmYbHE5Y64d1sBIpBPICcnl9OfGM3yDVsZcMVJnNfwoLjRWOyOuNeqAtA1ZLt0JIl7w1W9RoXAK63z3//b8Uk47ca4V22xxOWOuHdbASKQT2DSonV0eW0yldNK8/397Ukrkxo3GovdEfdao1oAHgz0AzoCzoPFFgLXANMKgDgnoA8DNwD7AROA7sAvMRKWxGMEpWYisBuB1fPgpaaQUhruWAAVa8QNySOJe+0NZ51yR9y7rQARyCdw18ez+Hj6MrqcWoe+FzZMCItH7khoLskKCvNXwNWAHwDne6WBwBrgKGBRwX8c5vcAfYCrgMXAI8AJQAMgM4ZNkcRjgKQmIrBHAiMehAnPwdHnQJcPEoLkgcT98IYKwIR2W0EiAFu3Z9Pk0RFs3p7NRzc149S61RPC4oE7EppHMoPCXAD+G2gB7O3hQM7a/wCeBp4q2ISqwCrgamBwDBujAjAGSGoiArsRyMmG506AjOVw6TvQoHNCkDyQuB/eUAGY0G4rSATgs5nL6TV4JnWql2fsnW1ISUmsjPHAHdZtT2Lk7FjmXOBr4BCgNbAceAl4rWD6RxScBJ4EzCyypLEF/79XDMtUARgDJDURgd0I/DoG3ukMaVXzX/1WOr5HOBT254HE/fCGCkD9SIhAggSu+s9Uxi5Yw63tjqL3mfE9NaDokB64I8EVJS8szAVg4Ve4zwAfA8594v2BbsDbQPOCa/6c24dWFNmCj4Bc4LI9bIvzW6robyrnvTPL0tPTqVLFqQX1EQERiInA0G4w6wNofA10ei6mkD018kDiXnjDmbrckfAuK1AE8gmszsikad+R5OTC6DvPoO7+FRNG44E7Ep5LsgLDXABuL7jZwyn0Cj/PFxSCzRIsAB8CHiy+WSoAk5W+GtdKAts3w5NHwY7NcO03cOhpCS/DA4l74Q1nfXJHwrusQBHIJ/DauF957Mt5nHzofnzaw7nCK/GPB+5IfDJJigxzAbgEGAFcX4Stc4fvPwHnLr9EvgLWv+KTlKgaNkQEZn0IQ2+EanXh1h+gVOIa8kDiXnjD2Ty5I0QprKUkh0DH/t8xb0UGj55/PF2bHmY0CQ/cYTSfZAQnbt5kzDa+MQcBdYrdBPIs4Bw3OKeChTeBODeAODeCOB/ne9zVugkkPtBqLQJxEXjnfPh1NJxxH5zh3Iif+McDifvhjULXpOvbg8T3XpHRIjD3jwzOef47yqamMPX+duxXoawRAA/cYTSfZASHuQB0rvmbWPCVrXNd36kFN4A4T5t9vwC289vn3mKPgXEeKqTHwCQjGzVm+Alk/AHPOD9euXDrTKge3wvciwPyQOJ+eEMFYPgzXSt0mcBj/5vLa98tpsNxtXj5ysbGvXvgDuM5+d1BmAtAh+V5QN+C5/85z/lzbggpvAvY+fvCB0E7RaHzIOjxQA9gQYwbobuAYwSlZiKQR2BCfxjxLzi0GVw73BiKRxL32hsqAI13Xh1EiUBWdg7N/j2KNRu38eqVjTnruFrGy/fIHcbz8rODsBeAXrNUAeg1YfUfHgK5ufBSM1gzDzr1h8bO4zbNPhZLXO4w23pFR4iA89gX5/Ev1SqUYcp97SlbOsV49Ra7w3jthR2oADRDKYmb8VN0lAismAWvtILUcnDnAijvHLqbfSyWuNxhtvWKjhCBXoN/4LOZf/CPZofxf52Pd2XlFrvDlfU7nagANEMpiZvxU3SUCAy/Dya/CA3Oh0udR3GafyyWuNxhvv3qIQIENm3Lynv1W+aOHP57cwsa1TH/h6ODzWJ3uLbrKgDNUEriZvwUHRUC2VnwzDGweQ10+RCO7uDKyi2WuNzhSgaok7AT+Hja79w15EeOOKAiI3u3ppTBY6OKsrLYHa5tuQpAM5SSuBk/RUeFwIJvYNAlUGF/uGM+pJZxZeUWS1zucCUD1EnYCXR5dTKTfl3HXWcfzc1t6rm2XIvd4RoDFYBmKCVxM36KjgqBIdfCnE/gtG7QsZ9rq7ZY4nKHa1mgjsJKYPmGrbTsNwrn/rHx97ThkGoVXFuqxe5wjYEKQDOUkrgZP0VHgUBmOjxVH7Iy4cYxcNBJrq3aYonLHa5lgToKK4EXRy/kya9/pukR1Rl8o/MGV/c+FrvDNQgqAM1QSuJm/BQdBQIz3oHPb4EDjoEek41e/VYcl8USlzuikPtaY8IEcnNzaf/MWBat2cwTFzfk0ibOi73c+1jsDtcgqAA0QymJm/FTdBQIvHkOLJkA7R6E03u7umKLJS53uJoJ6ixsBGb9voHOL06gXOkUpv2zPZXT3LluuJCTxe5wbatVAJqhlMTN+Ck67AT+XAL9nbcrloLb50DVQ1xdscUSlztczQR1FjYCD33+E29N/I2/nXgQz3dx77IRFYA7M0UFoNlPjSRuxk/RYScw9kkY/SjUbQ1Xfe76alUAuo5UHYpA0glsz8qhad+RrN+8nbeuOYUzjq7p+pwsdodrLFQAmqFUAWjGT9FhJuDcuvdCY1i/CM4fCI2ucH21Fktc7nA9G9RhWAiMmLuKG96Zxv6VyjG5T1tKp5q/+q04G4vd4do2qwA0QymJm/FTdJgJLJsGr7eDMhXyX/1WrrLrq7VY4nKH69mgDsNCoMf70/ly9kqub1mXf57XwJNlWewO13ioADRDKYmb8VN0mAn87w74/nVoeBlc+KonK7VY4nKHJxmhTm0nkL5lB6c89i3bs3P48tbTaXCQ86Pi/sdid7gGQwWgGUpJ3IyfosNKIGs7PF0ftv4JVw6FI9t6slKLJS53eJIR6tR2Au9PWcL9Q+dwTK3KDL+tlWfLsdgdrjFRAWiGUhI346fosBKY9wV8+HeoXBtu/wlSUj1ZqcUSlzs8yQh1ajuBiwdOZNqSP7nvnGO4sdWRni3HYne4xkQFoBlKSdyMn6LDSmDw32H+F9D8VjjrEc9WabHE5Q7PskId20pgybrNtH5yDCmlYFKfdhxYJc2zpVjsDteYqAA0QymJm/FTdBgJbFmf/+q3nB3QfRIc6M1F3A46iyUud4Qx97UmIwLPjlhA/5G/0Kr+Abxz7alGfZUUbLE7SlpazH+vAjBmVHtsKImb8VN0GAk4N344N4DUOgG6jfd0hRZLXO7wNDPUuW0EnFe/Oad/S9dv4bnLGnH+SQd7ugSL3eEaFxWAZiglcTN+ig4jgdfbw7Lv4ezHodnNnq7QYonLHZ5mhjq3jcC039Zz8cuTqFg2le//2Z4KZUt7ugSL3eEaFxWAZiglcTN+ig4bgbULYUBjKJUKvedB5QM9XaHFEpc7PM0MdW4bgT6fzuaDqUu5uPEhPHXJiZ5P32J3uMZGBaAZSkncjJ+iw0Zg1KMw7kmodyZ0HeL56iyWuNzheXZoAFsIZO7Iznv238bMLAZdfxrN6+3v+dQtdodrbFQAmqGUxM34KTpMBHJy4PkTYcNSuOgNOOFiz1dnscTlDs+zQwPYQuDL2Svo8f4MDqqaxvh72pLi3Abs8cdid7hGxnvKrk01kB1J4oHcFk0qKQR+mwBvnQPlquS/+q1Mec+nYbHE5Q7Ps0MD2ELg+re/59t5q+lxxpHc3eEYX6ZtsTtc46MC0AylJG7GT9FhIvBZT/jhXTjpSug8wJeVWSxxucOXDNEgQSewbtM2Tnt8JFk5uXzbuxX1arr/zvA9MbDYHa5tqQpAM5SSuBk/RYeFwI6t+c/+25YBV/8PDm/py8oslrjc4UuGaJCgE3hrwmIeGjaXhodU5fOe/njDYWKxO1zbUhWAZiglcTN+ig4LgTmfwJBroeqh0GsWpKT4sjKLJS53+JIhGiToBP42YDw/LkvnoU4NuLpFXd+ma7E7XGOkAtAMpSRuxk/RYSHw/iXwyzfQ6i5o+0/fVmWxxOUO37JEAwWVwMLVG2n/zDhKp5Riyn3tqFGpnG9TtdgdrjFSAWiGUhI346foMBDYtBqePgZys6HndNi/nm+rsljicodvWaKBgkrgieHzeWnMItofW5PXrzrF12la7A7XOKkANEMpiZvxU3QYCEx6Cb7uAwc3gRtG+roiiyUud/iaKRosaARycnJp0W8UK9IzeenvJ3POCbV9naLF7nCNkwpAM5SSuBk/RYeBwMunw8of4Zyn4NQbfF2RxRKXO3zNFA0WNAITF67litenUCWtNFPvb09amVRfp2ixO1zjpALQDKUkbsZP0bYTWDUXBjaDlDL5z/6rUN3XFVkscbnD10zRYEEjcOfHsxgyfRlXnHYoj19wgu/Ts9gdrrFSAWiGUhI346do2wmM+BdM6A/HnAeXv+/7aiyWuNzhe7ZowKAQ2LI9i1Me/ZbN27MZ0q0ZTQ739x+ODgeL3eHaNqoANEMpiZvxU7TNBHKy4dnjYOMKuOw9OLaT76uxWOJyh+/ZogGDQuC/Pyzntg9ncmj1Coy96wxKlfK/FLHYHa5to//UXZt6IDqSxAOxDZpEUggsGgXvXgDlq8EdP0Np/x7hULheiyUudyQlaTVoEAhc+cYUvvtlLbe1P4rb2tdPypQsdodrvFQAmqGUxM34KdpmAp/eBD8OhibXwXnPJGUlFktc7khKxmjQZBNYlZFJs74jyckl7/TvsBoVkzIli93hGi8VgGYoJXEzfoq2lcC2TfDUUbBjC1z3LdTx9xleOgG0NXE076gTeHXcIh7/cj5NDqvGkO7Nk4ZDBSCoADRLPxWAZvwUbSuBmR/Af7tB9SPhlumQhGt4HHQWS1zusDX3NW8jAh2eG8f8lRvz7vx17gBO1sdid7iGTAWgGUpJ3Iyfom0l8E5n+HUMtLkfWt+dtFVYLHG5I2lZo4GTRWDuHxmc8/x3lE1N4fv721O1QplkTcXmfzy6xkwFoBlKSdyMn6JtJJC+PP/uX3Kh1yyodnjSVqECMGnoNbAIxE3g0S/m8vr4xZxzQi1e+nvjuOPdDLDYHa5hUAFohlIFoBk/RdtIYPyz8O1DcFgLuObLpK7AYonLHUnNHA3uN4Gs7Bya9h3F2k3beP0fTWjf4EC/p7DLeBa7wzVuKgDNUEriZvwUbRuB3Fx4qSmsmQ9/ewFO/kdSV2CxxOWOpGaOBvebwJifV3P1m99TvWJZptzXjjKpKX5PQQVgMeIqAM1SUBI346do2wj8MRNebQ2l0/Jf/ZZWNakrUAGYVPwaXARiJnDrBz/w+aw/uLr54Tz0N+cSkuR+LHaHa+BUAJqhVAFoxk/RthH46l6YMhCOuxAueTPps7dY4nJH0rNHE/CLwMbMHTR59Fu2ZeXwec8WNDxkP7+G3us4FrvDNXZhLgAfAh4sRupn4JiCP0sDngYuB5xXGHwN9ABWxUFXEo8DlppaTiB7BzxzLGxeA1d8DPXPSvqCPJC4H95wuMkdSc8eTcAvAh9N+527h/xIvZqVGHF7q6S8+q34Wj1wh184XRsn7AXgxUD7IrSygLUF/38gcC5wNZAODABygBZx0JXE44ClppYTWPA1DLoUKh4AvedDaumkL8gDiTsFoNfeUAGY9MzRBPwkcPmrk5j863ruOvtobm5Tz8+hdQK4D9phLwDPBxrtYf3OhUtrgCuAIQV/75wMzgOaAZNjzFAVgDGCUrMQEPj4avhpKDTtAR36BmJBHhWAXntDBWAgskeT8IPAsj+30LLf6LxnxY+/py0H71fej2FLHMMDd5Q4ZtAahL0AvKvgdC8TmAT0AZYCbYGRQDVgQ5FNWQI8Bzy7l41yviou+sb7ysCy9PR0qlRxakF9RCCkBLZugKfqQ/Y2uGkc1D4xEAv1QOLOCaDb3nBYyR2ByBhNwm8CA0b9wlPfLKD5kTUYdENTv4fXCWBETwA7ApUA57q/2gXXAx4MHA90Apwr2IsWcw6mqcBo4J69MNvT9UGoAAzMz7Qm4hWB6W/DsFvhgGOhx6Skvfqt+PI8KAC98IYzbbnDq9xUv4EjkJ2Ty9TF61mdkcm/h89nRXomT17ckEua1AnMXD1wR2DWFutEwnwCWJyBc9uRc8LXG9iaYAGof8XHmllqZzeB0X0hJXXna97+0xGWToT2D0P2dsjJhjbOgXpyPz5I3A1v6AQwuWmi0X0kMHzOCh4eNjev6Cv6efayRlxwknMGE4yPD+4IxkL3MYsoFYAOhu+Bb4ERCX4FXBylrgEMfIprggkRGPsEjH4s/12/DS+F/s5XvqWgeU+Y+ELS3wFcuCafJO62N5zpyx0JJaaCgkzAKf66vzfDeUnkbh+n2BjY9WQ6HO98IZf8j0/uSP5CVQDmEXC+Dnau/3O+inm74CaQLsAnBXyOBubrJpBA56sm5yeBwiKwbitYPA6q1YU/Fwem+HNQ+CBxL7yhAtDPPNZYvhBwvvZt2W/Ubid/hYM7BWCtqml5N4KkpiT/7MkHd/jC3WSQ5O+Cyez3HfsUMKzga9+DgIcL7ghuUFD8OY+BOafgMTAZwAsF3TWPY0r6V3wcsNTUQgJj+sGYx3dO3DkRbH13YBbigcT98IYKwMBkkCbiFoFJi9bR5bWSH6DxwQ1NaXZkDbeGTbgfD9yR8FySFRjmAnAw0ApwMs155Mt44H5gUQHswgdBO6eARR8EvTKOzVABGAcsNbWQwOLv4O3z8ieeWhYecH6UgvPxQOJ+eEMFYHBSSDNxicBnM5fTa/DMEnvrf3kjOjdK/rWAHrijxLUHrUGYC0A/WKsA9IOyxkgegQGnwtqfoVQK5OYE6utfB4rFEpc7kpfVGtkDAjoB9ACqx12qADQDLImb8VN0kAl8fT9Mcl6QA3SfBPO/2HljSEC+BlYBGOQE0tyiRKDwGsCV6Zl7vQlE1wAGKyNUAJrthwpAM36KDiqBwhtAnPkdfjpc/UX+TIveHRyAIlAFYFATSPOKIoG93QVcWGjoLuBgZYUKQLP9UAFoxk/RQSUw8hGY/BLs2AKXvgMNOu+cqVMERuc5gF7tkNzhFVn1m1QC/xw6m/emOA/c2PmpXTWNBzs1CMwjYJyZWfyPR9f2VwWgGUpJ3IyfooNKYNaHMPRGqHIw9PoRUksHcqYWS1zuCGRGaVImBHJzcznn+fHMW5FB16aHcsrh1alZOY1T61YPxKNfiq7NYneYbNEusSoAzVBK4mb8FB1UAq+1g+XToO0D0OrOoM7S5n/Fyx2BzSpNLFEC3/+2nktenkRamRSm9GlP1QplEu3K8zgVgHmP9tfHgIAkbgBPoQElsHw6vNY2/7Evt8+FSgcEdKJWf40jdwQ2qzSxRAn0HDSDL35cQZdT69D3woaJduNLnJt2DJwAACAASURBVApAFYCmiSaJmxJUfPAIDO0OswZBw8vhwleCN78iM7JY4nJHoDNLk4uXwKqMTFr8exRZObl8eevpNDjISfHgfix2h2tQdQJohlISN+On6KAR2LwWnmkA2dvg+lFwSOOgzXCX+Vgscbkj0JmlycVL4JkRC3h+5C+cenh1PurWLN5w39tb7A7XWKkANEMpiZvxU3TQCHz3NIz8PzjoZLhxdNBmt9t8LJa43BH47NIEYyWwPSuH5v8exdpN2xhwxUmc19B5+2qwPxa7wzWwKgDNUEriZvwUHSQC2VnQ/0TIWAbnvwyNnLckBvtjscTljmCnlmYXB4HC18DVrFyOCfe2pUxqShzRyWlqsTtcA6YC0AylJG7GT9FBIjBvGHzYFSrUyL/5o4zzuuxgfyyWuNwR7NTS7OIgcNHAiUxf8ie3t69Pr/ZHxRGZvKYWu8M1aCoAzVBK4mb8FB0kAm93gsXjoGVvaP9gkGa217lYLHG5w4oM0yRLIjBneTrnvTCeMqml8k7/nOf+2fCx2B2u4VUBaIZSEjfjp+igEFg9H146DUqlwG2zoeohQZnZPudhscTlDisyTJMsicDdQ2bx0bRldG50EP0vP6mk5oH5e4vd4RpDFYBmKCVxM36KDgqB/90B378Ox3aCy94LyqxKnIfFEpc7StxdNQg6gT83b6dp35Fsy8rhk+7NaXxYtaBP+a/5WewO1xirADRDKYmb8VN0EAhkpsPTx8KOzXDVMKjbKgizimkOFktc7ohph9UoyAReGbuIvl/N5/iDqzCsZ0tKlbKnpLDYHa6lhD275dqSXe1IEncVpzpLCoEpr8BXd8MBx0CPySCJ+7ENcocflDWGZwSyc3Jp/eRolv25lScubsilTep4NpYXHasA1JtATPNKEjclqPjkEsjJgRdPgXUL4dyn4ZTrkzufOEe3WOJyR5x7rebBIjBi7ipueGca+1Uow+Q+7UgrkxqsCZYwG4vd4RpnnQCaoZTEzfgpOtkEFo6E9y6EclWg9zwoVynZM4prfIslLnfEtdNqHDQCV74xhe9+WctNrY+gT8djgza9EudjsTtKXFusDVQAxkpqz+0kcTN+ik42gUGXw4Kv4LRu0LFfsmcT9/gWS1zuiHu3FRAUAgtXb6L9M2PzrhYZd1cb6lSvEJSpxTwPi90R8xpLaqgCsCRC+/57SdyMn6KTSeDP36B/IyAXek6D/e14gGtRZBZLXO5IZu5rbCMCD33+E29N/I32xx7I61c1MeorWcEWu8M1ZCoAzVBK4mb8FJ1MAt88ABOfhyPbwpVDkzmThMe2WOJyR8K7rsBkEti0LYumj4/E+e93rzuV0486IJnTSXhsi92R8JqLB6oANEMpiZvxU3SyCGzfAs8cC5kboMtgOLpjsmZiNK7FEpc7jHZewcki8O6k33jgs5844oCKfHt7a1JS7CwjLHaHa1tv5865tnzjjiRxY4TqICkEZrwLn/eE/Q6DW3+AFLvu4CtkZrHE5Y6kJL4GNSGQm5vLmc+Ow7kG8OG/HcdVzQ836S6psRa7wzVuKgDNUEriZvwUnQwCubnwyumwcjac+Qi0uDUZs3BlTIslLne4kgHqxE8CExeu5YrXp1CxbCqT72tH5bQyfg7v6lgWu8M1DioAzVBK4mb8FJ0MAksnw3/OhtJp+Y9+qVA9GbNwZUyLJS53uJIB6sRPAje+M41v5q7iH80O4/86H+/n0K6PZbE7XGOhAtAMpSRuxk/RySAw5FqY8wmcdCV0HpCMGbg2psUSlztcywJ15AeBZX9uodUTo8nJhW97t6Jezcp+DOvZGBa7wzUmKgDNUEriZvwU7TeBjSvh2eMgJwtuGge1T/R7Bq6OZ7HE5Q5XM0GdeU2g3/D5DByziBb1avD+9U29Hs7z/i12h2tsVACaoZTEzfgp2m8CY/4NY/pCnaZw3dd+j+76eBZLXO5wPRvUoVcEMndk06zvSP7csoNXrmzM2cfV8moo3/q12B2uMVIBaIZSEjfjp2g/CWRth+eOh02r4KI34ISL/Rzdk7Eslrjc4UlGqFMvCAyZvow7P57FwfuVZ+xdZ1A6NcWLYXzt02J3uMZJBaAZSkncjJ+i/STgXPfnXP9X6UC4bQ6ULuvn6J6MZbHE5Q5PMkKduk3AefTL3wZMYPbydO7ucDQ9zqjn9hBJ6c9id7jGSwWgGUpJ3Iyfov0k8J8OsHQStL4X2vTxc2TPxrJY4nKHZ1mhjt0k8MPSP7ngpYmULZ3CpHvbUqNSOTe7T1pfFrvDNWYqAM1QSuJm/BTtF4EVP+Y/+y+ldP7pX5Xafo3s6TgWS1zu8DQz1LlbBG7/cCZDf1jORScfwtOX2n3TWFEmFrvDra1FBaAZSkncjJ+i/SLw+S0w4x04/iK4+D9+jer5OBZLXO7wPDs0gCmBNRu30eLfo9iencOwni054ZCqpl0GJt5id7jGUAWgGUpJ3Iyfov0gsGU9PNMAsrbCtV/DofY/wqEQm8USlzv8yH2NYUTghZG/8PSIBZx06H4M7dHCqK+gBVvsDtdQqgA0QymJm/FTtB8EJjwPIx6AWifATd9BqfD82FsscbnDj9zXGAkT2JGdw+n9RrMyI5PnLmvE+ScdnHBfQQy02B2u4QzPbwLXkMTVkSQeFy419p1ATjY8fxJsWAJ/ewFO/ofvU/ByQIslLnd4mRjq25jAl7NX0OP9GexfqSwT7m1LudKpxn0GqQOL3eEaRhWAZiglcTN+ivaawM/D4YPLIG2//Pf+lq3g9Yi+9m+xxOUOXzNFg8VL4LJXJjFl8XpuaVuPO846Ot7wwLe32B2usVUBaIZSEjfjp2ivCbx7ISwaCc1vgbMe9Xo03/u3WOJyh+/ZogFjJTB/ZQYdnvuO1JRSjL+nDbWrlo811Jp2FrvDNcYqAM1QSuJm/BTtJYG1C2FAY3Bu9r/1B6he18vRktK3xRKXO5KSMRo0FgL3DZ3NoClLOeeEWrz0d8ch4ftY7A7XNkMFoBlKSdyMn6K9JPDVvTBlINTvAFd86OVISevbYonLHUnLGg28LwLpW3fQ9PGRbN2RzeAbm9L0iBqhBGaxO1zbDxWAZiglcTN+ivaKwLZN8MyxsC0Dun4C9dp7NVJS+7VY4nJHUjNHg++NwBvjF/PIF3M5+sDKDL/tdEqF6KkBRddssTtcS14VgGYoJXEzfor2isD3b8D/ekONenDz95Bi/8vb94TKYonLHV7lvvpNmEBOTi5tnx7Db+u28PgFJ3DFaYcm3FfQAy12h2too1IA3gv0BfoDtxXQSwOeBi4HnJcbfg30AFbFQVcSjwOWmvpEIDcXXmoGa+ZBh37QtJtPA/s/jA8Slzv831aNmCQCo39ezTVvfk/ltNJMua8dFcqWTtJMvB/WB3d4vwjDEaJQAJ4CfARkAKOLFIADgXOBq4F0YACQA8TzuHMVgIYJqHAPCCweB293gjIV4Y55kBae1zcVp+WxxOUOD9JTXQaXwDVvTmX0z2u4rmVdHjivQXAn6sLMPHaHCzP0vouwF4CVgBkFJ3v/BGYWFIDOb8Q1wBXAkALMxwDzgGbA5BjRqwCMEZSa+Ujgw64wbxg0uQ7Oe8bHgf0fykOJyx3+b6dGTCKB39Zups3TY3C+QBhz5xkcvn/FJM7G+6E9dIf3k3dphLAXgG8D64HbgTFFCsC2wEigGrChCMslwHPAs3vh63xV7Pyn8FMZWJaenk6VKk4tqI8IJJnAht+hf0PIzYEek6HmsUmekLfDeyhxucPbrVPvASPw6BdzeX38Ys44+gDeuubUgM3O/el46A73J+tRj2EuAJ1r++4HnK9xMosVgM7J35vFijkH8dSCr4nv2Qvvh4AHi/+dCkCPslPdxk9g5P/Bd0/D4afD1V/EH29ZhEcSlzssywNN14zAlu1ZeY9+ycjM4s2rT6HNMTXNOrQg2iN3WLDynVMMawFYB5gGnAn8WLDcoieAiRaAOgG0Kr0jNtkdmfBsA9iyDi59Fxr8LfQAPJC43BH6rNECixP4YOpS+nw6m0OrV8j7+jclJaylwc6Ve+AO6xIrrLt8PjAUyC6yI86brHMLbvQ4G/g2ga+Ai2+wrgG0LuVDPOFZg2HoTVDlYOj1I6SG9w6+wl30QOJyR4h/RLS03Qnk5ubSsf93zF+5kX+eeyzXn35EJDB54A7ruIW1AHSuzTus2G44X/nOB/oBvxfcBNIF+KSgnfO2a+fvdROIdWmsCecReK0tLJ8ObR+AVndGAooHEpc7IpE5WmQhgamL13PpK5NIK5PClD7tqVqhTCTgeOAO67iFtQDc00YU/QrY+XvnMTDnFDwGxnlEzAsFQc3j2EWdAMYBS009JLBsOrzeFlLLwu1zodIBHg4WnK59krjcEZwt10xcJnDz+zP43+wVdDm1Dn0vbOhy78Htzid3BBdA/lviI/MpLvHCB0E7p4BFHwS9Mg4iKgDjgKWmHhL49Cb4cTCc2AUueNnDgYLVtU8SlzuCte2ajUsEVqZn0qLfKLJzcvmq1+kcWzs6T7PwyR0u7ZQ33USpAPSCoApAL6iqz/gIbFqTf/NH9na4YRQc3Di+eItbWyxxucPivAvL1J/55meeH7WQU+tW56ObnKufovOx2B2ubZIKQDOUkrgZP0W7QWDcUzDqkfzCzykAI/SxWOJyR4TyNIhL3ZaVTYt/j2Ltpu28eMXJnNuwdhCn6dmcLHaHa0xUAJqhlMTN+CnalEB2Vv6DnzOWwwWvwInOI+yi87FY4nJHdNI0kCv9bOZyeg2eyYFVyjH+nraUSU0J5Dy9mpTF7nANiQpAM5SSuBk/RZsSmPs5fHQlVNgfbv8JyjiXtkbnY7HE5Y7opGkgV3rhSxOYsXQDvc+sz63tjgrkHL2clMXucA2LCkAzlJK4GT9FmxJ46zz47Ts4/Q5o9y/T3qyLt1jicod12RaeCc9elk6nAeMpk1qKCfe2pWblaP3D0dlJi93hWiKqADRDKYmb8VO0CYHV8+ClplAqBW6bDVUPMenNyliLJS53WJlx4Zj0XR/P4uPpy+jc6CD6X35SOBYV5yosdkecK917cxWAZiglcTN+ijYh8EVvmPYGHNsJLnvPpCdrYy2WuNxhbdbZPfE/N2/ntL4j2Z6Vwyfdm9P4sGp2LyjB2VvsjgRXvHuYCkAzlJK4GT9FJ0ogMx2ePhZ2bIarhkHdVon2ZHWcxRKXO6zOPHsnP3DMIvoNn8/xB1dhWM+WlCoVzTLAYne4lnzR3HnX8CGJu8dSPcVDYPJAGH4vHHAs9JgEknhV57KeeBAmua3ckeQNiOLwzgOfWz0xmuUbtvLkxQ25pEmdKGLIW7MKwGi9CcSLRJfEvaCqPvdNICcHBjSB9Yvg3GfglOsiS8xiicsdkc3a5C38m59WcuO706lWoQyT+rQjrUxq8iaT5JEtdodr5HQCaIZSEjfjp+hECCz8Ft67CMpVgd7zoFylRHoJRYzFEpc7QpGBdi2i6+tTGL9wLd1aH8m9HY+xa/Iuz9Zid7hGQgWgGUpJ3IyfohMhMOgyWDAcTusOHf+dSA+hibFY4nJHaLIw2Atxvvadung9s5dv4PEv5+P80h93dxvqVK8Q7Il7PDuL3eEaGRWAZiglcTN+io6FwOi+kJIKre+G9YvheeexDbnQczr89CnkZEObPrH0FLo2Fktc7ghdNgZvQcPnrODhYXNZkZ751+TKlU6h/+WN6HB8tF79Vnx3LHaHa4mmAtAMpSRuxk/RsRAY+wSMfgza3A/bMmDiC3BkOzi06c4/d4rDCH4slrjcEcF89XPJTvHX/b0Zzj8Vd/s4v/gHdj050kWgxe5wLY1UAJqhlMTN+Ck6VgKFRWDpNMjKhBMuhdkf5ReFES3+HHQWS1zuiDX31S5uAs7Xvi37jdrl5K9oJ84v/lpV0/LeAZyaEs0ywGJ3xJ0PewuI5s67hk+PgXEPpXoqkUDhtX+FDSNe/KkALDFj1CCiBCYtWkeX1yaXuPoPbmhKsyNrlNgujA1UAOoxMKZ5rX/FmxJUfGwEsrbnX/uXsSy/fWpZeGBNbLEhbmWxxOWOEOdlspf22czl9Bo8s8RpONcCdm50cIntwtjAYne4th06ATRDKYmb8VN0rASm/Qe+uH1n8Ze9PfJf/+oEMNbkUbuoEdAJYMk7rgJQJ4AlZ8m+W6gANCWo+JIJOKd/Tx6ZfwNIvTOh6xAoemOIrgF0GOpNICVnklpEhICuASx5o1UAqgAsOUtUAJoyUrwpgUGXw4KvoGwluGshlCmf36OKQN0EYppbig8tgS9/XEGPQTN2W1/h1366CziDqlWdfzda949H13JWXwGbodQJoBk/RZdEoOjpX4d+0LTbrhFOEajnANoocbmjpNzX3xsRKLwO0HlNeG6RZ8HUrprGg50aRPoRMA5YnQDqBNDoBwx0F7ApQMWXQGDam/DFbVCpFvSaufP0T+DyCFgscRWAymHPCDhfAZ/57Fh+XbOZO86qT5PDqrN6YyY1K6dxat3qkX30S1HgFrvDtbzRCaAZSkncjJ+i90XAOf174WRI/x06/BuadhevYgQslrjcoWz2jEDh6V/V8mUYf08bKqeV8WwsWzu22B2uIVcBaIZSEjfjp+h9Efjr9O9A6DVLp397YGWxxOUO/fR7QqDo6d+dZ9WnZ9ujPBnH9k4tdodr6FUAmqGUxM34KXpvBPJO/xpD+lKd/u0jSyyWuNyhn35PCOj0LzasFrsjtgXG0EoFYAyQ9tFEEjfjp+i9EZj+FgzrBZV0+revJLFY4nKHfvpdJ+Cc/p317FgWrdmMTv/2jddid7iWNyoAzVBK4mb8FL0nAkVP/87uC816iNNeCFgscblDWe06AZ3+xY7UYnfEvsgSWqoANEMpiZvxU/SeCOj0L+a8sFjickfMu6yGsRAoevp3x5n1uaWdrv0L6bcHsaRDTG1UAMaEaa+NJHEzfoouTkCnf3HlhArAuHCpcYgJFD39++6eNlTRnb/73G2L3eFaFqsANEOpAtCMn6KLE5j+Ngy7Vdf+xZgZFktc7ohxj9WsZALO6d/Zz41j4epN6PSvZF5OC4vdEdsCY2ilAjAGSPtoIomb8VN0UQLO6d+AxrBhKZz9ODS7WXxKIGCxxOUOZbdrBD6f9Qe3fvADznP/dPoXG1aL3RHbAmNopQIwBkgqAM0gKTpGAoWnfxVr5j/3r2yFGAOj28xiiasAjG7aurryoqd/vc+sz6269i8mvha7I6b1xdJIBWAslPbeRhI346foQgLZO/Lf+qHTv7hywmKJyx1x7bQa741A4elflbTSjL+3ra79izFVLHZHjCssuZkKwJIZ7auFJG7GT9GFBGa8A5/fAjr9iysnLJa43BHXTqvxngg4p38dnhvHL6s3odO/+HLEYnfEt9B9tFYBaIZSEjfjp2iHQNHTv7Meg+Y9xSVGAhZLXO6IcY/VbO8Ehs36g1s++AGd/sWfJRa7I/7F7iVCBaAZSkncjJ+iHQJ/nf4dAL1+1LV/cWSFxRKXO+LYZzXdnUDR07/b29enV3s99y+ePLHYHfEsc59tVQCaoZTEzfgpWqd/RjlgscTlDqOdV3DR07/v7mmbdwewPrETsNgdsS+yhJYqAM1QSuJm/BQ94134vCdU1OlfIslgscTljkQ2XDF5BHIKnvvnXPun07/EksJidyS24D1EqQA0QymJm/GLdnTe6Z/z3L8lcNaj0PyWaPNIYPUWS1zuSGC/FZJP4Isf/6DnoPxr/3T6l1hWWOyOxBasAtA1boUdSeKuI41Qh7uc/jnP/asYocW7s1SLJS53uJMCketFp3/ubLnF7nAHAKATQDOUkrgZv+hG6/TPlb23WOJyhysZEL1OCk//KjvP/dO1fwkngMXuSHjNxQNVAJqhlMTN+EU3Wqd/ruy9xRKXO1zJgGh14pz+deg/jgWrNnFb+6O4rX39aAFwcbUWu8M1CioAzVBK4mb8ohntnP4NaAJ//gZnPgItbo0mBxdWbbHE5Q4X9j9qXfzvxxXcPGgGOv0z33mL3WG++IIewlwAdgec/xxesNafgP8Dvir4/2nA08DlQDnga6AHsCoOupJ4HLDUtIDAD+/BZzdDhf3hNue5f7r2L9Hc8EDifnjDWa7ckeimRzROp3/ubrwH7nB3gj70FuYCsJPzjgXgl4JrHa8C7gJOApxicCBwLnA1kA4McO6uB1rEwV0SjwOWmha89UOnf66lggcS98MbKgBdy4DodKTTP3f32gN3uDtBH3oLcwG4J3zrC4rAIcAa4ArA+d/O5xhgHtAMmBwjexWAMYJSM53+eZEDPkncbW+oAPQiGULcZ9HTv17tjuL2M3Xtn+l2++QO02l6Gh+VAjAVuAR4u+AEsBYwEqgGbChCeAnwHPBsjNRVAMYISs2c07+sgmv/FsOZ/wctegmLIQGPJe6VN1QAGu571MK/nL2CHu/r2j83991jd7g5Vc/6CnsBeAIwCXCu99tUcOL3ZcF/v1lw7V9RuFOB0cA9eyHuXCvo/KfwUxlYlp6eTpUqTi2ojwjsg8AP78NnPaBCDbhttq79cyFZPJK4295wVip3uLDfUezCOf3r2P87fl61EZ3+uZcBHrnDvQn60FPYC8CywKFAVeBi4HqgNdAISKQAfAh4sPi+qAD0IVNtH0Knf57soEcSd9sbztrlDk8yIPyd/nX6V67guX8V9M5fN3bdI3e4MTXf+gh7AVgc5LfAIuDDBL8C1r/ifUvNkA2k0z9PNtQniZt6QyeAnux++Dstevp3a7uj6K1r/1zbdJ/c4dp8vegoagXgKGAp4Fx85dwE0gX4pADs0cB83QTiRZpFvM+ip3/tH4aWt0UciHvL90nibnvDAaDrh91Lg9D2pNM/77bWJ3d4twAXeg5zAdi34Jl/TsHnXKvn3PHrXNt3NjCi4DEw5xQ8BiYDeKGAZ/M4uEriccCKbNOZg+C/3fOv/ev1I5SrFFkUbi/cA4n74Q0VgG4nQgj7c07/znn+O+av3IhO/9zfYA/c4f4kPe4xzAXgG0A7oHbBc/5+BPoVFH8O1sIHQTungEUfBL0yDuYqAOOAFcmmOv3zdNs9kLgf3lAB6GlWhKPzr2avoLtz56+u/fNkQz1whyfz9LLTMBeAXnIr7FsFoB+UbR5Dp3+e7p7FEpc7PM0Muzvf5fSvbT16n+VcoaSPmwQsdodrGFQAmqGUxM34hTt6l9O/h6Dl7eFebxJWZ7HE5Y4k5IstQxY9/fvunjbsV8G5MV0fNwlY7A7XMKgANEMpiZvxC3f0zA/gv92gfPX85/7p2j/X99tiicsdrmdDODrU6Z8/+2ixO1wDpALQDKUkbsYvvNHO6d+Lp8D6X6G9Tv+82miLJS53eJUUlvc7fM4Kur2Xf+2fTv+820yL3eEaFBWAZiglcTN+4Y3W6Z8ve2uxxOUOXzLErkGKnv7d0rYed+jaP8820GJ3uMZEBaAZSkncjF84o4ue/rV7EE7vHc51BmBVFktc7ghA/gRtCoWnf5Xy7vzVtX9e7o/F7nANiwpAM5SSuBm/cEbPGgxDbyq49s957p/zGEp9vCBgscTlDi8SwuI+ndO/c18Yz7wVGej0z/uNtNgdrsFRAWiGUhI34xe+6LzTv1Nh/SLQ6Z/n+2uxxOUOz7PDrgGGz1lJt/emo9M/f/bNYne4BkgFoBlKSdyMX/iidfrn655aLHG5w9dMCfZgRU//erapx51n67l/Xu+Yxe5wDY0KQDOUkrgZv3BF73L69y84/Y5wrS+Aq7FY4nJHAPMpWVMqevr33d1tqFZRz/3zei8sdodraFQAmqGUxM34hSv6r9O/agXP/dO1f15vsMUSlzu8Tg5L+tfpX3I2ymJ3uAZMBaAZSkncjF94op3Tv5dOg3ULoZ1O//zaWIslLnf4lSQBH+frn1Zy07v51/7p9M+/zbLYHa5BUgFohlISN+MXnuhZH8LQG6G8Tv/83FSLJS53+JkoAR0rNzeXc58fz9wVGejaP383yWJ3uAZKBaAZSkncjF84ooue/rV9AFrdGY51WbAKiyUud1iQX15PsfD0r2LZVMbf01bX/nkNvEj/FrvDNUoqAM1QSuJm/MIRXfT0r9ePkOakhT5+ELBY4nKHHwkS4DGKnv7d3OZI7jr7mADPNnxTs9gdrm2GCkAzlJK4GT/7o3Oy85/751z7p9M/3/fTYonLHb5nS7AG/Oanldz47nR0+pecfbHYHa4BUwFohlISN+Nnf/SPH8GnN+Rf+6fTP9/302KJyx2+Z0vyB8zOyWXq4vWszsjkmRELWLJ+Czr9S86+WOwO14CpADRDKYmb8bMrenRfSEmF1nfnz7vo6V/d1nBoM2jTx641WT5biyUud1iee/FO33nP78PD5rIiPfOvUOcX8JMXN+TiJnXi7U7tDQlY7A7Dle8MVwFohlISN+NnV/TYJ2D0Y9Dm/vwisPD0r3QaZGXu/HO7VmX1bC2WuNxhdebFN3mn+Ov+3gxy9xDm/BIe2PVkOhxfO75O1dqIgMXuMFp30WAVgGYoJXEzfvZFFxaBZ/SB2UNg3S/5aygsCu1bkdUztljicofVmRf75J2vfVv2G7XLyV/xX8K1qqbl3QWcmqJfybGTNWtpsTvMFl4kWtlmhlISN+NnZ3RhEVg4e+eVb87Dn/XxnYDFEpc7fM+W5Aw4adE6urw2ucTBP7ihKc2OrFFiOzVwh4DF7nAHAKAC0AylJG7Gz87o7Zvh8YPy514qFR5cb+c6QjBriyUud4Qg/2JZwmczl9Nr8MwSm/a/vBGdGx1cYjs1cIeAxe5wB4AKQGOOkrgxQgs7+E8HWDpp58T19W/SNtFiicsdScsafwfWCaC/vGMdzWJ3xLrEEtvpBLBERPtsIImb8bMv+su7YOqr+fO+fBCs+mnXG0PsW5HVM7ZY4nKH1ZkX++R1DWDsrPxsabE7XMOkAtAMpSRu7nGE7gAAIABJREFUxs+u6DH9YMzj+XOu3wG6DIZSpaD43cF2rcrq2VoscbnD6syLb/IDxyyi3/D5uwUV/gLWXcDx8XSjtcXucGP5eX2oADRDKYmb8bMrevDfYf4XULo83DwZqh2+c/5OEeg8F1DPAfR1Ty2WuNzha6YkbzDnBPBvA8bz0x8ZlC+TwtYdOX9NpnbVNB7s1ECPgEnC9ljsDtdoqQA0QymJm/GzJ3rrBhjQBDav0SvfArRrFktc7ghQHnk5lbcn/saDn/9ElbTSfHN7axav3czqjZnUrJzGqXWr69EvXsLfR98Wu8M1YioAzVBK4mb87In+353w/WtQ4yjoPgFKl7Nn7iGeqcUSlztCnJeFS3MKvXZPjWXjtiweOf94rmx6WARWbccSLXaHa4BVAJqhlMTN+NkR/ccP8GobcJ7j/4/P4Igz7Jh3BGZpscTljgjk522Df+C/M/+g4SFVGdqjhU77ArTnFrvDNYoqAM1QSuJm/IIf7VzX93p7+GMGHH8xXPxG8OccoRlaLHG5I+R5OnHRWq54bUrefWKf3dyChofsF/IV27U8i93hGmgVgGYoJXEzfsGP/v4N+F9vKFcFen4PlWsFf84RmqHFEpc7Qpyn27Ny6Nh/HIvWbM772tf5+lefYBGw2B2ugVQBaIZSEjfjF+zoTavzb/zITIeOT8BpNwV7vhGcncUSlztCnK8vjl7Ik1//zP6VyjLyjjOoWr5MiFdr59IsdodrwFUAmqGUxM34BTt6aDeY9QHUagg3jIbU0sGebwRnZ7HE5Y6Q5uvv67dw5rNjydyRw7OXncgFJx0S0pXavSyL3eEaeBWAZiglcTN+wY3+bTy8dW7+ozKv/xYOaRLcuUZ4ZhZLXO4Iad5e//Y0vp23itPqVmfwjU0p5VwEqE/gCFjsDtdYKjPNUEriZvyCGZ29A15uCWvmQ+OroVP/YM5Ts8JiicsdIczfEXNXccM70yidUoqvep3OUQdWDuEqw7Eki93h2gaoADRDKYmb8Qtm9IT+MOJfUKEG9JwGFaoHc56alQpA5UBgCGzdnk37Z8ayfMNWurU+kns7HhOYuWkiuxNQAahXwZn+XKgANCUYtPj0ZTDgFNixBTq/BCf9PWgz1HyKELBY4nJHyDL5ya/n8+LoRRxUNY1v72hNhbK6ZjjIW2yxO1zDqhNAM5SSuBm/4EV/2BXmDYNDm8HVX0JKSvDmqBn9RcBiicsdIcrjhas35T32ZUd2Lq9c2Zizj9PjooK+vRa7wzW0KgDNUEriZvyCFb3gGxh0CZRKhW7fwYHHBWt+ms1uBCyWuNwRknzOzc3Ne+DzpF/X0e6Ymrx+VRPd+GHB3lrsDtfoqgA0QymJm/ELTvSOrfDiabBhCTTrCWc/Fpy5aSZ7JWCxxOWOkOT1ZzOX02vwTMqVTuHb3q2pU71CSFYW7mVY7A7XNkYFoBlKSdyMX3CiRz0G456AygdBz6lQTnfvBWdz9j4TiyUud9iQYCXMMSNzB22fGsvaTdu486z69Gx7VAhWFY0lWOwO1zZIBaAZSkncjF8wotcuhIHNIHs7XPoONOgcjHlpFiUSsFjickeJuxv8Bg99/hNvTfyNI/avyFe3nU650qnBn7RmmEfAYne4toMqAM1QSuJm/JIfnZsL754Pv46Beu3h70PIe3u7PlYQsFjicocVGbb3Sc5Zns7fBownJxfeu+40Wh61v+Uritb0LXaHaxul33RmKCVxM37Jj57zKQy5BlLLQY9JUOPI5M9JM4iZgMUSlzti3uXgNczJyeWCgROZ9fsGOp14EC90OSl4k9SM9knAYne4trNhLgD7ABcCztM4twITgXuAn4vQSwOeBi4HygFfAz2AVTESlsRjBBXIZpkZ+c/827QSzugDZ9wbyGlqUnsn4IHE/fCGsyC5w+LEHjRlKfcNnU2lcqUZdUdralZxfpXoYxMBD9xh0/Lz5hrmAnA4MBj4HnCeyPk4cDzQANhcsFMDAeeFr1cD6cAAIAdoEeNOSuIxggpks+F9YPJLUK0u9JgMZSTxQO7TPiblgcT98IYKQNsSrch8nRs+2j09lvStO3iwUwOuaVHX4tVEd+oeuMM6mGEuAItvxgHAaqA1MA6oCqwBrgCGFDR2TgvnAc2AyTHspgrAGCAFssmKH+HV1pCbA10/yb/+Tx/rCPggcS+8oQLQukzbOeE7P57FkOnLaFC7Cp/3bEHpVD0s3sbt9MEdgccSpQKwHvALcAIwB2gLjASqARuK7NQS4Dng2T3snvM1sfOfwo/zrJBl6enpVKni1IL6WEEgJwf+czYsmwoNzodL37Zi2prk7gR8kLgb3nAmLneEIIGnLl7Ppa9MylvJpz2ac/Khzq8PfWwk4IM7Ao8lKgWg80+0z4H9gJYFu+Kc/L1ZrKBz/moqMLrgesHiG/gQ8GDxP1QBGPg833WCM96Bz2+BspWg5/dQ5SDLFqDpFhLwWOJuecOZrtxhedruyM7hvOfH8/OqjXQ5tQ59L2xo+YqiPX2P3WEF3KgUgM61fh0Lir9lBgWg/hVvRVrvY5Kb18GAxrD1TzjrMWje0/YVRXr+HkvcLW/oBDAEWfrauF957Mt5VK9YlpG9W1OtYtkQrCq6S/DYHVaAjUIB6NzY4TzZtxWwuMiuJPIVcPFN1TWAVqR5kUk6J3/OCWDN4+CmsZBaxrYVaL5FCHgocS+94axA7rAok1ekb8278WPL9myeuLghlzapY9HsNdU9EfDQHdYAD3MB6KztBeAC4IyC6/+KbkzhTSBdgE8K/uJoYL5uArEmf+Ob6NIp8J+z8mOuGQ6HOff66GMzAQ8k7oc3VABalnTd35vOV3NW0uSwanx0UzNSUsL8q9OyzUlwuh64I8GZJC8szFn8UsEdvs7pX9Fn/zmPe3GeC+h8nK94zil4DExGQcHo/HnzGLdE/4qPEVTSm2Vn5d/1u2oONOoK57+Y9ClpAuYEPJC4H95QAWi+9b71MPrn1Vzz5vekppTii1tacmxt3fDnG3wPB/LAHR7O1puuw1wA5u4F2TXAWwV/V/ggaOcUsOiDoFfGiFsFYIygkt5s0kvwdR8oXw16ToeKNZI+JU3AnIAHEvfDGyoAzbfelx4yd2Rz1rPjWLp+C9e3rMs/z3MeI6tPGAh44A7rsIS5APRjM1QA+kHZdIyMP/Lf+LF9E3TqD42d537rEwYCFktc7rAgAZ8dsYD+I3/hwCrlGHnHGXlv/tAnHAQsdodrG6AC0AylJG7Gz5/oj6+Bnz6Fg5vAdSMgRQ9u9Qe896NYLHG5w/v0MBph8drNnP3cOLZn5fDiFSdzbsPaRv0pOFgELHaHayBVAJqhlMTN+HkfvWgUvHsBlEqBG8dA7RO9H1Mj+EbAYonLHb5lSfwD5ebmctWb3zNuwRpOP2p/3rn2VEqV0q/L+EkGN8Jid7gGVRlthlISN+PnbXTWNnipGaxfBKd1g479vB1PvftOwGKJyx2+Z0vsA345ewU93p9B2dIpfHNbKw7fv2LswWppBQGL3eEaXxWAZiglcTN+3kaPfQJGPwaVauW/8SNNd+95C9z/3i2WuNzhf7rENOKmbVm0f3osKzMy6dXuKG4/s35McWpkFwGL3eEaaBWAZiglcTN+3kWv/xVebArZ2+CiN+CEi70bSz0njYDFEpc7kpY1+x740S/m8vr4xRxWowJf39aKtDKpAZ2ppmVCwGJ3mCx7l1gVgGYoJXEzft5E5+bCoEvhl2+gbmv4x2eg63e8YZ3kXi2WuNyR5NzZ0/DzVmRw3gvjyc7J5c1rTqHN0TUDOEtNyQ0CFrvDjeXn9aEC0AylJG7Gz5voecPgw66QUgZ6TIL9j/JmHPWadAIWS1zuSHr27DqBnJxcLnllEtOX/EnH42sxsGvjgM1Q03GTgMXucA2DCkAzlJK4GT/3o7dtghdPg4xlcPqd0O4B98dQj4EhYLHE5Y7AZFH+RD6a9jt3D/mRCmVT+bZ3aw7ar3zAZqjpuEnAYne4hkEFoBlKSdyMn/vRI/4FE/rDfodCjylQtoL7Y6jHwBCwWOJyR2CyCP7cvJ22T4/hzy07uP+cY7mh1REBmp2m4gUBi93hGg4VgGYoJXEzfu5Gr54HL7eEnCzo8iEc3cHd/tVb4AhYLHG5I8nZ5FznN3XxelZvzOSzmX8wav5qjj6wMl/c2pIyqXpYfJK3x/PhLXaHa2xUAJqhlMTN+CUePbovpKRC67vz+3Bu/HjrXFgyAfavD8ddCG36JN6/Iq0gYLHE5Y4kZtjwOSt4eNhcVqRn7jKLO8+qT8+2umY4iVvj29AWu8M1RioAzVBK4mb8Eo8ufMZfm/vzi8CZH8B/u+Xf+JGzAwr/PPERFGkBAYslLnckKb+c4q/7ezPI3cP4zi/EgV1PpsPxeu1bkrbHt2EtdodrjFQAmqGUxM34mUUXFoEte8OMd2DL2vz+VPyZcbUo2mKJyx1JyDPna9+W/UbtdvJXOBXnF2KtqmmMv6ctqSn69ZiELfJtSIvd4RojZbgZSkncjJ95dGERWNhT63v11a85VWt6sFjickcSsmzSonV0eW1yiSN/cENTmh1Zo8R2amAvAYvd4Rp0FYBmKCVxM37m0XM/g4/+kd9PSmn41zrzPtWDNQQslrjckYQs+2zmcnoNnlniyP0vb0TnRgeX2E4N7CVgsTtcg64C0AylJG7Gzyx6zQJ4uQVkb4dSKZCbo69/zYhaF22xxOWOJGSbTgCTAD2gQ1rsDteIqgA0QymJm/FLPHrbRuh/ImxZB/sdBrfMgPHPwOjHVAQmTtW6SIslLnckIducawAbPzKCDVt37HF0XQOYhE1J0pAWu8M1YioAzVBK4mb8Eot2HvnivO1j7c9QtjLcOgMqFbyzs/jdwYmNoChLCFgscbkjCTn288qNdHphPNuzc3YbvfCXoe4CTsLGJGFIi93hGi0VgGYoJXEzfolFO2/6cN744Xzte+03UOeUXftxisCcbN0Mkhhdq6Islrjc4XOmZWTuoPOACSxeu5ljalVmw5YdrMzY+RzA2lXTeLBTAz0Cxud9SdZwFrvDNWQqAM1QSuJm/OKP/nUsvHt+/vV+5z4Np1wffx+KCA0BiyUud/iYhTk5udz03nRGzF3FwfuVZ9gtLalavsxfbwKpWTmNU+tW16NffNyTZA9lsTtcQ6cC0AylJG7GL77o9GXwSuv85/2deAWc/xKUUgrHBzFcrS2WuNzhYyq+OHohT379M2VLpzCkWzMaHrKfj6NrqCASsNgdruHUb08zlJK4Gb/Yo7O2wZsdYfl0qHUCXDcCypSPPV4tQ0nAYonLHT5l5LgFa7jqzal5b4vsd9EJXHbKoT6NrGGCTMBid7iGVQWgGUpJ3Ixf7NHDboPpb0LafnDTWKh2eOyxahlaAhZLXO7wISt/X7+FTgPG513vd/kpdfj3RQ19GFVD2EDAYne4hlcFoBlKSdyMX2zRP7wHn90MlIK/D4Gj2scWp1ahJ2CxxOUOj7Mzc0c2F788kTnLM2h4SFU+uqkZaWVSPR5V3dtCwGJ3uIZYBaAZSkncjF/J0X/MhDfOguxter5fybQi18JiicsdHmZrbm4udw/5kY+nL6N6xbJ5N304N3/oIwKFBCx2h2ubqALQDKUkbsZv39Fb1uff9JG+FOp3gMs/gJQUL0dU35YRsFjicoeHuTZoylLuGzqblFLw7nWn0aLe/h6Opq5tJGCxO1zDrQLQDKUkbsZv79HOc/zevxgWjYJqdeHGMVBed+55hdvWfi2WuNzhUdLN/H0Dl748Ke9hz/d0OIbuZxzp0Ujq1mYCFrvDNewqAM1QSuJm/PYePepRGPcklC4P138LtY73aiT1azEBiyUud3iQd2s3bct708eK9EzOPu5AXu7amFJ6VJQHpO3v0mJ3uAZfBaAZSkncjN+eo+d/CYO75P/dha9Dw0u8GEV9hoCAxRKXO1zOv6zsHK58YyqTfl3HEQdU5LObW1A5rYzLo6i7sBCw2B2ubYEKQDOUkrgZv92j1y2CV8+AbRlwWjfo2M/tEdRfiAhYLHG5w+U87PvVPF4Z+ysVyqbmFX9HHVjZ5RHUXZgIWOwO17ZBBaAZSkncjN+u0ds3w+vtYfVcqNMUrhoGpcu6OYL6ChkBiyUud7iYi1/NXkH392fk9fjiFSdzbsPaLvaursJIwGJ3uLYdKgDNUEriZvx2RjuP6f/kepgzBCodCDeNg8q13Opd/YSUgMUSlztcysmFqzfSecAENm/P5sZWR3DfOce61LO6CTMBi93h2raoADRDKYmb8dsZPXkgDL8XUkrDVV/AYc3c6ln9hJiAxRKXO1zIy03bsug8YDyL1mym6RHVee+60yidqkdFuYA29F1Y7A7X9kYFoBlKSdyMX370konwdifIyYIO/aBpNzd6VR8RIGCxxOUOw/x0Hvbc4/0ZfDVnJbWqpPHFrS3Zv1I5w14VHhUCFrvDtS1SAWiGUhI34wcZK+CVVrB5NZxwCVz4GuixDaZUIxNvscTlDsMsfWXsIvp+NZ8yqaX48KZmnHxoNcMeFR4lAha7w7VtUgFohlISN+GXtR3ePg9+nwI1j4PrR0DZiiY9KjZiBCyWuNxhkKsTF66l6xtTyMmFR88/nq5NDzPoTaFRJGCxO1zbLhWAZiglcRN+X94NU1+BclXhxtFQQ0/sN8EZxViLJS53JJiwf2zYynkvjGf95u1c3PgQnry4oR72nCDLKIdZ7A7Xtk0FoBlKSTxRfrM+hKE35kd3GQxHd0y0J8VFmIDFEpc7EsjbbVnZXPrKZGb9voHjDqrCJ92bk1YmNYGeFBJ1Aha7w7WtUwFohlIST4Tfytnw+pmQtRVa3QVt/5lIL4oRASyWuNyRQP7eN3Q2g6YspWr5MnxxS0vqVK+QQC8KEQFsdodr26cC0AylJB4vv61/5r/p48/f4Mh28PePIUX/go8Xo9rnE1ABGJ1M+Gja79w95Me8e8TeuuZUWtc/IDqL10pdJ2CxO1xjoQLQDKUKwHj45eTkv+N3wXDY71C4cSxUqB5PD2orArsQsFjickccuTx7WToXvTyR7Vk53HFmfW5pd1Qc0WoqArsTsNgdrm2nCkAzlJJ4PPzG9IMxj0PpNLjuG6h9YjzRaisCuxGwWOJyR4z5/Ofm7Xk3fSzfsJX2x9bk1SubkJKiX10x4lOzvRCw2B2u7WmYf4paAXcBjQHnxZAXAP8tQs5Z+8PADcB+wASgO/BLHHQl8Vhh/TIC3r8EyIXzB0KjK2KNVDsR2CsBjyQudwQk57Jzcrn6zal898taDq9Rgc96tsy7/k8fETAl4JE7TKfla3yYC0DnttIWwHTg0z0UgPcAfYCrgMXAI8AJQAMgM8ZdUAEYC6j1i+HV1pCZDk2uhfOejSVKbUSgRAIeSVzuKJG8Pw2e+vpnBoxeSPkyqQy9uTnH1HKUq48ImBPwyB3mE/OxhzAXgEUx5hYrAJ11/wE8DTxV0LAqsAq4Ghgc4x6oACwJ1PYt8J+zwLnz9+AmcM2XUFqvayoJm/4+NgI+SFzuiG0rXG/1zU8rufFd59/v0P/yRnRudLDrY6jD6BLwwR2BhxvVAvAIYBFwEjCzyC6NLfj/vfayc07lUrR6qQwsS09Pp0oV/ct0N2a5ufDf7jDrA6h4QP5NH1Ul8cBbwaIJ+iDx4gWg3OFDfvy6ZhOdB0xg47YsrmlxOA92Os6HUTVElAj44I7A44xqAdi84Jq/g4AVRXbpo/yL1LhsLzv3EPBg8b9TAbgXWlNfgy/vhFKp8I/PoO7pgf+B0ATtIuCDxIsXgHKHxymyeVsWF7w0gQWrNnHK4dUYdENTyqSmeDyquo8aAR/cEXikKgDjKwB1AhhrSv8+Fd48B3J2wJmPQItbY41UOxGImYAPEnerAJQ79rKrzo0eUxevZ/XGTGpWLsd7k5fwv9krOaByOf53S0tqVkmLOR/UUARiJeCDO2KdStLaRbUATPRrnOIbpWsAHSKj++Y/zLn13fl8Nq2GV1rBxhVwwDHQoDO0uS9pSa6Bw0vAB4m79RWw3LGHNBw+ZwUPD5vLivRd77tznvLy0U3NaHK4nhMa3p/e5K7MB3ckd4ExjB7VArDwJhDnBhDnRhDn4xRzq3UTSAxZU7zJ2Cdg9GPQ5n5o2Rve6QxLxkOFGrBlXf6fFxaHCXSvEBHYGwEfJL63m0DkDsO0dIq/7u/NyLvmZk+fl7ueTIfjnSd46SMC7hPwwR3uT9rlHsNcAFYC6hXw+gHo7ZxVAeuBpYDzGJh7iz0GpqEeA5NghhUWgXVOg9+nQGpZyN6u4i9BnAqLjYBHEpc7YsOfcCvna9+W/UbtdvJX2KHzi6lW1TTG39OWVD30OWHOCtw7AY/cYRXyMBeAZxQUfMU35O2CU77CB0HfWPAg6PFAD2BBHDuor4ALYTl3/Donf4udG6kLPjr5iyOV1DQRAh5JXO5IZDPiiJm0aB1dXptcYsQHNzSl2ZE1SmynBiIQLwGP3BHvNJLaPswFoB9gVQA6lJ13/H51N3z/2k7mzgngA2v82AONETICu94UkMapdavv9RTIYolH2h2fzVxOr8FFn8C15yTW8/9C9sMdoOVY7A7XKKoANEMZaYnnocvaBkO7wU/Oy1YKPvr61yyrIhy9p5sCaldN48FODfZ4PZjFEo+0O3QCGOEf8oAs3WJ3uEZQBaAZykhLnG0b4cOu8OsYKJUCuTk7r/kremOIbgAxy7KIRO/tpoBCSQ3cw00BFks80u4YNW8V1749ba+ZrWsAI/JDn8RlWuwO16ipADRDGV2Jb14L718Mf/wAKWXyn/dX/Jo/FYFm2RWh6ERvCrBY4pF1x39/WM6dH88iKyf//l/nl1DRO4H3VfBH6EdCS/WYgMXucI2MCkAzlNGU+J9L4N0LYP2i/Ee9HHMeVD1kz496cYrAnGxo08eMtKJDSyAnJ5fPZy3ntg9nlbjG4jcFWCzxSLrjjfGLeeSLuXn7/LcTD+LMBgfy+JfzdrkbeF9f+ZeYIGogAjESsNgdMa6w5GYqAEtmtK8W0ZP4yjnw3kWwaSVUPRSuHAr7Fz5txwymooNHIJ4bMmKZ/aZtWfy8MoO5KzYyb0UG81dk8PPKjWzenh1LOMVvCrBY4pFyR25uLk98/TMDxzivYCfv/b4PnNuAlJRSuJ1jMSWSGkWegMXucG3vVACaoYyUxFkyEQZdDtvSoWYD6PopVNGDWs1SKLjR8d6QUXQlzqne739uYV5hobcyI+9/L12/ZY8LLp1S6q+vBPdFRCeAwc2Xvc3s/9s7EygrqjOP/3tvmu5mh2YTDass7qigBjUaxpgMagDjhkucGIMiMXFcEqOJJ6JO1AmomRnHQSCDDu4yMSIqOEdAwQVEZVd2aaAReqN35nxV9ZqGfq9fvbpVr+pW/escDyp3/X23/v31rft9t6GxCfe8shrzPtpuFLlj7GD84tz+yMjgjx/9rBmeEdMBNI9f8HFOIDoO4No3gBevBxpqgGNGAVc8B7Tr5JwcawaaQCoBGeaunrmjZ+zq7aowdvYS7er1KM7D8T2LMaSkGMf3LMLQnsU4pnMBzv3TYuw6UBP3ZohEQQEai3gktKOmvhG3zP0Ub68pheRznnbZCFw+8phAr30OLhoENNYO1wxEB1ANZSREHJ/MAeZPMaN8B10ETJgJ5LRTI8fagSWQLCBDBl6Yl43R/TtjXWkltpTF39XLzcrEwB6FlrNnOnpDehajc/vcuHOPOZ3yl3aDAjQW8dBrx4Hqetw4ewVWbP4WedmZmHHFyfj+sJLArnsOLFoENNYO1wxFB1ANZbhFXG73eP9x4J3fm5ROuhr40Z+BrGw1aqwdaAJ2c7S1nET3InNXz/ynyPjzuK7tkZOVmdJcU/3srLGIh1o7SstrMOmZ5VhXWoGi/Gw8c+1II6E3HxIICgGNtcM1hHQA1VCGV8Tldo+3fgN88JRJ6KypwAX3Azy3o7ZiAlZbDudv//ag9fnW/Iz70ZZ92FtZl3Skl5zUCxNO64shJUXoUpiXtLzdAqkEBWgs4qHVjq/2VOKaZ5Zjx/6DkF8MZt1wuvELAR8SCBIBjbXDNYx0ANVQhlPEG+qA1yYDq+eZdMY+CIyarEaKtZUJpOIYxeusuq7BOp93+LyenN2rqG1wNLYg3NOqsYiHUjs+274f181cgX1VdcYO8OwbTkffzgWO1hcrkYCXBDTWDtew0AFUQxk+Ea+rAv7nGmDTO0BmNjDuKeDEy9UosbYygVQ+jbbc1ZOAjFhgxuayKshX/aOfnKwMDOgun23Nc3qDuhfh1y+uwp6K2pQCMpQn6aABjUU8dNrx/oa9uGnOR0bwz4jeHTDz+pHo6uLOsIPlwSokkJCAxtrhmlXpAKqhDJeIV5UBcycAOz4GcgqAiXOAgReoEWJtZQLJInIlrUan9rmHo3C/Sbyr160oz/hkK46eEYnbswj9uxW2OqvnJCBDeaIOGtBYxEOlHfNX7cTt81aivvEQzhrQBf9+zWlGoBAfEggqAY21wzWkdADVUIZHxPdvM2/3KNtgpne56kWgz2lqdFhbmYCdiNx4nTTv6pWYARni6MmfqezIpLLrqDxRhw1oLOKh0Y5ZSzfj/vlfGLvLF5/QE49NPBF52VkOLcpqJJAeAhprh2uA6ACqoQyHiO9eA8y5DKjYCRT3Aa55Geg2WI0MazsmcLCu0YielFx6i9buxoIvS5O2NaJ3MUb172p8xpX8erKrl5udWgRuvE5Uzx0mHbhiAY1FXHvtkKMGjy9cj+nvbjSsOGlUP9z3o2HIkoR/fEgg4AQ01g7XyPJNVUOpvYhj64fA3IlAzX6g62DT+ZN7ffkkJOCWUyQ/QHceqMGanZI82bwpQ87rfZ3grF5bJjn6irSomE9jEddaO+Qd+O2rn+O55VuNpfbLCwZhyvcG8HaPqLx4IZinxtrhGn06gGqvgssqAAAWGklEQVQotRZxrF8AzLsWaDgI9BkJXDkPKGCurraWhNPPonIjgkTcxhy9L617cMtr4kfgdi3MNT7ZFudn42+rdyVdpUGIyE06SA8KaCzi2mqHrOWpz6/Em1/sMrJCPTBuOK4+s58H1mWTJOAdAY21wzUodADVUGor4lj5nJnq5VAjMOBCYOIsILe9Go2Q104WjPGXq0/B2GEl+OZATStH7+u9VWiKE4Erd+AO6H74tozYeb3uRfkGzdgZwFSvSAu5KZqnp7GIa6kd5TX1+Nnsj/DBV/sgN73IzvNFI3gfeFTetzDNU2PtcM0MdADVUGop4lgyHVh4rznzE34CjHsCyMpRIxHy2naCMXKzMpCfk4VEu3pd2pu7ehKFG7s1o3/39kkPzOsSkevHEtBYxLXTjt0VNbjuv1ZAdq8lwvc/Jp2K0f27+mF29kkCygQ01g7luccaoAOohlIvEZcwvYW/A5ZON2c96hbgwgeATPVgATWMwa4tZ/XeWP0NJs/91NZAZVdPgjCMgIwW16N1K8xzfEbK6adnWwPWuJDGIq6VdmwpqzJu99i6r9qIJH/2+pEY3ruDxiuHQ486AY21wzXT0QFUQ6mPiDfWA69PAVbNNWd84R+As25Tm30AarsVkBGbipxv2lBaiTVGUEY51kpgxq5y7K+utzVbycl34znHJd3Vs9XYUYXcnquTMQStjsYiHkjtiLfG5D2Q2z32VtbimM4FmPPT09GvC4+LBO1d4HhSI6CxdqQ20TZK0wFUQxk8EV80DcjMAsb88+GZ1VUDL1wHbFgAIAMY9yRw8lVqMw9AbZVdMdnVKy2vbXb0JAJX0q58tbfKOHd39COZLeKd4Tu6XFSDMfxaDhqLeOC0I9771Ll9LqprG1DT0GQkD3/2hpGInU/1y+bslwTcIKCxdrgxfaMNOoBqKAMn4njvEWDRH4HzfmM6gdX7gLmXA9uXmzMdMQH48X+qzToAte0EZPzDcPNwuuzqbdxdad2UEbsarRzfJtjV61SQ03xGL3ZeT+41veCx98BgjAAYv8UQNBbxQGlHovcphnpQj0K8ePNoFOfzrHCw3gCOxikBjbXD6ZRb1aMDqIYyUCLePJWYEzjqVmDjQmDPWvOvTpkE/OMMtRkHoLadgIyi/GycO6gb5C7cRLt6krD2O13bH3FThuxydC+Kf1aPwRgBMP5RQ9BYxAOjHXbep5IO+Vhy5/lM8hy8V4AjckhAY+1wOOPW1egAqqEMjIi3msbrtwKfzD78v0f+E3Dxn9RmG5DayzaV4YqnP0hpNB1lV6/k8JVo4uhJ+hWJ2k3lUfnsnEo/LGuPgMYiHhjtsPs+8XiDvTXJUnoQ0Fg7XANMB1ANZWBEvHkaezcAb98PrP3fwzOTFC/37lWbqU+15azenopaI/WE7ObJgfQPvyrDrvLapCP64Qk98eNT+hj34JYU5zuOwD26IwZjJEWftgIai3hgtOO1lTtw2/Mrk9osqrfNJAXDAloS0Fg7XONNB1ANZWBEHBWlwHsPAR/PMpM7G8c7DwFZuUBj3eEzgWrzbbO2qmNU2xA7q2cGZJiRuBXYV1XnaNTcsXCETatKGot4ILRDfsH6t8Wb8PCCdUntzvcpKSIW0IiAxtrhGmU6gGoo/Rfx2kpg2RMwkjvXV5mz6TIQKNtw2Ok7OjBEbc5xa6fyadTY1ausbb771nD2vqnApj2VaEgQgStBGJJTTz7dDu5RiHte+dzYGYxzuYbh+sqZpfd5ZskDSwerSY1F3Hft+Gz7fjz4xhrjVo+2Hr5PwVrzHI07BDTWDncAMApYmaN/It7YAHw6G5C0L1W7zYn0PhXofjzw6V9b7/h56AQmi8i95wfHQ9JJGHn1rM+4ZQl29eTu29gtGZJIWf59YPcitMs98qweAzKU124oGtBYxH3Tjq1l1fiXt9Zh/qqdxhrIzc7EmEHd8PaXpcZ/t/ylKrZDINccxqLqQ7FwOInIE9BYO1yzHXcA1VCmX8TlNo91bwAL7zN3+eTpdBxwwf3A0HHA4oda5wGMzVGcwKZG4Ly71WbdoradCMJ4nUlevWOtCNzjW1yN1rOD/bN6qew6ujZhNhQoAhqLeNq149uqOsx4dyPmfLAZ9Y2HkJEBXHpyb/zq+4PRu2M78H0K1NLmYDwmoLF2uEaGDqAayvSK+LYV5h2+W5eZoy7oAoy5Czj1OiA7V20mKdSua2gyPtfKjt47a0rxt9W7ktaWfHpnfqdL8z24g3q03tVL2kicAqrnDp30yTrBIaCxiKdNOyQP5swlm/HU4o2oqGkwjHfOwK6466IhGNbryOvc+D4FZ21zJN4S0Fg7XANDB1ANZXpEvGyTGdm75nVztNntgFGTzavc8mUIrR+3hFzO2a1tcS2aROOK8yc7CKk8jCBMhRbL2iWgsYh7rh2iAS9/sh2PLVyPbw7UGEjlDO3dPxiCcwZ2s4uY5UgglAQ01g7X7EEHUA2ltyJeuQd472Hg45lAUwOQkQmcdBVw3j1Aca+EI3fyKae+8fCungRkyO6e/Cn3f8Z7JNGy5NWTWzMWWGeH2kLJCEK1hcba8QloLOKeaYcEWb23fg8e+vta48ytPL065OPXYwfjkpN6I1POX/AhgYgT0Fg7XLMclUANpTciXlcFLHsKWPKvQF2lOcKBY81zfj2GtjniZAEZcph75LGdmyNwY6lWNu6uiLurJ+eEju0it2UUWYmUi41/lzNDGRkZxr25Zz/8Lq9IU1tHrO2QgMYi7ol2fL7jAKb9fQ2WbCwziEpQ1S3nD8CkUcemnPTcoUlYjQS0IKCxdrjGlw6gGkp3RVwie1f+1YzsrbTO1fU6GbjwD8Bx3006UjsBGfLLf5xMK0bbRXnZRtLkWBSunNsbXFKEgtxsW06nFGIEYVIzsYCLBDQWcVe1Y9u+ajz61jq8utKK7M3KxLWj+2HyeQPQsSB954NdNC2bIgFPCWisHa5xoQOohtIdEZfI3vVvmpG9e62ErB37Ad/7HTDsMiAzM+koJVnySx9vxx/fWJO0rBQw8upZ0bexP/t0Mnf1nDxOPjs76Yd1SKAlAY1F3BXt2F9dhycXbcSspVtQ19hkoLnkpF5GZG/fzgVcLCRAAgkIaKwdrtnU2U9717rXvqGkIp40GGP7x2Zk75YlJox2nYAxdwKn3QBk57UC1NDYhK/2VjWf0TPP6pVjd0Xyq9FijT0y/gRMPK2v6/CTztX1Htlg1AloLOJK2iGRvbOWbjacv3Irsnd0/y6QnJvDex8Z2Rv1NcL5k0A8Ahprh2sGpQOohjKxiC+ahg17qjFp07nNEXjSleS5m91/MQYW1poJnL94xRxBdj5w5s3AWVOBdh2N/yV5u8S5a3kP7obdlZA0LPGeHsV5KLVxRy4DMtSMztrBIaCxiLfpACbaUb/34qGoaWjEo2+tx479Bw1DyA6+pHSRZM5Od/CDY1GOhATSQ0Bj7XANEB1ANZQJRXzDvHsx8MvpeLR+PGY0Xtbcy51Zz+HmnPloQiYyIY5cBppOvAJbTpiKzyoKm2/KEMcvkTPXPjfLuBYtdlPGkJJi44dAfk4WAzLU7MnamhHQWMQTakeiQK6jTSO/TMqnXknmnMXIXs1WLofrNwGNtcM1dHQA1VDGFfFYMMb4yrn4Vc6LhhP4dOPFeDrnUZyT9Xlzj2sKz8CTWVfjrbJuCXf1julccISjJ3m85KxeolQOvCJNzaCsrRcBjUW8Te2I5e2LZw0RbUnp8tOzj2Nkr17LlaMNEAGNtcM1inQA1VDGFfFlm8pwxdMfGC1PyXoJt+e8BInziMVXrG46FtMarsTSpuHNvRfIrl4sKKNnMYb2lAjcYhTmtR2BG2/4DMhQMypr60NAYxFPqh1tWYHHOPRZoxxpMAlorB2uAaUDqIYyroi/tnIHbnt+pdFyDhqwPm+S4fyJE3hb/WTMbxqFQ8jE2GEluPTkXkbalb6dClxN0MqADDXDsrYeBDQW8aTa0ZYFeLOOHuuTowwuAY21wzWodACByQDuAFACYBWAWwEst0k46W/xt2a9bHwGbjiUieyMpiPOBPK3eJuUWYwEEhDwWcQ91Q7uAHLZk4B3BHzWDu8mlkLLUXcALwcwG8DPAXwIYCqACQAGA9htg2Ob53gmVM7F7dYZQAkEiTmDj9WPxwuFV+L9O8/n4W0bkFmEBBIR8FHEPdWOXQdqjkiqHpu/CHZJh3xqB18JElAk4KN2KI7cvepRdwDF6VsB4BYLqWRc3gZgBoCHbGBOGgUszt70FlHAU7JeNpzCDUOnYODEB2x0wSIkQAIBdAA90w4GcnG9k4D3BOgASg6S6D5yP1I1gPEAXm2BYRYAScQ3zgYa53kAuxUA591towsWIQESCJgD6K12AGAgF9c8CXhLgA5gtB3AXgB2ABgNYFmLpfYIgDEAzoiz/ORqjpbXcxQB2H7gwAEUF4sv2PphMIa3LzFbjzYBn0Sc2hHtZcfZh4CAT9oRKHJR3gF0IuL3A7jvaAu25QAGytocDAmEjIBPIk7tCNk64nSiR8An7QgU6Cg7gE4+46S8Axgoa3MwJBAyAj6JOLUjZOuI04keAZ+0I1Cgo+wAiiHkILekfJHUL/JIEMhWAE+oBoEEysocDAmElICPIk7tCOma4rSiQcBH7QgM4Kg7gJLKQYI+brIcQUkDM1HuVwdQasNKbV7obqM+i5AACSgQ8FHEqR0KdmNVEvCbgI/a4ffUm/uPugMoICQFTCwRtFzfMcXaGbRjJDqAdiixDAl4RMBnEad2eGRXNksCXhPwWTu8np6t9ukA2sKUsBAdQDV+rE0CSgQ0FnFqh5LlWZkE1AhorB1qE29Rmw6gGkqKuBo/1iYBJQIaizi1Q8nyrEwCagQ01g61idMBdI0fRdw1lGyIBFInoLGIUztSNzdrkIBrBDTWDtcYcAdQDSVFXI0fa5OAEgGNRZzaoWR5ViYBNQIaa4faxLkD6Bo/irhrKNkQCaROQGMRp3akbm7WIAHXCGisHa4x4A6gGkpDxLdt25bwKji15lmbBEigLQIi4n379pUiHQCUa0SL2qGRsTjU8BHQWDtcMwYdQDWUveUuYLUmWJsESMAFAn2su71daCotTVA70oKZnZBAUgK6aUfSCdktQAfQLqn45YSf3AtakaSZIstRlIWWrKzaiPyvHZW5RmWesqKCPlcZ304Ah/xf/rZHQO04ElXQ15htw9ooGJW56jBPHbXDxhKzV4QOoD1OqqWMzz0afqZyMu+ozDUq85Q1EKW5OlnzXtaJCvuozDNK71OUbOqlBnjWNh1Az9Ae0XCUXoSozDUq84zSD6z0qEFqvURlnUVlnlF6n6Jk09Te6oCUpgOYHkNE6UWIylyjMs8o/cBKjxqk1ktU1llU5hml9ylKNk3trQ5IaTqA6TFEHoC7AUwDUJueLn3rJSpzjco8ZSFFaa6+vTgJOo4K+6jMM0rvU5RsGjTdsDUeOoC2MLEQCZAACZAACZAACYSHAB3A8NiSMyEBEiABEiABEiABWwToANrCxEIkQAIkQAIkQAIkEB4CdADDY0vOhARIgARIgARIgARsEaADaAsTC5EACZAACZAACZBAeAjQAUyPLScDuANACYBVAG4FsDw9XaelF4lwvgzAEAAHASwFcCeAdWnp3d9O7rKiu/8MYKq/Q3G9d7mu7GEAFwEoALARwPUAPnK9JzYYj0DYdUPmHFXtCLNuiF2pHRpoGh1A7410OYDZAH4O4EPLSZgAYDCA3d53n5Ye3gTwPIAVALIBPAhgOIChAKrSMgJ/OhkJYB6AcgCLQuYAdgLwqTWvvwDYA2AggE3WP/4Qj06vUdANsWYUtSPMuiE2pXZoolN0AL03lDh94hjdYnWVCWAbgBkAHvK+e1966GY5t2MA/J8vI/C+00IAnwD4BYDfAlgZMgdQ1uZZAM7xHiV7iEMgirohGMKuHWHXDbEhtUMTSaMD6K2hcgFUAxgP4NUWXc0C0BHAOG+79631AQA2ABgB4HPfRuFtx2LDfQB+CWBxCB3ALwEsANAHgDjyOwA8BeBpb7GydQBR1Q0xfti1I+y6ITakdmgiY3QAvTVUL+sH52gAy1p09Yj1Q/UMb7v3pXXZ4XzdcnDP9mUE3nf6EwC/ASCfcmpC6gDKvOR5DMAL1lzlnKMcZZAfYny8IxBF3RCaYdeOKOiG2JHa4Z02uNoyHUBXcbZqLIpCLufFJGhAnL/t3uL1pfW+VhDEhQA+s0YQxh3AOmue8stL7JluOYKjfCEfnU6jqBti3TBrR1R0Q+xI7dBEq+gAemuoqH3KecL6rP1dAF97i9a31i8B8AqAxhYjyAJwCECTdW9uy7/zbaCKHW8BsBDAjS3audk67ygRfny8IxA13RCSYdeOqOiG2JLa4Z02uNoyHUBXccZtTA5zS8oXSf0ij3zm2GoJXliCQGQdSVDLpQDOtc7/eU/Wnx6KAPQ7quuZANZaKVPCcuZxLgDZtWgZBPI4ADm20HJX0B8rhL/XKOiGWDEq2hEV3RCbUjs00Sc6gN4bStI5yJmpmyxHUHLFTbRy5pV6331aepDggCut3b+Wuf8OWHkB0zIIHzsJ4ydgOd8o+Rzvs1LdnG4FgPwMwH/7yDoqXUdBN8SWUdaOMOqG2JTaoYlK0QFMj6EkBUwsEbSkC5li5QRMT+/e9yKfP+M9kjT4We+7972HsAr5D60k15L/Tz7pS0AIo4DTt9zCrhtCMsraEVbdELtSO9KnE457ogPoGB0rkgAJkAAJkAAJkICeBOgA6mk3jpoESIAESIAESIAEHBOgA+gYHSuSAAmQAAmQAAmQgJ4E6ADqaTeOmgRIgARIgARIgAQcE6AD6BgdK5IACZAACZAACZCAngToAOppN46aBEiABEiABEiABBwToAPoGB0rkgAJkAAJkAAJkICeBOgA6mk3jpoESIAESIAESIAEHBOgA+gYHSuSAAmQAAmQAAmQgJ4E6ADqaTeOmgRIgARIgARIgAQcE6AD6BgdK5IACZAACZAACZCAngToAOppN46aBEiABEiABEiABBwToAPoGB0rkgAJkAAJkAAJkICeBOgA6mk3jpoESIAESIAESIAEHBOgA+gYHSuSAAmQAAmQAAmQgJ4E6ADqaTeOmgRIgARIgARIgAQcE6AD6BgdK5IACZAACZAACZCAngToAOppN46aBEiABEiABEiABBwToAPoGB0rkgAJkAAJkAAJkICeBOgA6mk3jpoESIAESIAESIAEHBOgA+gYHSuSAAmQAAmQAAmQgJ4E6ADqaTeOmgRIgARIgARIgAQcE6AD6BgdK5IACZAACZAACZCAngToAOppN46aBEiABEiABEiABBwToAPoGB0rkgAJkAAJkAAJkICeBOgA6mk3jpoESIAESIAESIAEHBOgA+gYHSuSAAmQAAmQAAmQgJ4E6ADqaTeOmgRIgARIgARIgAQcE6AD6BgdK5IACZAACZAACZCAngToAOppN46aBEiABEiABEiABBwToAPoGB0rkgAJkAAJkAAJkICeBOgA6mk3jpoESIAESIAESIAEHBP4f6MzI89SfK8vAAAAAElFTkSuQmCC\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7febd4b51f60>]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plt.figure()\n",
    "# subplot with 1 row, 2 columns, and current axis is 1st subplot axes\n",
    "plt.subplot(1, 2, 1)\n",
    "\n",
    "linear_data = np.array([1,2,3,4,5,6,7,8])\n",
    "\n",
    "plt.plot(linear_data, '-o')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7febd4b6e320>]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "exponential_data = linear_data**2 \n",
    "\n",
    "# subplot with 1 row, 2 columns, and current axis is 2nd subplot axes\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(exponential_data, '-o')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fec080800f0>]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# plot exponential data on 1st subplot axes\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.plot(exponential_data, '-x')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": 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": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7febd2a312b0>]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plt.figure() # Create new figure instead of adding to the existing one\n",
    "ax1 = plt.subplot(1, 2, 1)\n",
    "plt.plot(linear_data, '-o')\n",
    "# pass sharey=ax1 to ensure the two subplots share the same y axis\n",
    "ax2 = plt.subplot(1, 2, 2, sharey=ax1)\n",
    "plt.plot(exponential_data, '-x')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": 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": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plt.figure()\n",
    "# the right hand side is equivalent shorthand syntax\n",
    "plt.subplot(1,2,1) == plt.subplot(121)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\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": [
       "[<matplotlib.lines.Line2D at 0x7febd297b470>]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# create a 3x3 grid of subplots\n",
    "fig, ((ax1,ax2,ax3), (ax4,ax5,ax6), (ax7,ax8,ax9)) = plt.subplots(3, 3, sharex=True, sharey=True)\n",
    "# plot the linear_data on the 5th subplot axes \n",
    "ax5.plot(linear_data, '-')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# set inside tick labels to visible\n",
    "for ax in plt.gcf().get_axes():\n",
    "    for label in ax.get_xticklabels() + ax.get_yticklabels():\n",
    "        label.set_visible(True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# necessary on some systems to update the plot\n",
    "plt.gcf().canvas.draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Histograms"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": 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"
    }
   ],
   "source": [
    "# create 2x2 grid of axis subplots\n",
    "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex=True)\n",
    "axs = [ax1,ax2,ax3,ax4]\n",
    "\n",
    "# draw n = 10, 100, 1000, and 10000 samples from the normal distribution and plot corresponding histograms\n",
    "for n in range(0,len(axs)):\n",
    "    sample_size = 10**(n+1) # 10 raised to the power of n \n",
    "    sample = np.random.normal(loc=0.0, scale=1.0, size=sample_size)\n",
    "    axs[n].hist(sample)\n",
    "    axs[n].set_title('n={}'.format(sample_size))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": 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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ODICGsAjS7jTlYAEJCABCUhAAhpA14AEJCABCUhAAhI4MgIawCNLuNOVgAQkIAEJSEACGkDXgAQkIAEJSEACEjgyAhrAI0u405WABCQgAQlIQAIaQNeABCQgAQlIQAISODICGsAjS7jTlYAEJCABCUhAAhpA14AEJCABCUhAAhI4MgIawCNLuNOVgAQkIAEJSEACGkDXgAQkIAEJSEACEjgyAhrAI0u405WABCQgAQlIQAIaQNeABCQgAQlIQAISODICGsAjS7jTlYAEJCABCUhAAhpA14AEJCABCUhAAhI4MgIawCNLuNOVgAQkIAEJSEACGkDXgAQkIAEJSEACEjgyAhrAI0u405WABCQgAQlIQAIaQNeABCQgAQlIQAISODICGsAjS7jTlYAEJCABCUhAAhpA14AEJCABCUhAAhI4MgIawCNLuNOVgAQkIAEJSEACGkCqRs+9AAAAhElEQVTXgAQkIAEJSEACEjgyAhrAI0u405WABCQgAQlIQAIaQNeABCQgAQlIQAISODICGsAjS7jTlYAEJCABCUhAAhpA14AEJCABCUhAAhI4MgIawCNLuNOVgAQkIAEJSEACGkDXgAQkIAEJSEACEjgyAhrAI0u405WABCQgAQlIQAL/P/Y5ByjEDsKeAAAAAElFTkSuQmCC\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# repeat with number of bins set to 100\n",
    "fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex=True)\n",
    "axs = [ax1,ax2,ax3,ax4]\n",
    "\n",
    "for n in range(0,len(axs)):\n",
    "    sample_size = 10**(n+1)\n",
    "    sample = np.random.normal(loc=0.0, scale=1.0, size=sample_size)\n",
    "    axs[n].hist(sample, bins=100)\n",
    "    axs[n].set_title('n={}'.format(sample_size))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4Xuy9CbgVxbX3vRgPg4AgKqBRkEFEBMQ45ThEhDhGYzTGId4bh9xE5b3qjXk1USIGx8T7It9FTWI0JnG6mZyngGBUIk4ICoiCghOgMnjAw3CYvmdtTh36NN1dq7qqenfv/T/P431y2VXVVb9aXf2vVVWrWhD+QAAEQAAEQAAEQAAEqopAi6pqLRoLAiAAAiAAAiAAAiBAEIAwAhAAARAAARAAARCoMgIQgFXW4WguCIAACIAACIAACEAAwgZAAARAAARAAARAoMoIQABWWYejuSAAAiAAAiAAAiAAAQgbAAEQAAEQAAEQAIEqIwABWGUdjuaCAAiAAAiAAAiAAAQgbAAEQAAEQAAEQAAEqowABGCVdTiaCwIgAAIgAAIgAAIQgLABEAABEAABEAABEKgyAhCAVdbhaC4IgAAIgAAIgAAIQADCBkAABEAABEAABECgyghAAFZZh6O5IAACIAACIAACIAABCBsAARAAARAAARAAgSojAAFYZR2O5oIACIAACIAACIAABCBsAARAAARAAARAAASqjAAEYJV1OJoLAiAAAiAAAiAAAhCAsAEQAAEQAAEQAAEQqDICEIBV1uFoLgiAAAiAAAiAAAhAAMIGQAAEQAAEQAAEQKDKCEAAVlmHo7kgAAIgAAIgAAIgAAEIGwABEAABEAABEACBKiMAAVhlHY7mggAIgAAIgAAIgAAEIGwABEAABEAABEAABKqMAARglXU4mgsCIAACIAACIAACEICwARAAARAAARAAARCoMgIQgFXW4WguCIAACIAACIAACEAAwgZAAARAAARAAARAoMoIQABWWYejuSAAAiAAAiAAAiAAAQgbAAEQAAEQAAEQAIEqIwABWGUdjuaCAAiAAAiAAAiAAAQgbAAEQAAEQAAEQAAEqowABGCVdTiaCwIgAAIgAAIgAAIQgLABEAABEAABEAABEKgyAhCAVdbhaC4IgAAIgAAIgAAIQADCBkAABEAABEAABECgyghAAFZZh6O5IAACIAACIAACIAABCBsAARAAARAAARAAgSojAAFYZR2O5oIACIAACIAACIAABCBsAARAAARAAARAAASqjAAEYJV1OJoLAiAAAiAAAiAAAhCAsAEQAAEQAAEQAAEQqDICEIBV1uFoLgiAAAiAAAiAAAhAAMIGQAAEQAAEQAAEQKDKCEAAVlmHo7kgAAIgAAIgAAIgAAEIGwABEAABEAABEACBKiMAAVhlHY7mggAIgAAIgAAIgAAEIGwABEAABEAABEAABKqMAARglXU4mgsCIAACIAACIAACEICwARAAARAAARAAARCoMgIQgFXW4WguCIAACIAACIAACEAAwgZAAARAAARAAARAoMoIQABWWYejuSAAAiAAAiAAAiAAAQgbAAEQAAEQAAEQAIEqIwABWGUdjuaCAAiAAAiAAAiAAAQgbAAEQAAEQAAEQAAEqowABKBdhzO/XkS02q4Y5AYBEAABEAABEMiYQCciWkxEWzJ+bi4eBwFo1w27EdHHdkUgNwiAAAiAAAiAQJkI7E5En5Tp2WV9LATgNvxXEtGNRDSBiC4V9kpnIqr76KOPqHNn/p/4AwEQAAEQAAEQyDuBVatW0Ve+8hWuZhciWpX3+vqoHwTgVqoHEtGfG41gqqkArKurgwD0YZ0oEwRAAARAAAQ8EGAB2KULaz8IQA94C1PkDkQ0g4guIqKriWgmBGBh+g4VBQEQAAEQAAFjAhCARPAAEv2BiFYQ0WVE9BwEoPF7hAwgAAIgAAIgUCgCEIAQgGcQ0VWNS8DrBAKwhoj4P/XHJ4g+xhJwod57VBYEQAAEQKDKCUAAVrcA5N2frxHRKCJ6s/Fd0HkAxxLRNeH3BgKwykcSNB8EQAAEQKBQBCAAq1sAfouIHiKiTQGrbdUYD2hzo6cv+BsngwewUK84KgsCIAACIAAC2xOAAKxuAcjLt3uGzOL3RDSPiG4motmCl6YUBgYeQAEpJAEBEAABEACBnBCAAKxuARhlhrol4HAeCMCcvMyoBgiAAAiAAAhICUAAQgCGbQUCUPr2IB0IgAAIgAAIFJQABCAEoK3pwgNoSxD5QQAEQAAEQCBjAhCAEIC2JgcBaEsQ+UEABLwR2LR5C72ycAV9tnod7dKpHR3Upxu1aonwr96Ao+DCEIAAhAC0NVYIQFuCyA8CIOCFwNOzl9C1j82lJXUc4nTrX88u7eiabw6iYwf39PJMFAoCRSEAAQgBaGuruRaAmP3bdi/yg0AxCbD4u/DeGbQlVH3l+7vje8MhAovZtai1IwIQgBCAtqaUWwGI2b9t1yI/CBSTAE/8Drt5SjPPX7AlLAJ7dGlHL14xAsvBxexi1NoBAQhACEBbM8qlAMTs37ZbkR8EikvgpfeW05l3Ttc24IEfHEKH9t1Jmw4JQKASCUAAQgDa2nXuBKBu9s8N7taxDY05cV/q0Rmbwm0NAPlBIG8EHpn5CV3y4ExttSacMYxOHrabNh0SgEAlEoAAhAC0tevcCUDp7F81HJvCbU0A+UEgXwSkYwA8gPnqN9QmWwIQgBCAthaXOwEonf2rhmNTuK0JID8I5IuAWgVYWrduu0MgXFPsAcxXf6E25SEAAQgBaGt5uROA0tl/sOH4INiaAfKDQL4IqH3AXKvgSWBM+PLVT6hN+QhAAEIA2lpf7gSgbvaf1GAsCdmaA/KDQH4IIBJAfvoCNckfAQhACEBbq8ydAOQGxc3+dY3FpnAdIfwOAsUigFigxeov1DY7AhCAEIC21pZLAahEYPgWAF1j4QHUEarM3yESKrNf0SoQAIF4AhCAEIC270duBSA3TH3Yl9atpXFPvE0r6xuwKdy2xyssP5YJK6xD0RwQAAERAQhACECRoSQkyrUADNYbm8K30oC3a5tVIGC47euP/CAAAkUlAAEIAWhru4URgHHLwtUUBxDerm3mrgsYjpPhtkMD8oMACOSZAAQgBKCtfRZKAFazBwzeruamLg0XVMn7QuENth3+kB8EiksAAhAC0NZ6CycAbRtcxPzwdm3fa9KA4ZV6Mhze4CK+yagzCLgjAAEIAWhrTRCAtgQzyA9v1/aQi8rEhdcO3uAMXjo8AgRyTgACEALQ1kQhAG0JZpC/2r1dUYh1AcPzuAfQhdcO3uBt1uBCTGfw+jp9RDW22SnACioMAhAC0NacIQBtCWaQv6jeLt9oinQy3JXXDraw1apciGnf9um6/Gpss2uGlVQeBCAEoK09QwDaEswgfxG9XRlgKYwQcOm1K4c3OG9eJ1diOisbdfGcamyzC26VXAYEIASgrX1DANoSzCh/kbxdGSFpekzeBEq4/S69di7LkvRT3rxOLsW0pP15SFONbc4D97zXAQIQAtDWRiEAbQlmmD9vH+MMm17oR7n02mXpDc6j1ylrAZwHw6vGNueBe97rAAEIAWhroxCAtgQzzp93b1fGOArxONcf8Cy8wXn1OrkU04UwHiKqxjYXpW/KWU8IQAhAW/uDALQliPwgoCHgw2vn2xvsWrS6MpK81stV+6LKkbZ5zAn70Pdr+1CrlnwGHn+VTgACEALQ1sYhAG0JIj8ICAj48Nr59Abn1evkQ0wLuq+sSXRtDlbO99WYPm2urJAL+HAIQAhAW7OFALQliPwgICTg22snrIYomdTrVI6r9nyIaRGUMiaKa3O4Ssr3d8f3htOxg3s6rXGR7Ndpw3NaGAQgBKCtaUIA2hJEfhAwIJDWg5I2n0HVmiXVeZ3KHWi7GsVIVJuj+tdH3+TxQFBa266UfBCAEIC2tgwBaEsQ+UHAM4FyiZ28e9qyFsWeu1lUPLf5nmkLadwTb2vT67yzUn55PRCkBVDhCSAAIQBtTRwC0JYg8oOARwLl9ryUS3x6RFr4ol3szzTp1zxvByh8Z1o0AAIQAtDCfEpZIQBtCSI/ST0JQGVGIC+eF/SvWb/5Tm0ryEwnFS4Ep28m1Vg+BCAEoK3dQwDaEqzy/CaehCpHZdx82w+98QORoRAEbPZnpplUwA7zaRYQgBCAFxIR/9e70UTnENEviOgpoclCAApBIdn2BEw9CWBoRqBaPS/wOOrtJO3+zDRizkZw6luCFGkJQABCAH6TiDYR0XzayuLfiegnRLQ/EbEY1P1BAOoI4fdIAmk8CUBpRiDNx9rsCflLDY+yvE/SsEo7qdAJztvOGk5dO7alz1avo106taOD+nRDQGp5V6ZKCQEIARhlOCsaReBdAquCABRAQpLtCVSjOMnaDkw9L0X3nMGjbG5hpn1u897GCc6ThvakR2ctoSV165oa4DsgtTmpyssBAQgBGLTqVkT0HSL6Q6MHcG6EydcQEf+n/joR0cd1dXXUuTNrQfyBgIxAWk+CrHSkUgR0nhcV8DeNNyhPlOFRzqY3TCcV4VqFBefK+vV08f1v0JZQQp8BqbMhFf0UU8Hts64QgBCAbF/7EdFLRNSOiL4korOI6MkYwxtLRNeEf4MA9PmaVmbZNp6EyiTir1U6cVcJnjPYkz/7CZcsnVToalQu0V4uEaZ7D3W8XP8OAQgByDbVloj2IKIuRHQaEV1AREcSETyArt84lNdEwNaTAJRmBOI+euX6CJvVXp8aHuXtGfkUOi7ETDlEu4t6661x+xR5nGRBAEIARtnyZCJ6j4h+KDB07AEUQEKSaAKuPAngm55AOT7C6Wsbn7NS2uGKTRZCx1ZgZi3ayyXC8jrJggCEAIwab6YQ0YdE9H3BYAQBKICEJPEEsvhQgX88gaw/wr76Ah7lbWTLJXRM+zZL0V5OEZZlO036AAIQAvDGxph/LPj4QAfv/7uCiI4hokkCYyq8ALSdxQoYIYmGQB76IA91KIeh5PXjlIYFPMpUulXnsJunNDtRG2TJhyt6dGlHL14xouxhVrIU7eW087xOsiAAIQA51MvRRNSTiOqI6E0iulko/nhcKbQAhPcpzWe28vKU0w7KLTyz/AhnYTnl7Mss2qd7RjmFjq5uUb9nJdrLKcLy2icQgBCAad7ZYJ7CCsCiLJPYdhDyJxMopx3kRaxk9RF2aYtJwrncotplO03LKqfQMa2rSp/Fe1BOEZbXSRYEIARg2ndW5ctMALoc1Mu5TOKyHbad5zp/0dpmYwe2bS2n8IzzxFz72NzEYLy2bXZlb1kIBld1zbqccgodm7b6tq1yi7A8TrIgACEAbd7ZzJaAXQ/4aQdJ20HKdTtsO89l/iK2TWoHY07Yh7p3qmm6omrS3KUUJZbGnDBIdJ2VjfB02WfhspLsOy/9mzfh7LM/0pRdbqGTps5Z5Sm3CHvyzcV09SOzaUX9hqYml/PGEwhACEDbd8+7B9DHgJ9mmcT2A+ijHbad5yp/kdoWFDnzP11NE6dyxCP5344d2tAXa7YN4Ek54wZ3qfAcfVQ/qu3Xvaz3ojKviVPm0/jJfF1487+sb2vIq3CWW082KcsldGwnyFnQsR3H09Yx6rndOral604eTMcP4S342f9BAEIA2lqdVwHoa8CXfoAf+MEhdGjfnchW4KRtRxEG1LRtszW8NPmjBuE05UjzxAkk6QREPadcXgLmNfbRubR01bY7WqNEoKtTpTp7N31vpf1UiemyFjpZP8+mz3R2ZlN2VF7b74fr+qjyIAAhAG1ty6sA9DXgmyyTMCDbsApp2lGUATVN22yNLk3+uEE4TVkmeaLCbkiZqedk7Wnj55ryUpMlEzbBtBJ7lwrnCWcMo5OH7Za2KhWTLyuhk1eBk4eOzPMEGQIQAtD2HfEqAKUD/uij+tJlo/Y2imslXSaRfqyTPoDSdqgPV5EGVNO22Rpcmvy6QThNmaZ5gvahm4DEld2jcw1Nu/JoIzsPliUVBGl42Ygundi8/azhpWUyF++iab+ZppcyNi03r+kltrJj+zZ029nD6ZC9dkptu3ltv65eebZZCEAIQJ396n73KgClLw9XMs0yWVZeB2k7WCQc1KebtcdR12kufzdpGy+nl+NPWkefdQsLJJ3oiavLZSMH0CUj+zf9LBUcEltXhabhldYDKBEQLVsQTTxzfzpmcM/Su7G0bh1tiQDkIsixlGcwXfeONaUvybNvf0oPz1xMK+obmmqXZlxKY4fSeqcpOymPia1kxcJ1G23Ky/MEGQIQAtDGtjmvVwGYxlOivAXShukGTukAl/QB1LUj+OF6ZeEKOvPO6drqp/3gags2TGDStlb8JS/Dn3QQ5kMX/XfdgZatXk/jnnjbaU2jDnTc+ORc+s3zC42f8+vvDadjB/csLdPqQrdw4aYeZSkvLttWdEnfL34Wt5v/Lrx3RqQA5N9+eEQf+unxg4yZKk5SnuF0cQ9UFn/pyAHUu3uHppPkLt8FqR3ooCSNhXG/mdoK1+GORvvV1acSfpfadznGcwhACEDbd8yrAAx+vPh/R836ww1Q3oLjh/QStU0nAF0JHOmSs3RAtVlyE4ExSCRtm0GRTpOaDsK6PrepnPKCjBrUI9HTm/QMLoNDzlx8//ZCKLxfUOdhs92jyPltPuhSe2ce3G6+wuyXT78dK5zT1kcqktN6boP96dITJq23zmaTRCTnjRPGXdq3FU1Y1fNtJwy6duTtd91YUk4eEIAQgLbvi3cBGDcz11VceUmS0klnzq4EjuR5pmJFx8H173GCWdI2ndh2XVdVXppBOKnPeSJiEg4m2K6gR2j85HdTN5lDSASXGsPPUCdz03iUdbzUs3hP4tiT9i15I9P+Se1dlX/fBQfT5X+Z5fSuW6lI/udPjqIjfzU19tlSBq4O9Ujrrbv3N0lExk26VRtuO2v/krc8blk+jkmWHq9yjTuq7brvh0/vcJJNQgBCAErHrLh0mQhAfji/xOMnvUsTpy4Q1Vl5C+KWWkxnzhKBI6mYbjDSfXyzmDGmFXlJbXPFL46xjqtuEI7yYiXVmT14LK4+W72utKy3sn7rsvGSuviQKUEvSBeDeIISu4pKwx9Zrt8lD87UFhG3R5EzRokA3os4ekQ/6039OhETrjgvpUvGABOBIRWhHBDc1dYAF++xtN6S7SkSuw33hWqD8kbH2UqU8WW1gpF23NGNJ8E2SdJG1aNrhzaldysYV9Sld1j30kMAQgDqbET3e2YCkCsiHfBUpeMGPslHp1uHNjTmxEHUo0v7pkC8khddB0zyexqxIilXkiZuwDxpaE/67fMLtxMDEm+GqdgO11PHXTrIS9OZDu4qvarntAWfGweYlvSNaRr+yLI4TbunNA0v0zpyen7Oj+6dIcrKJ/4lwbtNBIZ0GfrfDt2T/vjSB6J6ShOZCNVwmdJ6J7EwHVPjJhp1axu2WyZOYmDTbinbtOOOid2bpA2OY4uW1Zc9uDoEIASg9F2KS5epAJQIt2BF4wY+00Evy1mZqr/JwGLbicFnRm2wZ5GXtP8yyZuh6zOdJ0THwXSQ14nJJJbSvNIPM4fHqFu7QbS3NVivHWpa0ZfrN2m7PXiqPO3J2ag284OD3k8+uW57qOHJN5fQ6Adm0OYYQ1N2cstpQ+nsu14WtV166lw6Hlx1/D50/ZNuDweZCNVwo6X1dhGiKgm4agPbyvT3lpf2pn6xNvq2HN37ru3YhARBW+WT2T/+y6zYIOZx9TAZT0zShieVtrFlbTipvBCAEIC2dpSpADT1FsQNfNIPtIIj8XLZgozKLxUcLp6tE2qSZ0TxtvlI6QZYtf8obvnK5cdGJ0SDfKRtvmxkf7q18Yo1yQGn4DN4D2LdmmjxGG63S4+yhENau+W7Ui+6/43tTC34/qnDM0mCdtfONfTfpw+jZV+uF526lW67+OWpQ+icu1+RvAriNDaeMGm9k/YASm3VxJvn0t6kIKPsUpI3Kj6nZDzhstOKOClzG9uQtB0CEAJQYidJaTIXgFwZqbcgbuCTvoDBhrsUE7bQfeRPwyRcjyhvhlRsh/PqBCn3R9eObZpdrB7HxXYg1QnR8P5Bkw/zpLlLI09YsmdwTUO0l4/bznsIWQDyX1A8xk1WJMJNZ1cSDlyGJJQKp4sSinE8rvnmoKbDJkkCI+qAjsSDLxEt6zduFu2n1HHk312NJ5J6Jx3S0dlqUluS2uDC3oLP1u0vTgoNlNSG4LgjHQN5POG/tFsr0o6JErsySQMBCAFoYi9RacsiALeKQL23IDjwmSwPSGa7ab0cEuA+y457vnRQkrAJpjEZVINLdtJ8Ep42y2wSIRp1F67Jhznc35s3bxEtc/JBjAdf/bDZwZMksaOzq6TfGzZupkNunBwruFkMsFdyZaMoDU+e+P8PCuUogcBL4ufW9qELv96XXv9gZdMBm6gl5sj8MQdrpB58nWiR2mTndq3pOwfsTp3btynt8wpvoYgK1WOzpK6rt+4d0QlqJVglEw2paNPVKfh7UvtswinxM4KTQ+kYyOMJ/6U5XMX5pHZkO3HVMYYAhADU2Yju97IJQK6YdOAz+VjoGswvf03rlmIvh6688O/SNpmWq0svHZTiyuH4i/PGHUdtW7dslkTnYYjzIkgHY127woO8JL0LAWtin+E6Sds+/vShtEvndqUPCvsBD92rOx3SN911W0l2x/X72UOzY8POSJgG+5m9fEkeGxaSN317P214GZNJndTjliSCdbbMHLp1bEPTfzqy6T3Qvc+633WiXbGXpovrK67H2Efn0NJV65uSqDA//A9Sr67EFkzS6LzOl47sH3mYQveMKHuQjoG2HkCJHfE78PrVo6z31iZxgACEANS9J7rfyyoAuXK6gS9pADHdd8XPu/To/jTh2fmpTsPqYOoGO0nAXR2PuA/GAXt2LcU4M43nFWxT3IzVxBumypMOxhwPb2V9g7erwaRiLM7LqBMUUZ4fk7a7uHbM9TuSZOe6OH7BvJJYnqb2oguJovPEpbHlOBvQve//cUQfenTWErGHN8xdOhaoycrYR+c2OzTRo3M7GnvS1qV3k7J045z0d4n3vUv7NrEHTuKeE+cR1gmzoGjksm2uJeS+1518N7F/KdNgOghACMA0dhPMU3YBmNQA3QDCedlzFXfyMKpsaQBe01ORurpKPBhSb8LkuUvpoZmfNFvO46VDFeqF251GHCctterqFvXxOuC6Sc1iZAXT6GKQSZf9dC+AVIyZLtf4WNZK02ad3en4mP4ujePH5epieQafnVaoK2ET904E9x6q55nachSjtNylfWxSR50QlUw8Te1Akl767knKCqZJ2iZhIvBN0qYd33RBvE3bDgHYnJh6n2w4VnNe7wJQN/NM+t3XAKLrcFMxwOVJ66rzsoWFmzLwKG9CWFDx/x+VbqeObWl54IL7uPbfd/7BVNu/eyweXV8GM5rMkE0+drq+ixqo087003p++IPL+wCjTsTq6i+ZKATLkNqd7rnS36Vx/FR50ndJ2o5geVF2E/VORAkgE1uOYiOtb1ReXR+bCDqdENU9S9rvnM6U2bjH5tBd0xZpH5EUTonrb3oq3GQ8MUmb5r2T2r8WUkQCeADhAUxjN8E8XgWgzksyccp8+v20Rc2WAIKzO6lX4Lza3vTwzMVWe5yCUNIcOpDWNaps3SAu7WQ12POVV8FN+NLlYfaOfmtYL+KN2Tax4STt4Sj6rwX2yJh+XKKEXtzyX5qZfpzt8q0J456Yq73K7JbvDKWzf6ePdxfXt9IPh9TudDYUPJkc5T1WtiWN46eeJ32XTJbv2DsfJ5LC7Qwv++mWiHWc1O8uuEf1se7dCQs6qRCV2lNc+02FkmQCqJ7Fh6FubbxW0fSgSlx9TcYTTjv9/eVGe3Gl/S+1f6ndBdNBAEIAprGbTASgbl9Sh7atYsNkcAXPr+1NvXZsL7q6iQc3Fjm6U44+wo6ogUZ6e4RNrD1pZ4efwXWcOGUBmdxdG15mMRlQs/ooKR6Sj5MkTbC8NAG1g/1jslQa1a/SD4eUdZLt8MGHG07Zr5SE281/cR9inhzU3vRss8MGSWXrvMrBvHFCXaVRe6p0IimqPqYnrnXv2vhJ79CEZ2XXWsaVFdXH0v5U77jUyya1p6i6mngkOb9J/6iJoCR8UFKfmIxP4XJMxgaV17SfdPaU5ncIQAjANHbjXQCaDAC6Buj2+PHHa8yJ+xJveOb7XC9uDEQb9QGTXHzOp7duO3O46DSmbgkq2LakpRjpbFLHSv0eHOxN6hgun+vMy2f8Z3KK0PajZDKYSz5O6t7fpXVrS17ibjvUlOwlysvpynZNl0rD7KUeG53nTGczvD3gpZ8ebXTq9cq/vxW7tzP8PD40UtsvfltB1Mc4qvzgyWLpx1fX9rThXEy8W0l1iOpj6VigohnoDiKo50vtKVxfyfsQ3utp2j9BYZ/GQ6sTcEnjiWT8iIrDyGHMRj/whvbmG+wB1L2Fdr9jD6AdPy9LwKYDgF0TtuVWByGSTt5xEOqL7tffW6oLPitdguLa6TZ+u+alBnuTOkb1QdKyYNJJvAOvn5Q6wLNuMA/WU/dx4jqycOCwP8HwGEnezWWr14u8zjqbZc/X5X+dFbtUrMt/+1n70/FDeumSlX5PWuLWHQaKOqlouvcxqZKmnifJB9lHQOcxJ+xT6vfgLRIqruHoEf2awnnobE7UYWyX7dvQbWcPp0P2ah72RzoW8LV2t02dT1+s3ah9ZFyIJ23GlHubpSJWjY1RcTgldQvavsneafX+62IQxk3apePq7WcNp+OH9JQ2xTgdPIDwABobTSiDFwFoMgBIG6DzBAaF1m1nDaeuHdtuF4jWxBsWFDjKg/TZ6nWlq6nUnrq4K4fCbeIBh/eORdWJ09p6cdTzosIcSOso7YdgOptYXMrzFNyrqDy4cYN5eDO/9GMZbluwb/m3sHczDYtwnolnDKO3FtfRb55fmKq4OIEQV1iccOaT4Ul1kIaqSCt8TDxPumek3YeYqgMCmXx4H1XxUZORpENLadti0g/BZzz0xid02f/O1D52/HeH0Sn771ZKl+a9lNQvPDExHYeD4yT/70tHDhBtizG5bi4ISudE0ELVJMyMveEAACAASURBVIAAhAC0tSEvAjDNACBpCM/S+aACz9SD8dOiRAlvVl9Wv+0uUV3w2rjn8x6VsAeJl51X1Edflh4sh/eB8fIXC5uwdyE8ONh4cYIDmxJJvvogilOaaPwjBu5Mby9Z3czjkiTyo8SmzURDd+hBYo+6NLp9rrr8/LvJR8T0A2lyQjSNPXF/TjxT7smUPkPFIrSJeSlhH07DYnnths0iQcR5o8aOcJlRnnTdXsg0dTf1xKpn3PXC+yKPOI/N5x++Vylbmgmtrn5RE5ykkF46Rur9/yLi5ptw3jTXzXEZupUfXR11v0MAQgDqbET3uxcByANA7U1TmgUl1VVE8ju/iOyBk9zhGCyPI+Kv27hZvG9JUhdJGrVPJ+nWhOBSX5IX57eNnqS4Jb2wULARR5K2BdOkHSBNn8Ppg2JTKhjSPCcvefgjwn3OJ91NT2dL+Ui8L2ntSe0jTbrPVrGWPiP4XnFe3TK3q75kQcd/UdflRT2DBSP32fT3ltPF98+IDXgcJcRNVisk7ZP0cVQ5D834mC778yztI/77tCF06le/0pTuxifnGnm/ow4LqQkNT97vFoST0VYyZYLLRvanS0YOKOWW2qh6lMkky7R6EIAQgKY2E07vRQDyQ26d9C7d+ux82/o1y8+DGC/DSu5wdPrglIVJbk3Y6iXZtlckaf9VeKmSl1FPjgnbIv34p2zadv2i7gHWLePZPi8oNtN4GmyfX+78wf1LasN89441pZFw2ZdbPd68NMZL67/55wJ67t1l2ir/26F70nGDeyaG/rGxp/D1anEVkj6DvU3dO9XQomVr6IFXPnQ+0dQCEyZQy+vSdkWd3r9n2kKRBy6pSlL+UWVI675DTWu65TtDSreOSPfIBZ8XvLWE/921AI7jwzeR1K1NXs1hB8K0K48u7QOV8gg/L60AT+pXCEAIQOFQFJvMmwC85Zl5NHHqe7b1K+UPzqL4o2fqAXRSCcNCeND97le/Qnf8831RTsmGYZPTsa7EkfJARTUibnbLJ+TSBEGWgAoPpD6WyyT1KFca1R+8Ly1u+UqyXzaq/knLzbb2xMt1N5wyOPF+YIndhNvGH+fe3TvS9PdXlKtLIp8bfDcef3OxaNIa3EenCjX1OMVBMNlKoMpQ8fEuvi/eexl+Ho9jSXEy4+oX3pebtGrisqNP3X83+tsbn2iLVB7KtO+BbolbW4GIBBCAEIBp7CaYx6MAfIcmTpXHyVIftrDgiArV4GOTtC1I2/z8Yfs/I/rRXjvvUPLi2ARiVnXJQhxFHSJIO0tOYpi0lBK3dM4z+zUNm2y7pmry6/Ys2doTlx93QMu355gFc7vWrTL3FvKEhf8kk1YVjzG4XO7qXdL1bdDIt8YN3T5Iv+RFsN2XxyeCt2zZIo4zKalT3OS1S4c2tGULaT2AnJ8PZd106n7NPJz879LtB/AApu2p5HzKrv2UXvmlehOA0xYsM74JQRqs1fZD5LJbbQa8pHqEl0TS1tnnUgp/VF8P3Obh2muhypN8vKIOQBx0w+TEfZ8tWlDpA1DOv7TeOl911u1ZsrWncHuVZ6pL+7YikZS23Ty2cDgXXkHgsclkcpr2mZyPPT8nDulF0klreM9kWo9TnOjRhVzh/jWJ82jDxmdetrOj99mFJs/9rPSYcFzYNK99sG+k74HufbJhAA8gPIA/JaJvE9FAIlpLRP8ioiuI6B2hYXkTgDxwHXDdJKODF2qwlAQDzctA9T9n7k/dd6ghDjKcdDpZ2B/bJZOG6YgqX4mif8xZSn+d8TGtXqePGWZaTx83m4SFmRIJIwbuSn/41yJ6ddEK4hO2p+6/Ox3cd6dm194pz6krz4kpD9P0yuPNJ805vl1e/nif3fdr+zTFvwvWKyi22fZ//OeZ9Omq9WJvSLAsJe75kIvk3ti0fIJjy1Ozl9AfX/ogbVFG+cIxOcNiJKqwbh3a0IQz9qcVaxpKqwFxAe6NKhJIbHofedrnlDsf21bU3ehpDwWGxZx6DybPXRppu5KJqw0jCEAIwKeJ6EEiepWIWhPRDUQ0mIgGEVG9wLi8CUB+tmnEfBM3+daTxvIrqQQsUiVRUfB97U0M35krraR0hiotLy5d0t3GacN0nFvbm74xqEezOI6/fPpt+u0LC7Ueu60xF/ehuUtWOduDastIl58/FCxo63O2XC3dN2b6nkfx6FjTiurX+1uuj1pd0PWLze9Rnh/e4/hff5lF6zaYCf2kAPds6/M/+5LGT5YfuPN5H7kNM9d5VR+E70bfvGWL8epUsG5R3ymTAPau2gkBCAEYtqWdiYh93kcS0fMCQ/MqAJUIHPvo3MS9NxI3eXiJb/PmLXT2XS8Lmug/ie/TyWmu08pqE7XOmyDxeIR7iD/Wl4zs3/TPpiEl/Pd4dTxBeTDi9u0pCmm8/VkR5DbwXq+6NRtSeSjT1DPo+VFB5DmUyZ9f+5i+XG/uhU/qB66f6UqLemfVmMqrFzM+XEl/mv5hmuY6y6O+A7wHMK1HOaoy4THK9mBN3IEOk0N6LqBBAEIAhu2oHxHxVJBvdp8tMDLvApDroDYVR81S49zkwZcpKtwDb8r9QnN8P6n9arDhGzrSnFoLlp02PqGgf0pJOKD05cfsLUruezN9sBK8VMv3Jsddd8TC7c4XFsbelxnXoOBem4aNm2ngmKeMyxDBQiIRgbh9e+qwgu/l9vDBMFGlG6MH8F6vpBPT0rJM0inPKedxectM+M5dfjcu+MOr9Px8fagfVX8OHfXKVSOJBanLupnw4bRJh/34d57A8l+avXrhuoQFm629Jm2PMOVgkx4CEAIwaD8tiehRHu+I6LAYw6ohIv5P/XUioo/r6uqoc2fWgn7/pG7yLJYvgyJDEn4iiUzphpIdamjc43NEN4SYUh59VF+6/Bje5hn/pwTztAWfZ7r0Gd60rmqYJhZYsHUq9paLOGimvJE+mUB40mbrUdHxVkugUcHQlZCIunWFY9NdcFgf5/FIk+p7ziF70PA9u9GHy9fQrZPfdSJggs9TQYnTTq6OG7wr9erS3ut+S11//uDwPvT4m0ua3QIUjmnqUqBGxVfkQzk212QGt0dk7flTfCEAIQCD79odRHRco/j7OOYlHEtE14R/y0oA8nN1L4utcNANPup3HoSuOmFQ07VFaQeDLE5xXnX8QDrvsL2abchv7iGtbwyIu17afKfpwp4JV15IXgpeXr8+sw37QSjBpUP+d1tPBHusOSyNbTmSjgvbJO8j5dsr0nrS4p6pRDqHDDHZgyZpA6fhiU9tv52bQiJFTQx13j0X1/FJ65tVulGDdqFJjadbs3qmy+eofbpdO9YQH6B4aOYnzSbOwWDnultUdPUKj00qve22EjUJijpkIt07q6u77ncIQAhAZSMTiehkIjqCiJJuny+rB1Bn0K6Eg+456nc+ebjbju2tI+1Ln6c8Gb9pvNZNmo/TcbiZbzXe+rGyvsF62drk2ZK0vq5oO234bvTXGfpArZI6StMEPVycx3ap7IdH9KH99+hKP2pc1pLWwyQd2wd7ont0ad90EwjfmqNiSkZ5VFjADdi1k9ESYrhOJw7pWfLm+PiLO6wQvAHl4gdmGEUa8FFPlGlGICie2KsbnhSpiQp7Ozds2pI6ZA+Xc+nIAdS7e4dmsVX5OzNk7DPeDl35Pv2raEMAQgCyrf0PEZ1CRF9v3P9n8jZmsgcwrkJ5Ptihg5jG8zfxjP3p+qfetlp60NWrXL8HP9YulwRZNKf1zqZlwV6lm769Negr/5VuRHhvOV10/wxR0Fj1XD7Z+qtTh9DxQ3qVyjDdrC+pv/pYHjlgZzqif3c659De1LY17wbZ/i/K+/7ozE9Ed71K6uI6jS4qQJpYo67rWA3lsfd63YZNpfvUXf6lGUOlz+d3r02rls0mB8oz98Sbi+mxN5dKi0qVTnKwMVXBgUwQgBCAtxPRWY3ev2Dsv7rGuIA6GyubAOR9d1c/MruZ69/2YIeusS5+P3bfHrRzp7bGJ+Z4QGAvzfL6BhfVyF0ZwY/1tPnLnJ7QzjpGXty+xgmTeanzXTH7q47fh847bGssPduN59KH8keVtzf89HiOBKX/y6pe+po0TxH0aMbdinPLM2a3DZnUwfVyucmz85RWHXhgD7JPD7bLNg//Shea8RF/Apv/laNPdZMYm3ZDAEIAxm0pOpeI7hEYV1kEoO3+C0G7kCSCQOd2rWmVh2DQ7DHj08CH9N2pdLrwyr+9ZXVCOw+dF7V3aNxjc4w3zyuvAwd5vuTBmZk1jZedJSKQvYIHXj/Jy+ElV42N2lPF9eYA1A/PXOzqMU13jrPo4aDuWXuenTXEUUF8Nd2rV40qTWBsD8o5qpKoGLXnVZTYcyIfdwCrKkMAQgDamm/mAvDJN5eUltLwlx0BDiNT2697aW/Ykb+aSmkDNOtqrNuQr8uft98vPqovdevQtuS5/XDFGquDDpcc3Y8mPCu/G9uWBXsC5407LnY5OFh+GmFrWz+T/OE9VT6iBISfEVwunzT3U2/7HE04ZJ329rP2L21f4DF79AMzch+KifuwY03rVLEWfbGFB9AX2a3lqvfW71Mqt/RMBeBWb8NkWlGhy6B5M5OofShZnbJ2xYJDeaQJnuvq+a7KYUHWuV12J4G53nxo6LsH7tF0KIQD/vK7xyGL+K7pIl2bty1u5z508f1vOD9NHXdys2jviyt7VR5kF7e8uKpT0cqJO4Hsqh3wAEIA2tpSpgLQ9X6jcuzpsAWeVf6kk2g8qI99dA4tXVWesDEmDHZs35ratWlNn65a5/yjb1IPl2mzttu4zfbBcBscF82XZzjMjkOzrG3YlKo/eVlyRf0Gl91ROj0dde9x1lEJdI1q1YJok+c4QhyPb9zJg0vB3fPWfh2fvP0u3YaRtt4QgBCAaW1H5ctUALo8Hcr7PPhwQBFEjG0npckf/LirsBnBkCC66/nSPNNXHo4HyEF1+c/z989XE5rKZbtt26olfbp6m/gu554ldeCFKxh1+4JLsdqpXWs6v7YPrV63wXgvpY+O0Z3UdH2YyUcbbMvkCda5tX2od/eOTaFSuEw+9f6X1z9yusfStq6u8pvGhlTvwKVH96N7/vWBeH9z3GEyV+2AAIQAtLWlTAWgaw8g35H72qKVRiczbYHlPT+fpOa7W9WBjHAMuyLu0+ON1Cz2bePx5aXv2rVpSes2bAupwR/h+vWbaMPm8sjbTu1a0beG7U5rGzbSC/M/p09XbzupriYSPIm4e9oiK4Qd27ZqFnvNpbhMUzH1gR4xcFf600uL6IMVa2jPbh1KoXSmzPu0Ig4z6bhE7a+88u9vVXRsxV9/bzi98eHK7a6pZE/50fvsQrM/WdXsAJB6B7q0b0tn3jldh7Tpd90EQ1xQTEIIQAhAWxvKVAC6joXGm/T/9vrH8AKGrIADqO7do1PJo1MeSWFrls3zq43URTqJ6JZAdqXxR+uQPt3o9IP2KNw+QVNKPBk6sHdXevbtz5odcLAVpuX06Joy4PTB/ZUX3f9GmiIKk+eSo/vTfx7dn3hCs3jlGpr58RclAr132ir8OYZm3G1VaVewfB0EgQCEALR98TIXgPv8/GniS8zx55dA2Nvi92lmpbdv05IG9+pMr37Ag2/yX4sWRO+MO64UisL2/k7ds/D7NgK8TPb/Th/aLBh27U3PYrKlMZKuHVrTfxy+F938jDxeZF7sLq/C1WUc0FOH71YS/F+s3baPNOnqtqAYXLZ6fapbo3yFgoEAhAC0HTsyFYDjJ72TaSgMWzjInw8CPIPmP5Pll3zUvPi14OUydSMKToQWvz+L1AKexB47uAf9zfNVkHEH5lwdloMH0J/VIQyMHdvMBKDv+xftMCB3ngnwDJr/sgyknFcetsuTpu3i+4KnXXl0yQPL7/Do+2fQU7P9XqNlWkekBwFbAuH9ei4nO7efNbx0qtr1HzyA8ADa2lRmAtD1ARDbhiN/cQjAA7i1r/iwSIsWLWjlGrdhUHSWcOr+vegr3TrSPf9aJD4BqSvT5vc2LVuU7cCMTb2rNS+HljntgN3of1/7OPeHS646fiAN7NGZzv/Dq9TgKOaOr3iAEIAQgLZjSiYCkD0H4ye9SxOnZncTgi0Y0/wu7zFWp9Emz/2sVI1KOMhhylOlV4Mn//9ZxqpLW1/kAwEQaE5g/OlDqX3bVt4PpeU5woGPZWAIQAhA27HGuwD0cW2TbaN95OeTk9MXrrAumu/rfflnI0sDZrWwS4IWDKYqWZYxjfFl3WEoAARAIJEAh+u6/C+zvN+t/IPDe9OdL9iFKvLVlT4OgkAAQgDa2qtXASj5YNs2oBLz33f+wVTbv3upaew9nThlvtU9tEVmFFw+cR1GqMhcUHcQKAIBfn9vOW0onX3Xy16ry3v4OGJAmUJpatsGD6AWUaoEOASSCltTJm8CEB/r9B3DXqwfHtGXRo/oVyqk2sOfqMET+0jT2xRygkA5CBzRv3tpC8sL85eV4/G5eKYKZcUxBl3+wQMID6CtPXkTgBMms9eqeLGwbIG6zM97Ws79Wu/cef/4arbVaxvod5Y3Q0hZqeWTcY/NycUVYtJ6V2u6HWpa0wWH9aG3PvmCnp33ebViQLtBoIkAPIB+jAEeQDuuXgRgyfs3blIuTgza4UHuKALn1fYuhQJZUrcuE0A8eB7UpxsdeP0kWlGf7QnYTBpYAQ8Ztc8updtnDt2re+kaQv474LpJuT/1WQHo0YQCEMAeQD+dBAFox9WLAMRSnV2n2OTOOk6cTV11eVVsLt5D9NL7y2ji1Pd0WfB7mQgoD4e6OeH5dz6jO55/v0y1wWNBIF8E4AH00x8QgHZcvQjAtHcm2jUFuRWBjjWtqH79Ji9AOERNlhut8xzaQQqY9/5U+vWHfMfq3rt2onFPzM3MMyzlX650Lq8wK1cb8Fw3BHwEg8YeQOwBtLVOLwIQHkDbbkF+EACBohLg21Nq++5Ef3tjcVGbgHo7JuAjGDQEIASgrZl6EYC8DISgvbZdk6/83Tq2oZOH9qLf/+uDfFUMtQGBMhPoXNOKLh7Rn1at3UDvL6un6e8vz/y2ljIjMH78gb270quLVhrnK3IG18vAEIAQgLbvgxcByJXiGIAX3jujVL9qvsnCtoPKlX9wzx1owbI1tG7D5qYqsAjEIYxy9QieCwKVQ+Cnxw2kG5+aVzkNErTE9UEQCEAIQIHZJSbxJgCVCLz2MewJsu0k5AcBEACBSiIw/rvDaNzjc2lFfUMlNSuxLfAAuu9qHAKxY+pVAHLVnnxzMV318Gwsidj1E3KDAAiAQMUQYDG0sr6BLrp/6ypRpf/xYbbXrx5FrfgUnaM/eADhAbQ1Ja8CEFfB2XYP8oMACIBAZRFgCfTH8w6iFWsaaNKcJfT4W59WVgMjWtO1Qxt6DQLQeT+7k9POq1aIAr0JQFwFV4j+L2sl27VuSes2bttjWNbK4OEgAAIg4JEAloDdw4UAtGPqTQBOm7/M+wXgdk1H7nISYPF37mG9ac4nq+j5Kr4ntJx9gGeDAAhkRwCHQNyzhgC0Y+pNAN7yzDzc3GDXN8gNAiAAAiBQIQTgAXTfkRCAdkw9CsB3aOLUBXa1Q24QAAEQAAEQqAACrm8DwSEQHAKxfS28CcBpC5bR2b972bZ+yA8CIAACIAAChSfg+jYQCEAIQNuXwpsAfHzmYhr94Bu29UN+EAABEAABEKgIAi6XgSEAIQBtXwovApBPAA+99h/05fqNtvVDfhAAARAAARCoCAIuD4JAAEIA2r4UXgQgTgDbdgvygwAIgAAIVBoBeADd9mi1HwI5goh+QkQHEFFPIjqFiB42QOxFAP7qmXl029T3DKqBpCAAAiAAAiBQuQQ6t2tNb/z8G85uA4EHEB7A44ioloheJ6K/50UAnv7rf9Eri1ZW7puMloEACIAACICAAYFzv9abrjlpX4McyUkhACEAgxayJQ8CkPf/Dbn2Gapfv8mZoaMgEAABEAABECgyAZfLv8wBAhACMHcC8KX3ltOZd04v8nuKuoMACIAACICAMwIda1rRm9cc42z5FwJwa9dU+x5AUwFYQ0T8n/rrREQf19XVUefOvB3Q/u+RmZ/QJQ/OtC8IJYAACIAACIBAhRD49feG07GDeau+mz94ACEATQXgWCK6Jmx+LgUgPIBuXm6UAgIgAAIgUBkE2FPVo0s7evGKEc68gBCAEICmAtC7B5D3AB528xRaWreOeFMi/kAABEAABEAABIhc7gOEAIQANBWA4XfQSxiYp2cvoQvvnQEBiBEPBEAABEAABBoJIBC0W1Oo9j2AOxBRv0akfO/afxHRVCJaQUQfClB7EYD83AmT59P4ye8KqoAkIAACIAACIFD5BOABdNvH1S4Av94o+MJU/0BE3xeg9iYAxz02h+6atkhQBSQBARAAARAAgcolgD2Afvq22gWgLVUvApD3AR54/SRaUb/Btn7IDwIgAAIgAAKFJsBC5Q6cAnbehxCAdki9CECcBLbrFOQGARAAARCoHAL/c+b+9M2hvZw2CIdAcAjE1qC8CEDEArTtFuQHARAAARCoFAKnDd+dbjl9qNPmQABCANoalBcBCA+gbbcgPwiAAAiAQCURQCBo972JJWA7pl4E4LjH59JdLy60qxlygwAIgAAIgECFEOiJQNDOexIC0A6pcwHYsHEz7T3mKdqCKNB2PYPcIAACIAACFUUAYWDcdicEoB1P5wLwrhfep3FPvG1XK+QGARAAgSom0KplC+JoCvirLAIIBO22PyEA7Xg6F4A/f2Q2/fGlD+xqhdwgAAIgAAIgUGEE4AF026EQgHY8nQtAeADtOgS5QQAEQAAEKo8A9gC671MIQDumzgUg7wEcOOYpwuqFXccgNwiAAAiAQOUQwClg930JAWjH1LkA5Orc+ORc+s3zOAVs1zXIDQIgAAIgUCkEIADd9yQEoB1TLwKQNy/v+/Onad3GzXa1Q24QAAEQAAEQqAACWAJ234kQgHZMvQhABIK26xTkBgEQAAEQqDwCOATitk8hAO14ehGAuArOrlOQGwRAAARAoPIIIAyM2z6FALTj6UUATpu/jM6+62W7miE3CIAACIAACFQQAXgA3XYmBKAdTz8CcMEyOvt3EIB2XYPcIAACIAAClUIAewDd9yQEoB1TLwIQS8B2nYLcIAACIAAClUUAp4Dd9ycEoB1TLwIQh0DsOgW5QQAEQAAEKosABKD7/oQAtGPqRQByGJgDr59EK+o32NUOuUEABEAABECg4ARYqPTo0o5evGIE8T3PLv5WrVpFXbp04aL4/6xyUWbRynBDsmitdldfLwKQqzfusTl017RF7mqKkkAABEAABECgwARwCMRt50EA2vH0JgCxDGzXMcgNAiAAAiBQWQQQBsZtf0IA2vH0JgD5TuC9r36KttjVD7lBAARAAARAoCIIwAPothshAO14ehOA8ADadQxygwAIgAAIVA4B3vo3b9xx1LZ1SyeNwh5AIghAO1PyJgB/8dgcuht7AO16B7lBAARAAAQqhgA8gG67EgLQjqcXAbj1FPBkWlHfYFc75AYBEAABEACBCiGAPYBuOxIC0I6nFwGI5V+7TkFuEAABEACByiMAD6DbPoUAtOPpRQDiJhC7TkFuEAABEACByiLQrWMbevWqUYgD6LBbIQDtYHoRgPAA2nUKcoMACIAACFQWgXO/tiddc9JgZ43CIRAcArE1Ji8CkEPADBzzFG1GDBjb/kF+EAABEACBCiBw1fED6QdH9HXWEghACEBbY/IiAOEBtO0W5AcBEAABEKgkAhd/vS/95NiBzpoEAQgBaGtMXgQg9gDadgvygwAIgAAIVBKB0Uf1o8uP2dtZkyAAIQBtjcmLAIQH0LZbkB8EQAAEQKCSCPzpvIPo8AE7O2sSBCAEoK0xeRGAHAdwv7HP0JqGTbb1Q34QAAEQAAEQKDwBCED3XYhTwEQXE9FPiKgHEc0iov9DRK8IUXsTgEOv/Qd9uX6jsBpIBgIgAAIgAAKVSwBLwO77ttoF4HeJ6I9E9CMiepmILiWi7xARbzT4TIDbiwDEErCAPJKAAAiAAAhUDYHRR/Wly4/BIRCXHV7tApBF36tENLoRKt8y/RER/Q8R3SQA7UUAXvvYHPo97gEW4EcSEAABEACBaiBw3/kHU23/7s6aij2A1b0HsC0RrSGi04jo4YBV/YGIdiSikyMsrYaI+D/114mIPq6rq6POnVkL2v/x/r9hv/gHrV6H5V97migBBEAABECg6ARqWrekub841tktIMwDArC6BWAvIvqEiL5GRC8FXpBfEtGRRHRwxEszloiuCf+7SwGI5d+iD1WoPwiAAAiAgEsCEIAuaW4rq5qXgNMIQO8eQMQA9GPoKBUEQAAEQKC4BC4b2Z8uGTnAWQPgAaxuD2CaJeCw8TnfAwgPoLP3GwWBAAiAAAhUCIEd27eh18eMcrYMDAFY3QKQXws+BMIhXzj0C//xIZAPiWhiuQ6B8B7Aw26eQkvq1lXIa4tmgAAIgAAIgIA9gQd+cAgd2ncn+4KwB7DEsJqXgLn9HAaGD338sFEIchiY04mIz5p/KrAy5x5AfubTs5fQhffOoC2CCiAJCIAACIAACFQDgQlnDKOTh+3mpKnwAEIAsiFxCBgVCHomEf1no2dQYmReBKASgT97aDatqG+Q1ANpQAAEQAAEQKCiCcAD6LZ7q90DaEvTmwDkir3wzud0zu+ll5LYNgX5QQAEQAAEQCCfBLp1bEOvXoU9gC57BwLQjqZXAXjePa/QlHmf29UQuUEABEAABECg4ATOr+1NY765r7NWYAkYS8C2xuRNAN745Fz6zfMLbeuH/CAAAiAAAiBQeAIul38ZBgQgBKDtS+FFADZs3EwDxzxFm3EKxLZ/kB8EQAAEQKDgBHp2aUcvXjHCWQgYCMCtBoElYLsXw4sAvOuF92ncE2/b1Qy5QQAEQAAEQKACZOjw+gAAIABJREFUCPzwiD700+MHOW0JPIAQgLYG5UUA/vyR2fTHlz6wrRvygwAIgAAIgEDhCcAD6KcL4QG04+pFAMIDaNcpyA0CIAACIFBZBLAH0H1/QgDaMfUiAHkP4N5XP4VA0HZ9g9wgAAIgAAIVQsBlEGhGgiVgLAHbvhpeBCBfB7ff2GdoTcMm2/ohPwiAAAiAAAgUnsB95x9Mtf27O2sHBCAEoK0xeRGAL723nM68c7pt3ZAfBEAABEAABCqCwH0XHEy1/SAAXXYmloDtaHoRgI/M/IQueZBvpcMfCIAACIAACIAAAkG7twEIQDumXgQgPIB2nYLcIAACIAAClUUAV8G5708IQDumXgQg7wE87OYptLRuHQ6C2PUPcoMACIAACFQIAZcngbEHEHsAbV8LLwKQK/X07CX0o3tn2NYP+UEABEAABECgIgi4PAkMAQgBaPtSeBOAXLEJk9+l8ZPn29YR+UEABEAABECg8ATgAXTbhVgCtuPpVQDiMIhd5yA3CIAACIBAZRBo2YJo3rjjqG3rlk4aBA8gPIC2huRVAL7w7ud0zt2v2NYR+UEABEAABECg8ATgAXTbhfAA2vH0KgB/+9x7dMPT8+xqiNwgAAIgAAIgUAEEsAfQbSdCANrx9CoA/+OPr9I/5n5mV0PkBgEQAAEQAIEKIAAPoNtOhAC04+lVAF764Bv08MzFdjVEbhAAARAAARAoOIHO7VrTGz//BrXizYAO/rAHEHsAbc3IqwDEHkDb7kF+EAABEACBSiBwbm1vuuab+zprCgQgBKCtMXkVgBwQep8xT1HDpi229UR+EAABEAABECgsgf8c0Y/+6xt7O6s/BCAEoK0xeReAB1w3ib5Ys8G2nsgPAiAAAiAAAoUl0Klda5qJJWCn/edmMd1plQpVmFcBiDuBC2ULqCwIgAAIgIBHAjgE4hYuBKAdT68CEIGg7ToHuUEABEAABCqHAMLAuO1LCEA7nl4F4Oj7Z9Djby6xqyFygwAIgAAIgEAFEIAH0G0nQgDa8fQmAG98ci795vmFdrVDbhAAARAAARCoAAI9u7SjF68YgTAwDvsSAtAOphcB2LBxMw0c8xRtxuFfu95BbhAAARAAgYog8OvvDadjB/d01hacAsYpYFtj8iIA73rhfRr3xNu2dUN+EAABEAABECg8gXatW9CcXxznzPvHQCAAIQBtXwwvAvDnj8ymP770gW3dkB8EQAAEQAAEKoKAy/1/EIBbTQJLwHavhhcBCA+gXacgNwiAAAiAQGURcHkCGAIQAtDF2+FFAPIewL3HPEVbsAfQRR+hDBAAARAAgYITgAfQfQdWswfwKiI6gYiGEVEDEe2YAq8XAcj1+NZtL9DMj1alqBKygAAIgAAIgEBlEGCR0sPxCWB4AOEBvJaIviCi3Yno/LwJwEsffIMenrm4Mt5gtAIEQAAEQAAEUhBgAXiH4xPAEIAQgMoUv09Et+ZNAP7qmXl029T3UrwuyAICIAACIAAClUHg9rP2p+OH9HLeGJwCxiEQNqpcCsBpC5bR2b972bnRo0AQAAEQAAEQKAqB+y44mGr7dXdeXQhACEBTAVhDRPyf+utERB/X1dVR5868HdDd36bNW2j4uH9Q3dqN7gpFSSAAAiAAAiBQIAKjj+pHlx+zt/MaQwBWngC8iYiu0FjKPkQ0L5DGxAM4loiuCZfvQwDyMyZMfpfGT57v3PBRIAiAAAiAAAgUgcDoo/rS5ccMdF5VCMDKE4A7E9FOGkt5v/HUr0pmIgAz8wBy5R6Z+Qld8uBM54aPAkEABEAABECgCATuO/9gqu2PJWAffVXNYWDSCMBwH3gLA8MPeum95XTmndN99DvKrHICNa1b0PqNCDRZ5WaA5oNArgl0aNuS3hp7rNMr4FSD4QGsPA+giTHvQUTdiOgkIvoJER3emHkBEX0pLMirAOR9gAdcN4m+WLNBWB0kAwEQAAEQAIHKINCiBdFtZ+IUsK/erGYP4D1E9O8RYI8ioueEwL0LwP3GPkNrGjYJq4NkIAACIAACIFBZBH6NOIBeOrSaBaALoF4FIELBuOgilAECIAACIFBkAj1xE4iX7oMAtMPqVQD+6ul5dNtzCAZt10XIDQIgAAIgUHQCuAvYfQ9CANox9SoAL3lgBj0ya4ldDZEbBEAABEAABApOYMIZw+jkYbs5awUOgVT3IRAXhuRNAD49ewn9+C+zqH499v+56CiUAQIgAAIgUFwC8AC67zt4AO2YehGALP4uvHcGIUiHXecgNwiAAAiAQPEJYA+gnz6EALTj6lwAcuiXw26eQkvq1tnVDLlBAASaCPBAxxOqg3p3pVcWrQQZEACBAhHAKWA/nQUBaMfVuQBE8Ge7DkFuEIgisGOHNqV/RkxN2AcIFIvAacN3p1tOH+q80tgDiD2AtkblXADi+jfbLkF+ENhKYMwJ+1D3TjW0aNkaunXyu9hSAcMAgQISGP/dYXTK/u4OfygEEIAQgLavg3MBCA+gbZcgPwhsJcAfjpOG9sKWChgECBSYwH0XHEy1/XAXsI8uxBKwHVXnAlDtAVxatw4eC7u+Qe4qJ8AewEG9uuA+7Sq3AzS/2ATuO/9gqu0PAeijFyEA7ag6F4BcHZwCtusU5AYBJnDU3jvTt/bfjS55cCaAgICYAH8U27RuSQ0bN4vzIKE/Aq7j/2EJeFtfQQDa2a0XAahEIOIA2nUOchebQE3rlrTe8iN84n496fG3EEy92JaA2lczAXgA/fU+BKAdW28CkKuFm0DsOge5i0FAhWhRteUTu+d+rQ+NHtGPJs1dStc+NhdhkYrRlaglCDgngD2AzpE2FQgBaMfWqwD85dNv0+3PvW9XQ+QGgQIQUCd2d+nUjg7q061U41cWrqDPVq+j7jvUlIL4LatfXzrR+8ArH9LSVYiTWYBuRRVBwJoAloCtEcYWAAFox9arAJw2fxmdfdfLdjVEbhAoAIHRR/Wly0btTa1atijtgQ17/fgmgGu+OYiOHdyT+KDUPdMW0rgn3i5Ay1BFWwI7tm9DX6zdYFsM8heUgOsr4BQGhIFBGBjbV8KrAOQP3X5jn6E1DbgP2LajkD//BFjknTS0J/32+YXbnYBXM9U7vje8SQQeeP0kWlEPYZD/nrWr4QmDd6EnZn9mVwhyF5IAbwd5/epRpYmh6z8IQAhAW5vyKgC5chMmv0vjJ8+3rSfyg4AxgXZtWtK6Dfk5CcmfgB5d2tGLV4wofRCefHMxXXT/G8btcpWhW8c2EKCuYKIcEIggcNnIAXTJyP5e2EAAQgDaGpZ3AchewCFjn6F6eAFt+wr5K4RAcEnoxifn0m+eX5hpy1iI7tq5hn512lB6eeEK2kJb6P6XP6CVazZmWg88DAQqmcAONa1oxphvUNvWLb00EwIQAtDWsDIRgAdcN6lq7jDljyt7ntbmyPNkayQ+8n9rWC86vF93Gvv4XFq9rrqEx3GDe9DEs4Y37Re87H9nZm4vvDSFe4XNLfuQPl1p0fI1tHTVevPMyFF1BIJ7f103HgIQAtDWprwLwGq6Gk7t8jh6n11o8tvY85NknOwF478z75xua8OFzL9rp7alIM9Ze/8KCStnlT6kTzeavnBFzmplVp1w6CKz3EitCFx6dH/639c+ig3zFN7765IcBCAEoK09eReAj8z8pGpuMuA9VcN270JT3llm2y8VnZ9nxbwP7vE3F1eNbVR0h2bUOLabMScMonc/XU23Pot9xVLs7O3lv6DHl1kes++udM+/PpAWg3QhAmoc4xtXDrphcuxKRnjvryuQEIAQgLa25F0AVpMH0LYzqiX/rxtPwsI2qqXH7ds5+qh+dNmoAfTM7CV08QNv0JYt9mVWegkXH9WXDuu383ZxKVWsSo5TWa0eeJu+D3r1uJyfPfSW6DCV63AwEIAQgDZ2zHm9C0A+BHLYzVNoad267UJj2FbeVX4sh+hJujoxetnI/nTJyAGlBxbBNvRkkCILAvzxrFvbQD+6d4aXx7Vr3ZLWWV7b56ViFoXqAhDz+1fU/dl8sKJcdx2z5++MA/egVWsb6K5pi8Q9pOsPcUGNCSEAIQBNbSac3rsA5AdyYNwL752RWwF47L496Ok5S21ZVnT+//edoTTp7U/pqdnpOXVs24q+/7Xe9LV+3emQvXZqOgSRZ9uo6E4tQOPU8tk/f3IUHfmrqc6v1FOb9EcN6kHT319Of3ntI3p45uICkNFXUedx4nHZl6DW1654KTig9/e/tic9+OpHqQ4B6frDlAgEIASgqc2URQDyQ03DXaiX7dZnF5BvDx3f4jBx6nu2LHOZ/7Thu9HhA3am5+Z9Rg9ZfNh2bN+K1m/c4uy0Ku9Luunb+5WCIvOHaOyjc1INqrmEXuBKtWhBuVpe5Xefg2d3ad/W+XIlh+m44+wDShMSFai3ErzSkj1nqp1L6nAloeR1Zab/cUSfyCDvkvw+AkJDAEIASmwvKU0mHkAebGpvmmJ8/+l95x9Mq9dv2O5aLdtGq/xqoDyvtjdd/+Q8V8Xmqhz1Ae3Urg2d/Tv/1/LxR3WHmjbivlb7AdlGJk5ZQOMnv2vMr1vHtrSivsE4X9Ez+Ah0PWLgzjRl3ue5QaMC6f7isTl0t8Fym0kDwqE6iuwZk546xf5buYUw0//vzP3phiffTu2B7tqhDb3m+EYQCEAIQLkVR6fMRACmHWzYC3jTqfsRL8/whuXPVq8j3sD88vvLnZ0CrPR4aMElND6p5jv22/m1velnJwwqLadddO/rVKeJ8adO0ikPTNQ9ujoj79C2Ja1pyM+NH7r65vV37rsRA3fN1f3dvG+qpnVL70uVaqLEHmn+8yk4ffa/NO5cNUVncMF7zAn7WN/djSVgFz3RvAz3F+y5r2OeS8xEANoMNsGBmb1ELASXrlpHVz/8FtWvL/Ydw76XtoOG53sTvXqW8tiYiP7wwKj6edLcpd68Pnl+KctVNz6g88ArvL8pP8uClxzdj/782sepPS8mLINeGhP7lTyDL4PwfcaE373RI/qJ7p113T4JgyKn+d4he9C90z+0agIOgVjhi8wMAWjHNBMBaDPYKA8Wx/8a98TcTD4EdkjluVVcs//7t1n0pWcxqwafrfvt5nr7yCvBvn7jZnGMPw7x8Z9H96fXP1jZ5OU9qE+3pkMiV/79Le+eS3mvlT8lM+Zl7+WOlr25PPaEr1yzofyNC9WARVmW9VKn1NNuW4kDePKQnvTIm0u88ZXs+ws+vBL2OnqDGVFwp3atrW8sggfQfY9BANoxzUQAuh5M7Zosz71DTUtq3aqVF/HBhzNq+3Uv7V0b98Tb8kqlTBkcfJSHjQMx3/ey3aw2qjosJi7+ej+6/kl5u1q2INociO0WXMricA8crqLaroxL6mq+gYBPI366yj68Eg+iXXA1XAl3l/at6fazD6BlX66nRcvqafxk+4DTvJXlyAE70yOz/J8uNhEZeY/OEGf/bVu1pIZNxdnyYSrOpUM89gBiD6DUVuLSZSIA+eFF3lhtC7mc+eMGH+4PaQDTctQ/uJndxwnQcrTJ9TPV/lXbrQQnDulJj3v0Trlud5bl7VDTmho2bqKGTcWIPG26zLh1HJgtPkR1wuAetGnLFnp6zqdZdoPxs47ovxM9P3+5cT7XGaSHctI8FwIQAjCN3QTzZCYA+aETJs9PdcrTtpE2+ZV3hAPFlvMCeK7HJUf3Nzr8Ejf4FGXmr8Tr/z1mb7rsz7NsurEi8yrhx16rurUbU7cxq4NQeQsxkxYYi8LWLVvQF2vzt2TOhxW6d6opHZZT2yh07WQP+8E3TKKVa8xsKOy138nhtgRdnXW/87aSiVMX6JIl/i7dfsBB8m84Zb9SWdc+1nybkvRQTpqKQgBCAKaxm7IJQJvDILYNtc1/9sFfofte/si2mNT5//OofnTJqAGlW1WksbuiBp8ixv9ycQIvNficZ8zz/j2FTk1EVBw1/vdy+NNaEpGrhUNu06UjB5RuJ+HA0XkMQxR8/9W2DxVJISgOeUJos8+WT4+PHNSDDtizq5dg3WleQZvYrrxkf25tH2rYtIluE8SHHbXPLnTeYXuVBDdz/tNLi+iDFWtoz24d6JxDexPfWuLjDwKwegVgbyIaQ0QjiKgHEfHmknuJ6HoiMgmIlqkH0OYwiI8XyKTMw/t3pxfmLzPJ4jTt+O8Oox6d29HkuUsTrx/iTey9u3eM9QCUsw/atGpBG1IspZ37td6lm1qkwjcMvn2bls4CWDvt1BwV1qFNK1qzwc2p+vCSdFCIpAnzkyNMzaqiQhjxP3J0At27mXU7gsL70VlLmr0/PJacedAeJQFrG19RnZ7m9l3y4Btl307AB6QmfHcYnXP3K6mQK27HDt6VnpotX+pmTzr/BUNtwQOYqgvEmar1EMixRPRdInqAiNjPPZiI7iSiPxHR5WJ6GdwFHKzLk28uoYvu93OXp0GbmyXl68nqG/QfvnMO2YP+ZBkGIG0dOV/4Lt6kQxNJs/0ixjfjtp86fDe68wX5vZuK9VXHDyzN4l0v1/HAfsqw3ej2f1bGDTJ8KOmvMz6xMdHt8m71pPSm0SP6NwtNwkuO7CV5eeEK+sdc+QfWaeUcFcbB6lu2bFE6VT/u8Tm0oj5/y8KOmppYDO8jfW0Rh+han8XjtM/o0bmmdLdz3ZoNqbzNLCxY2K6wPBmPPYDarrJKUK0CMAraT4joQiLay4BoZh7Aciw9qj1kPzt+H7rmUR6ct3eO8kz4y/UbYsOwqDKm/PjrtO81Tzc7qWrA2XlS5WU5bvCu1HfnTnRo351K9+ty7Ly4fShcCVd3f/KAz2Fb0nrlTIGEBbA0/7H77kJPz/lMmlyUToW6+WjFWqOTzqLCUyZKexuKsm++a9d1oPCoj18leQC5q1jkup5cpDQBZAsQCHqhbQ9J2YLFKWBbgvH5IQC3sbmOiNgz+NUE3DVExP+pv05E9HFdXR117sxa0N9f1kuP4Y9PnPcxaaAIl2F6n7E/mtElx23mV210tdmfZ9fTrjy6VAm+8ePi+2bk9iPo+ro09grc+O2tG76v+Oub2ptOsrABFU/S1Lsetm8fJ/WDHz+enFx474xUHhkdR2Zw4pAeqbzEurLxu38CPkTatgN8rZrFPeVVHw4jk2Y7ig0JkxA9kudgD2D17gEM20c/Inq9cfmXl4Lj/sYS0TXhH7MQgFkfAAlvgE46PKE20vOVU8EljKj9GywCf/vCQtpSjl3sklHBY5qkU8WuPIseq++s6B9aXArvrBKBgrg+Pz1+EPEkZ/QDM8Re6qhDAtc9MYfmLF7tvJq8VHr5X2c59xjzx/y353yVDuzTLTcHEJzDq4IC1SSGg/0vrbOPbRlEppbp+QDMomVr6NbJ73qZhOi6yTREj648CMDKE4A3sWNB0/H7ENG8QJrdiOifRPQcEV2gyVs2D+CEye86Caqqeyn4sMbXB+zc7PSV1Pt43wUHU8sWLba7jSL8zLUNm+igGzgwsX7voK6+Rfo9bkOzxHOkZuOme3I4n8tbL6J471DTim46ZQiNfvANbXdwfTicSTBotTaT5wRqSZrvsX185ic0+sGZ2id27dCarv/WfnT8kF6lGJ3hbQPaAgwT2JzK1D3q198bTtUcK9KH90zH3NXvvIR+29nDS9tX+D5wFaKKyw/OsVUbO7RtRWsEe7aD9VPCqxzbkIL1gAfQldVsK6fSloB3JqKdNJjeD5z07dUo/KYT0fdTRDnIZA/g1ptAns10g3BQrEi9j7oZWvBwhboloMiDr8nryKFYvl/bZ7t7RiWDKh9YmXjmcGrZkkpLgOHBPa4e6uW+7azhpWsAXXsG1HPV9V/88fnp39/K9Ooxkz5I4tSjSzt68YoRpdOoZ97Jw4H+j/mq0Cy+Hdou4rJFtUgtMRcxVuQPDu9DIwbuSkvr1tLz735OD81Md1MIH5D6e+MBHt/9qLcqWYq41QTOHTUhUeP5qEE9aOKUBfTb598THd7j8pTwkjoCZC2Qp8IeQDkr05SVJgBN2s+ev6mNS7/fI6I07qhMBGA5XrzgACP1DiTN0KIGJd5Tt2XLFqsgvCYdXq604XAXwVhiUsGh2JrcPMCBZa8/ZTCxZ8tX8GoVwoK9D/z30Buf0GX/q/egueiL8Elu2zKZMffNJQIPoHqW6zqE26A+frd8Zyid/buXbZsYmz9NrEgO7s4nRbP+Y+Ys/njZ3oX39b9PG0Id27WOPPx10tCe9NvnF4onXb5YJEUtiHpmcLLdvWNNaa2Pr+dTAa4fnbVY9J6yh/H1MaNKE1epI8AHA/ZS8zjm8g9LwJW3BCy1DxZ/vOT7ARH9e0j8LZUWQhmFgSnXi6c+PnzC8chfTY31IOlmaHHiw8T717FtS6pvyP5jY2ALkUnV8iL/GHW6+LjBPURxxILe1YdmfCy62WP86UPplOG7N9XLRDxK2h1cOlXpfU1WmoTQaUNpWf3WDxkHzuWT1E/NXkJ/fIlfZbs/ZszlSj2Adk/T5w5OwjZv3kIX3a9fYteXGp3ioiP70h3/fE+8t4uD83I4miz/vjFoFzq4z05N21NcTWpY/J5/+F6lIMQ8IQsHezYRmed+bU/avWuH0unmax6bS1+uN7sdJIone9gv/Hq/kq0H68Zpo+obLCOq7rwl5OA+XUUx+pR3n8t0+W7z5L9d6+aHS+JsKTzJdGVzEIDVKwB5uff3MYZk4hWtWA9gkA17RjjgadTyY9JSBJchWeKUvNAcLZ83qodFVJIHxkRgSupgmoZP+449aV/avJki4zea1C/oXZUOxFEeWf5oH3LjZOt4a3H7GVV/xy03p9kDqLMxKQ9d//E+u0P36k4//sss+nSV2430umfz7+GYmsFlO5MbbCTPyksak3cgOAlyNa4wBw4Sf8r+7BOI/wtvX3nglQ8TD7xNW7DMiceWhdJN395vO+9XnLD71rBexMu8fKuG7anxsPByyZw9elzPe6YtpHFPvK01R9f7//iBEIDVKwC1BidM4F0A8ks3/b3ldPH95QsVogbepL0lce55Vx9nNQCEZ+nKC8SDXfhKKf6A8hLObxqXcIR9Gpns0D470UsLzS5H50MxdWsa6OIH3og99awTRFHeVclArJad1dJs2CtgspdQ5eV9aP133UF7T2rSRnQuK+5KMyUGwuF2dLcB6ESnab/zXbUuPDemz1XpwwGgXb1DaevjOp+yabXsLI2FmWYSJKl7GnGRFCyen3nLM+9Y36XL5URNfiSeTxXIOXirhoSFShPl3effJAfWdM8JehWlq1u6/eW6Z0b9DgEIAZjGboJ5vApAk6UH24Yk5Q8OkLqBL1yO9AWPe75ueTmYL65utieoeSZcI1yuCNaHvZZ3TZPfvhH2hiR5vnQxFVVokziuaWxL+qHkfuCN5r+ftrBZfEPdlWZBj5duaSvcrjjRafNeSLxTPvYAhvvd9h2yYeA6b7htbCv/WrCM/u3uVxKXn5nzvHHHNd0L64pJ0kTJpu23PDOPJgruwZU8IzgGcnrf3mDdhOvCe1+np2ab7JTa1koWpv99+rCm/Yibt2wReUqlY4+Ep0oDAQgBaGIvUWm9CUDJLI8rxOJk5ZoNpZli1LF/mwaaiK+457jwXthuALb9WFx6dH+69dn5xihV30gyslh8cnbz+3p1y6xJnhPJh00JZj5FycswK+sbIj/CJnYQedgn5kqzKMHOrEzFn+Ib9ewObVvSGo97Rw/Yc0d6/YMvJF1slCbIXHpQyOgBZUocZdPSMcK1BzDOy5UGTdiWN27cTOf8Pt1dunHP5/bzn689quzhP3SvnbY7MBJeRbBZ3g5793VXzpmMPab9BgEIAWhqM+H0XgSgZIkvGP8p7voytcSSJvyHbt+VFJxueY6f06VDm2YXgIfLthWA0g9MVJvYkzaoVxejk6HcJtPYezy4874difiRtof7v3unGu2SLbdbt2x7R8IpPPXxmzx3aaTHU2pLabYYhPss+CFe+PmXdOuzfNW3vz/fV5kpu2CvT9K+yq4d24j2dbZv05JOO+ArtHrdhtKWiSz+4uxQ9ZX0EI/LPYBqf66Lk6VRdstXZK5at8E45l5Sf3D7+c/klLpJ/55X27vk2QtOLKMEO/fbAddNShyzpc8NOi5MVkCk5SelgwCEALS1Iy8CUPqBlyzNSj2JpmEGTMDpgpMmXbHmYgaoE6FRbeHgxr88dUgp0K+0P7gcJXbOre0tOt3Lebj9r1+9NdSC5C+NRzO8ryzqOWkEmHQpWdePSSfFua5JAjSqLdznB14/SSSKJMzLlYa9MpeNGtC0oZ/rEfb087/ddtb+JS+udD9dmvawGOCwTZ+uWi86LZzU51K7CdYzvAyo2wYR10aO+3dYv+7Uo0v70qRL+t7FvTNR1/NJtg+Y9gHfyDFv6SrRoQnTsuPSx03eJkyeT+Mnv+vkMcoJED4VrFuKtn04BCAEoK0NeRGA0g88z9h+/s19tW2QvqwmHiPtQ0MJogZ8jlN3ziF7ipZXbfeASPeIRQklEwGpBi1p7ETGdNnIAXTJyP5ipCaCNFxo3KlClc5kj6d0cpH0EeffdB5vnXiMAmfDSNoRJt4/G0GgbIrrFRVK6JpvDvIa6zEoArgOkgNESV5fU7uJ6n+dzcT1YfgmDBuRoasD15vft7atWtCnqxuaqsTex5OH9aJHZy0RCfY4gSS1U0k6XTQFFShdiWXpN0rybJUmeOWcildoI851z4YAhADU2Yjudy8C0OTjxSeqRo/onziLlb6sPk5aBQE++eZiuvqR2c28MtKPaLhuJkJF1SHOw3XGgXtQ7+4dEpdKdV5MFuMq/AIPWly/2pumNLtEPcqYdmzfml4f8w0jL4SJII16pou9T7qPX9yLE2VjUns3mQRIbV73gif9zp6kvzXeIJGUjt/RB1/9qNnHXrf3KVheUEyxjSVtE4iycduDKlvvmd2HunasKcWh41t8wmFQpCsIpnYMY0sBAAAgAElEQVQTdWiE28/70CZOlS/vs0f/y/Xbx/qXbk+wmWTEXZEZDi0zfvJ8L3u5k2zTZGLieg9muF6+vz/h50EAQgDajP+c14sANN1jwftNxp601QtgM1D59gBGLZVIOyA4+KRZqlTPSSMckwQkezF5Nh8Uf8H0P2q8ui2unWn3N0o9mnHPlRwSSeobqWgLlxEMAaF+k4o1kw9E2vpJ7VGSLui54vRh4abitPFvuivITLygQRtftnq98ZIh20ZwUsSHg/gqweDyMo85Zx60beKkwjGFgyiHOZn2i+7kuK4f/u3QPemYfXvQj/88M/YqzbRs53/6pUiESu02ei9hTem2lbThXHR8mO/xg3uIohVE7cFMs788rk4mEzxduyS/QwBCAErsJClNLgQgVzDJqyPxGEln8GmAmc76w96P4PKD671ipu0JHnh4aOYnzbyZUctJXN8r//7WdgO4bilWIljT7KMKtjfOMyFhIhVtUWWFRa9UFJh8IGxsTtJ+XRrlWbp05IBE77JpH/KewNp+3cV716T9dPFRfWnArp2284K7ft+k9WHhdtzgnk3tNF02Vv1jcnJWZ1+mfRWsw6F9d4q9aSRoS+EJqjRMis4e1TeCx9JbArfpqINnkpPF4fvMbSehwTqHw/xI2mObBgIQAtDWhrwIQOkHMUkohRtm+rLaLI3YzvpVflWH284aTl07ti1d+s4b3VfUb9tPY8LAtrNVftOPIg/q099fXjpMwr4evm3ikL47aZd9JZ7O4Afjs1Xr6fon9VH1VTu6tG/d7B5mk5ORaWw0+BF68YoRTe3XTVBMPDTBPk4rGlzYCYcAYq9e0HOTFNZn/CQOHPye+NHSvWvSfurWsQ3dcErzGyckItrUkyytT/iAm2Q7RdxY8Pibi0UnZ5M8dWlsSdktX6V5x3McF3NRbFzMuI6XCmaVX90mY3KiVvf+BesWtru0ojiqvToBLn45hAkhACEAhaYSm8yLAHzojU9EF3WbvkSm+4PSfnjD9ZIOYuH9gOomD+lm6fCMO67XbJaBdR9FV8xMRSanH/voXO2eQ4nBS5aleT+nzd204cE+aY8l11l3CjiuT0se2L+91ezDG8eA72U+dnAPWrRsjbMTjuFnBT31Nku10gmaycc9vIqQRqzp7EtXn6j3xzSQe5iNbTtMt+QEJ7AXHN6HHnjlo8ibZSR9KK170DMcFxZMHRaK6iOpgyCqzkE77r5DDb38/nL6nykLtNsawvWQLpXrbEz6OwQgBKDUVuLSeRGAd73wvvG+HVVB3UuU5qNjOzOTDmLhU2Ar69fTxfe/4XQgkXjVkoxC2hYbZqYiM413IqmNcWFplO3oPLGSlyrKTtP2jS7frZPeNT5pbio6JG1Wadg7eP23Bm8XtsX0sIZ0smHycQ9ut5BORCV36Qb5mIh9TqvbRxtmH/ZSpRGdwTLT2sKQ3TvTmx+vSjQNXR+mrXuaSa7Um6erMzc4zQTRZsw0ef9UWghACMA0dhPM40UAPjTjY7rsz7NS1c3kJZJ65nSiUlfRNIOYTgQlPTOOgalXLeoZWTAzEZm8h8fH1VAsxmv7d29CIP046GxB/R7XR9IPV3AvZtR1e8HtA794fE7sAQBVn/BSJpdvuuwobbvrdJJ3nvvvZw/xCfzo7RPBOqnypBPRcw7Zg77au5so4Lh6jk60czrTMWD0UX2ptt/OkfsjTURnkEXJ+zduksiDbNOvSX2Ytu5p6sPtvWfaQpEDIlzn8LvLE3hJbEqJoEzTFl0eCEAIQJ2N6H73IgClAiBq5hvcW6WrvPQ5UYOT9EMdHPCj4ofFLYNI6xZsY9JAovuYSAchab0kH+W4/jERmRwvS7KBWz0rLhxGuC78Mb38mIGlf3btYTTdNxaum1SMcp9Kb2SJisUo9Zzp3jPT3009gboJmnpXn3hrMd07/UNtdVR5aSai0r2JSuAl7Y2VvmtclsSmJKIzDMekDlqwCQl0fZim7mnrYzL+nDxst6YxIipG5ZgTBpX2b/Oy9N3TFkWGueECdFs80rYlKR8EIASgrV15EYA6sRJX6dvPGk7HD4kOBROVJ41nTgmCpIC0cfUzGcSkg5B6lm4/jXQg1wm3tMxMDE0auJvrymE3JFdDqVOVL8z/nG5/Tn/YgPcUXX7M3sZeGEk7bz9r/9INK2n+XItRVYe4D7BUbHI5JjHVdG3nE5cr1zSIDobovEfhd1X3bFWe9J0Jlhd8D9PELAwKSJMxQLJvVYnOcDge/ve42IomddBxTfpdMu5Mf285vfT+spKl8aniQ/bSHyRLUydpv6s6S1dWTMb/NPU2zQMBCAFoajPh9F4EoBJZpnHzdIOIqnzQe8cb3m9tvNIn6oqp8MxM+rLHgZV6DqWDkHqOzvMgHch1M/Fg3/D/jmKmC/2RZHQSgRP0VvKHS+IBVLbxwruf0zl36y+p/9N5B9HhA3Y2ugZP+jJJ7TRcXtqJkaReSXUKLjeHQ/8Ey2YbPP2rX6EJz86XPDIxDdvhiUN6lZb3k+4ADt/QECxUYkth8RYsz4Y3n0Zlb3PwBoxwTL+4K9S4TjzuSG/TMb1JJ8woaTJrOg6l6Xid9zJr4WQyyeX2Jm1BCa+sSMf/NBxN80AAQgCa2kxmAlAJDZOTnVLxEh7weNM//wVDVkQFONZ9EKTLqBLoukGIy+DQFWNO3Jc4KK3uTk/pQC4VJ1GDsknojygGOr7BPMrjoeMU7hO+QeHs372s7QKOEcjx5qTCWVtgIIHETqPKk/ZhOG/HmlZUH3ELBKcztdngB4xPPPIMYFn9+qb9b9KQIzpeYe9K3GQjOEFrVreONfTjv8wSnwqP86CbisikdgX3ZYYDS0cJUQ6fcuSvpsYKYM7DoYumXXm0NqRSVL0kk9kRA3elQ26c7PVO6STvpaSOcRcA6Gws6XfJvkP28KbdL2hTN1d5IQAhAG1tyZsHcJsA1G9gV43QiZekwYQ9WXxLw6q1GyguwLF0Rq6rhxS6ZBAKDn5Js0tToRQn0IJLRcHbD/h6LL7KKfynW5oOppcKnPBtGiacpIJOiTRpnaR9yunS2oe07qouzJ4nNyvXbEisnnT5UNJGF7zCp7AlHiCTpeqodiR50G3LDos76b5MtpO6tQ2Rdw+bvFdx77LOc8X9UNO6pfYAkcQuotLwNZA3nTok9gYn3YTQdPJiWs8ku+OyTLYWpJ30mdbZJD0EIASgib1EpfUmAE1m3pKBQDKY6D6WXx/QnZ57l/egJP+5fNmjBiGe9W+9hqpjk+dFEvvKRCiFW5g0GPJMWPcxSVqqU8+SChybECpSgaJEmk44c92VJ3aXTjWlK7c+XbU+MnSPxE6TLEtady5DCYQuHdokXqMVF/JGZ+Nxvz/55hK66P4ZabOX8rEn+bWrRzXzaiVNbkzGinDFwjduxFU8+HzTgONpYSg7lwhg02eY2JJp2Tw+8fWQv31+YWwIqxP361kaw4LeY75DPPgnrWPaCZWkXVF2p64w1F1fGCzfZx0l7YhKAwEIAZjWdlQ+LwJQJ9aClZbOhKWDiS0Qzu/6ZQ/vWdx6Ef26pqryRzzqrswoNmk+JrplmEtH9o/0/oVZ6rhI+8gmhIpO0EWJNBPhbJLW1NZ0dQ+Wp+6zHd+4vzXpWbp+kdbT5L3VlRl1Z3JUHttnpmn7tPnL6Oy79NsIdG3U/R6sm+u9Y9LJlq6OUb+r7RNRYw1Plk4dvhs9/ubSZncrR3lgpXV0OeHWtdfU3mwnfbr62PwOAQgBaGM/nNeLAJQKAa6A7vCDaqB0MLEB4vtlT+Pp4Drt2rmG/vv0YbTsy617taQX1zML3YDH5Xdp30YUJ0w3UOsEjiu+aUSaiXA2SWtqb0l1Z4/EebW9iT2yvCdUuh9P1y/SOpq8t5IyJUvTaZ9pY0suxhIWQivrN3jxFEvYpuUmKTtoT2HhGhfcPmqyKq1jGhEvaUdUGmmdOK/UOZG2Lrb5IAAhAG1tyIsAlA6wHKvtslF7izZAm7y4aaD4ftl1QsykzlLRzGW65CYZqNOIM5O2q7RpRJqJF8YkrWn9pXWX9p2kXyR1lL63krLU5E4X1zPNM23fVSnXuHby+3fikB505wuLIpNw/XzHhdNNtqR9FJUuyUNvslVEOuaZhv+yaZuJvZmMszZ1SpsXAhACMK3tqHxeBKB0gDX5cPkc8NTHKumuSVvQUiaS55h8AKUDHt9jXLfWjUdDKnAkbU1K41Ok2dZNl19Sd53N23jBouonjd/IhyAkN3LwM3TveJr3wvbDLBUmcX04atAuNHnuZ7H74354RB/66fGDdCZg/XvcZCttwTp7kvZVsM8lV6rpwshI2yN5p6Rt4DiW36/tI3JOSOvnOh0EIASgrU15EYC+Plw67xJvmK9bEy1i4kBJN5HbgpYKMelzdIO1Kkc64HEsMpN4irp6SgZjXRmV+LspF53Nu/I0cb2kV8f94PA+dOcLC0Xdo1uelowV4S0QupBJkoql2Y4hKVdNJnWeT2lZunRxk621GzYZjYWSSaV0DAv2uXT80U0U0nIIT+ol9iY58KarTxa/QwBCANramRcByJXy9eHSHe2Puq4tCZLtwCPtAOlAKC1PpdPV32TAk5xENq0f0m8jkNYzmjafCXsT+zQJGK2zT59jha79LsPDhJ8labeuftLfk066chnhYO/8/4cPnkm8qlIbCbY9jWiUtlul0x1yi7sMIIoN/5urSZVpO0zTQwBCAJraTDi9NwGoBvakKPWm3hBV+aR80kFd6kGzBRysc9KtCGmfo/OwcLk3PjmXfvN8tMcmvF8pbZ+krX8582XZVtOPVJiL77pKP9SqXnxSlEPmLF21PrILTd+vLERuVEUV16V1a+n1D1bQvS9/5MQkJe+lkwclFKIL/RR3fVxckSaTSRUSJo1oNOGiW86Ps8Ny2ZtJ23RpIQAhAHU2ovvdqwDkh8d9uHy+gOqZebvAW3cCNC4cTFIn6sJt6Ja6stqvpDPErH/3aX9R4s1k83zWLPh50g+1qhsLHA4yHOVxlywnJokxvh+aT7u7WOo1YWkqgpPKztIDmFQP1xMH05WdNKLRpM+kdhvVH67ZmNTbRVoIQAhAWzvyLgCjKmjrDTFpdJYfekm9pLPy7o1XYX26al3sZnP1vLhwG7rZMed3tQFb0va8pMnS/kzEVTlFg8RWgv0XvOotycuflz6X1EMqJpLKMvV8SuqVtzSmY6qpaDRpr1S058Eja9IuSVoIQAhAiZ0kpclcAOo+ND4G0LzN9KT10XnvuGOTeEk/aOUUHrYGbJq/HPZXlI8U29uP7k2+BSTK3qT2bNpXWafX2YauPmk9n7py8/i7aZ+bikZpm6VjHJ/q7d6ppiyeZWlbTNNBAEIAmtpMOH3mAlD6wlaTKEnqRGlojiheeRAeph8KW4PW5S+H/ZXjmToOcb/zh/rKv78lvpkm7XPymk866fqPI/rQIzMXN9sDyVeojT1p39i7cfPa5qzq5WMs0C0xc9v4hrrNgZMwkgMvWTGxeQ4EIASgjf1w3swFYB5EiS20LPPb8Cq38PA167fhb8Mz7XN1HykfXu+0deV8XN+JUxbQ76ctbHZDTKV8OHVskg6SKQZcxthH5za70rFH53Y09qRBEIA6wI5/j1tijntMpXhqIQAhAG1fpcwFYLlFiS2wrPPb8Cqn8Mh6n520X2x4Sp+hRFTwlOXK+ga6+P6ty6vhsBz8b3kMPeHDY2PCsJxpg6eDOeh1tx1qiAUeH0zhw2VJS+WSK/DK2bZKfHaUaA97/oLtztukK02fQABWtwB8lIiGEdEuRLSSiCYT0RVEtNjAmDIXgOUUJQZcYk8vm5ThIq0tL58bsOPap9tLVc7B15anpE/jPJ8nDe1Jj85aQkvq1jUVUy1eNQm3IqRh+zngukmRS+Sq/l07tKHXrh6V61sksmCd9QQi+Lxlq9fTuCfe1jazyFuNIACrWwBextEbiGgJEe1GRLc0WvvXtFa/LUHmApAfXQ5RYsCkVL88nWy05ZV1e7Lyspn0aTCtLc+k5+o8n7edtT917VhD5Qp1kpYZ8m0lMG3BMjr7dy9rcXCcxNp+3bXpKjVB1mNOmGM5tnpk3ZcQgNUtAMP2dhIRPUxENUS0QWiMZRGASgTmSWQpXroPeLmW6mwH1Cxn40UYfG15Rr1fefZ8CscDJNMQuOWZd2ji1AVaTqOP6keXH7O3Nl0lJsjDGJr3SaiLfocAhABUdtSNtxE1egIPSzAuFof8n/rrREQf19XVUefOrAWz/ctSlEhalvcPeN54xTEtyuDrmmdR2i15F5AmmsAtz8yjiVPf0+IZfVRfuvyYgdp0lZYgL2NoFls9yt13EIAQgDcT0Wgi6kBE04noRCJanmCYY4nomvDv5RKA5X6Bws/HB9xNj1TD4BtFqgieTzc9XL2lTJu/jM6+S7AEfP7BVNvfbgnY9QQli17L0xjqc6tHFix1z4AArDwBeFPjQY6kvt+HiOY1JuARhr1/ezYKu7pGERg8aBgsK1ceQJ2BZ/07PuDuiFf64BtFKk8fP3c9iZKCBCSHQPhKx9ctD4H42KKQRU/mbQwtKkdJX0EAVp4A3JmIdtJ0/vtE1BCRZnci4pvM+RAIHw6R/JVtD6CkclmnqbYPuG8PQyUPvlG2Wa2ez6zf0zTPc2nruhtTzq/tTSMH9Uh9l3Ee9tClYcx58jiGuuz7tFx85IMArDwBaGMnexDRB0R0FBE9JywIAjAAqpo+4FmJs0odfOPer2r0fArHGutkaW3Jh61zmWMfndPsJhAXN07kZQ9d2s6qpjE0LSNX+SAAq1cAHkxEBxLRi40xAPsS0Tgi2pWI9iWi9UIjgwAMgaqGD3iRPQxCuy5rMh+Co6wNysHD0zL1aetKkHJg6LunLdqOUpobJ/LoQTPt/moYQ02Z+EgPAVi9AnA/IppAREOJqGNjLMCnieg6IvrEwNggACNgpf3YGHAvW9KiexjKBs7wwWm9VYaPcZo8r3VOK+KysHXXz8jbHrq0BlbJY2haJq7zQQBWrwB0ZUsQgDEk8/oxtO34SvAw2DJA/u0J5PWDbSOwsrB1189wXV45bb1Sx9ByMg0+GwIQAtDWFiEAbQkWLH+leBgKhj3X1U3rYcuiUTaCKAtbd/2MPO+hg6DLwuLlz4AAhACUW0t0SghAW4IFy2/zQS1YU1FdAQEbD5ugeOskNgIrC1v38Yw87qHLq4fY2sAKXAAEIASgrflCANoSLFj+PHsYCoayIqrrQ8C4BGNTvyxs3dcz8iS48uwhdmlrRSsLAhAC0NZmIQBtCRYwfx49DAXEWBFVtvGwZQHAVmBlYeu+npGHJde8e4izsMG8PgMCEALQ1jYhAG0JFjR/njwMBUVYEdW28bBlBcBWYPm2dRZJE6csoN9PW0hfrN3QhKVnl3Z0zTcH0bGDe2aFyvlzimAfzhtdkAIhACEAbU0VAtCWYET+PMzcJc0qSj0lbUGadARsPWzpnmqey1bE+bL1qHrt2L4NnVvbm0aP6E+tODp0gf/y7iEuMFrrqkMAQgDaGhEEoC3BUH7bD5Xj6qA4ENASsPWwaR/gKIEvEZe2etWwNw4ewLTW4T8fBCAEoK2VQQDaEgzkr4YPgkNcKCpHBDBxMeuMatkbVxQPsVnvVUZqCEAIQFtLzqUAzNtMXwK5Wj4IEhZIU0wCad67NHmKSad5ravJM1YUD3El2JVJGyAAIQBN7CUqbe4EYFE9EdX0QbA1OuSvDAJFfVdd0K+2vXHV3Ncu7MVHGRCAEIC2dpUrAVjkJdRq+yDYGh7yF5tAkd9VF+SLMuFz6aF1WZaLPqj2MiAAIQBt34HcCMCiL6EW5YNgazC+8uPj4ous+3KL/q66IFKEvXHw2rno6fyWAQEIAWhrnbkRgEUXUEX4INgai6/8+FD5Iuun3KK/q66o5HlvXLV7aF31cZ7LgQCEALS1z9wIwEpYQs3zB8HWUHzlx4fKF1l/5VbCu+qKTh4nL5XsocVKwTbLhQCEALQdx3IjACvFq5DHD4KtkfjKX8kfKl/M8lBupbyrrljmTZRUav9gbG1usRCAEIC2Y1huBGAlLaHm7YNgayS+8lfqh8oXr7yUW0nval6YuqxHJXposVKwvYVAAEIA2o4buRGA3BAsodp2Z7HyPzTjY7rsz7O0lZ5wxjA6edhu2nRIkB0BvKvZsTZ9UqVNrLBSEG0BEIAQgKZjQzh9rgSgEoHXPjaXltSta6prJVyqbttRlZafBcTPHppNK+obtE174AeH0KF9d9KmQ4JsCWBJLlve0qdVmoe20gSttB916SAAIQB1NqL7PXcCkCuMJVRdtxX797jlnHCrWhBRjy7t6MUrRtD/396dh95S1nEcf+utlMxrGOHWNVusLM2r/VGWZViYVqKWuYRlBbaXEZVZgVbmEqXZZmR7mBYRSWUI0aqplWWREIW23GurLbeirFDjq8+Bc8/9LTPzPTN3Zs57QNzmmXnO63nOnM8888xz12wb/+bWNwG/q31rkbvrM6YR2jE+0p5HrzEAGgCz/aiXATD7oSzfX4HVHudM1zwi30UnHcjh++7W3w9kzRToqcBYRmgdAVy6gxkADYDZS48BMCto+VoCVS/mO+9wT84+Zj/DXy1dd1Zgc4ExjNCO7ZH2vPqoAdAAmO1LBsCsoOVrCVR9nHPB8es55gBf/KiF684KjFRgTI+059VEBkADYLYvGQCzgpavJVB1BNAXP2qxurMCoxcYyyPteTWUAdAAmO1LBsCsoOVrCfg4pxaXOyugwJTAGB5pz6tBDYAGwGxfMgBmBS1fW8DHObXJLKCAAgpsJmAANABmvxIGwKyg5RsJ+DinEZuFFFBAgbsEDIAGwOxXwQCYFbR8YwEf5zSms6ACCiy4gAHQAJj9ChgAs4KWV0ABBRRQoGMBA6ABMNvlDIBZQcsroIACCijQsYAB0ACY7XIGwKyg5RVQQAEFFOhYwABoAMx2OQNgVtDyCiiggAIKdCxgADQARpfbDrgO2B84ALihRj80ANbAclcFFFBAgeEIjPlFMwOgATC+iRcCewNHGACHc2GypgoooIAC7QmMfakpA6ABMELf+cCzgRsNgO1dTDyyAgoooMAwBCaLzd85U91tyr9fdNKBHL7vbsP4MMvU0gC42AFwF+B64GjgVuCXBsBBf5+tvAIKKKBAUmDyx03+btNtSx4pQuCuO23PVacdypptJ5EwedKtUNwAuLgBMHrtFcDVwFnAXhUDYMwXjL8m247Axk2bNrF2bUwHdFNAAQUUUGC4Atfc9GdOvPjaVT/Apac8joMecr9V9+vrDgbA8QXAc4HTVulw+wCHAccBhwC31wiAZwJnzB7fANjXr7j1UkABBRSoI3D5Dbdw6mWrvwt54QnrOWr9HnUO3at9DYDjC4D3B1a7JbkZ+BxwJDA9xWFNCYOXACcv01MdAezVV9jKKKCAAgrMU8ARwHlq9vtYw32An3PdE5h+Zrs7cCVwbFkSZmPFw7sMTEUod1NAAQWqCox5+ZGqBltrv8kcwN9vum2zEZJJfZwDuLVaZv7nXdQAOCtZdQ7gbDkD4Pz7pEdUQIEFFhj78iNDaNrJW8BR1+nHZL4FPITWq15HA+DdVgbA6n3GPRVQQIFWBBZh+ZFW4Fo46NiDuHMAxzcHsIWvwYqHdASwa3HPp4ACoxRYlOVHhtR4Y34UbwA0AGa/iwbArKDlFVBAAWBRXj6wsfshYAA0AGZ7ogEwK2h5BRRQAFiU5Uds7H4IGAANgNmeaADMClpeAQUUcATQPtCxgAHQAJjtcgbArKDlFVBAgViE9Y47Ofi8rzP25Uds7H4IGAANgNmeaADMClpeAQUUKAKLsPyIjd0PAQOgATDbEw2AWUHLK6CAAlMCY19+xMbuh4AB0ACY7YkGwKyg5RVQQIEZgTEvP2Jj90PAAGgAzPZEA2BW0PIKKKCAAgp0LGAANABmu5wBMCtoeQUUUEABBToWMAAaALNdzgCYFbS8AgoooIACHQsYAA2A2S5nAMwKWl4BBRRQQIGOBQyABsBslzMAZgUtr4ACCiigQMcCBkADYLbLGQCzgpZXQAEFFFCgYwEDoAEw2+UMgFlByyuggAIKKNCxgAHQAJjtcgbArKDlFVBAAQUU6FjAAGgAzHY5A2BW0PIKKKCAAgp0LGAANABmu5wBMCtoeQUUUEABBToWMAAaALNd7q4AuGHDBtaujX90U0ABBRRQQIG+C0QAXLduXVRzJ+Dvfa9vG/Xbpo2DLtAx9wA2LtDn9aMqoIACCigwJoEHALeM6QNV/SwGwKpSS+8XfrsD/8gdZsXSO5aQGZ20zfO0+BF6f2iN228ijds3jjPo3L6zxuMxjrb8LXBn+x+pf2cwAPavTWZrdNdj5kUepu6giTRuH1nj9o3jDDq376yxxu0LdHAGA2AHyMlTeLFJAlYornEFpOQuGicBKxbXuSJUYjeNE3gVi2pcESqzmwEwo9dNWb8I7TtrrHH7At2cwb7cvrPGGrcv0MEZDIAdICdPsR1wOnAO8J/ksSy+tIDG7fcMjds3jjPo3L6zxhq3L9DBGQyAHSB7CgUUUEABBRRQoE8CBsA+tYZ1UUABBRRQQAEFOhAwAHaA7CkUUEABBRRQQIE+CRgA+9Qa1kUBBRRQQAEFFOhAwADYAbKnUEABBRRQQAEF+iRgAOxHa7wCeD2wK/Bj4FXA91ao2nOAtwN7Ab8ATgOu6MdH6W0t6hifAjwf2Ld8muuBN63SJr394B1WrI7xdLVOAC4FLgeO7rC+QzxVXeP7Au8AngXsDPwaeI3Xi1Wbvq5zmL4M2BO4Ffh8Wb3htlXPtHg7PKn83j0G2A04BvjiKgxPBs4HHgVsAM4CPrF4dPP9xAbA+Xo2OdrxwKeAlwLXlYtzBLyHA39c4oCPB75dLi5fBp5bAuCBwE+bVGABytQ1vgS4GvguEBfwCDSZbakAAAbFSURBVNhxkYqLz0L+mZEV+khd48kh4ybmKuBm4C8GwBWl6xrfq/TjuI6cXfruA4G/lRvNCs26kLvUdY5r8MeAF5VrxsNKOLkMeO1CCq78oY8AngDEjfUXKgTAB5Xftg8BHwGeArwHeAZwpb7NBQyAze3mVTJC3/eBV5YDblvucN4HnLvEST4L7AA8c+r/XQvcUELkvOo1puPUNZ797GuAv5Y2irDutqVAE+NwjZuZ+PF8IhCjVY4ALt+76hrHTWU8WXgE8D87bWWBus7vB/YpwWRykncDjwUOrnzWxdwx/gze1UYAzythb/JEJqQiXMf14vDFZJvPpzYAzsex6VHiDv1fwLEzQ+CfLJ37qCUO/JsyFB53QJPtreWHc/+mFRlxuSbGsxzxB4bHKEqMzMaoq9vmAk2No98+uvwAxOMcA+DyPauJcUwLiVHVuMbEteRPwGeA+EG93U68pEAT5xgB/CBwWJkm8mDgK8Cny8ir1MsLVAmAcZP4w/J0bHKkF5ZRwJ3EbS5gAGxuN4+Su5fHMvFY95qpA74TOKTcQc6e57/AyWXO1OT/vRw4A9hlHpUa2TGaGM8SxMX9aeURsHN6tuwgTYxjZCTu4teXOVMGwJW/eE2Mf1bmCceUhujDDy1/fy8Q4dttPn05jvJq4F1A/KbeA4jHlTEn0G1lgSoB8OfAx8ufhjU52tNLyL438G+RmwkYAJu5zatUk4u6AbCefhPj6TO8EXgDEJOQf1Lv1Auzd13jGFENy7hx+WpRMgDOPwDGD+f2QMyhmoz4xZy0eCwck+/d5hMA49oQNzNvKfO4I2hfCFxcXtbTeXkBA+BW7B0GwK2IDzR53OAj4Hpt1sR4cobXlYv6U4Ef1DvtQu1d1zhG/X408xgy5r7Gdkd5AeqmhRJc/cPWNY4jfqvM/Yv+O9liAn48Go4/zzZuJt02F2ji/B0g5mFHsJ5sJwEfBu5T+rTOSwtUCYA+Am6p9xgAW4KtcdiYcBxLvsTSL7HFD2GEvJhYvNxLIDHsfeTUOeJt1RhRiUnfblsK1DWOI8So35vLo9+4uLutLFDHOEalYpRkeotlHWJk8FQgRq4MJ/l+HG/+xvy0mJMWwTq28I232mPU1m1pgTp9OY4Qb7N+rbhOjngi8NHSp51vuXxPqxIAY85qPPLdb+owMZc1ljXyJZDEt9gAmMCbU9FYciBe+nhJCYKxntRx5c29P5QlYmLpkdPL+WK+YNzZx6PJmGgca6jFGnUuA7N8g9Q1jh/It5Ufz1gOZrL9E4i/3LYUqGs8ewQfAa/eq+oarwNuLNeXWFVg7/LGdcwBjLUB3ZYWqOt8Zlnu5cVTj4AvKsEwjuW2uUCMik5uAONJQExL+EZ5YSkGP84B9ihrsUbJyTIwHyj991Ag+rDLwCR7lgEwCTin4rEEzGQh6FjOJSYUx11obN8EfgW8YOpc8TZqjJhMFoKO0SoXgl65MeoYh3eslza7xcT5uNi7LS1Qx9gA2KwX1TU+CLigvGwTN5IxKuVbwKvb13GOlz7iacHzSnCJt62/VP5brLnotrlAzJmMwDe7xUBI/M7FzWD8tsV+ky3+OfrxI4GNZW6lC0Ene5YBMAlocQUUUEABBRRQYGgCBsChtZj1VUABBRRQQAEFkgIGwCSgxRVQQAEFFFBAgaEJGACH1mLWVwEFFFBAAQUUSAoYAJOAFldAAQUUUEABBYYmYAAcWotZXwUUUEABBRRQIClgAEwCWlwBBRRQQAEFFBiagAFwaC1mfRVQQAEFFFBAgaSAATAJaHEFFFBAAQUUUGBoAgbAobWY9VVAAQUUUEABBZICBsAkoMUVUEABBRRQQIGhCRgAh9Zi1lcBBRRQQAEFFEgKGACTgBZXQAEFFFBAAQWGJmAAHFqLWV8FFFBAAQUUUCApYABMAlpcAQUUUEABBRQYmoABcGgtZn0VUEABBRRQQIGkgAEwCWhxBRRQQAEFFFBgaAIGwKG1mPVVQAEFFFBAAQWSAgbAJKDFFVBAAQUUUECBoQkYAIfWYtZXAQUUUEABBRRIChgAk4AWV0ABBRRQQAEFhiZgABxai1lfBRRQQAEFFFAgKWAATAJaXAEFFFBAAQUUGJqAAXBoLWZ9FVBAAQUUUECBpIABMAlocQUUUEABBRRQYGgCBsChtZj1VUABBRRQQAEFkgIGwCSgxRVQQAEFFFBAgaEJGACH1mLWVwEFFFBAAQUUSAoYAJOAFldAAQUUUEABBYYmYAAcWotZXwUUUEABBRRQIClgAEwCWlwBBRRQQAEFFBiagAFwaC1mfRVQQAEFFFBAgaTA/wHA2Fv6Wm7xdQAAAABJRU5ErkJggg==\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7febd1669e10>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plt.figure()\n",
    "Y = np.random.normal(loc=0.0, scale=1.0, size=10000)\n",
    "X = np.random.random(size=10000)\n",
    "plt.scatter(X,Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": 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"
    }
   ],
   "source": [
    "# use gridspec to partition the figure into subplots\n",
    "import matplotlib.gridspec as gridspec\n",
    "\n",
    "plt.figure()\n",
    "gspec = gridspec.GridSpec(3, 3)\n",
    "\n",
    "# Grid positions 00, 01, 10, 11. Colons determine how you want to fill each space.\n",
    "top_histogram = plt.subplot(gspec[0, 1:])\n",
    "side_histogram = plt.subplot(gspec[1:, 0])\n",
    "lower_right = plt.subplot(gspec[1:, 1:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "Y = np.random.normal(loc=0.0, scale=1.0, size=10000)\n",
    "X = np.random.random(size=10000)\n",
    "lower_right.scatter(X, Y)\n",
    "top_histogram.hist(X, bins=100)\n",
    "s = side_histogram.hist(Y, bins=100, orientation='horizontal')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# clear the histograms and plot normed histograms\n",
    "top_histogram.clear()\n",
    "top_histogram.hist(X, bins=100, normed=True)\n",
    "side_histogram.clear()\n",
    "side_histogram.hist(Y, bins=100, orientation='horizontal', normed=True)\n",
    "# flip the side histogram's x axis\n",
    "side_histogram.invert_xaxis()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# change axes limits\n",
    "for ax in [top_histogram, lower_right]:\n",
    "    ax.set_xlim(0, 1)\n",
    "for ax in [side_histogram, lower_right]:\n",
    "    ax.set_ylim(-5, 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src='http://educationxpress.mit.edu/sites/default/files/journal/WP1-Fig13.jpg' />"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%HTML\n",
    "<img src='http://educationxpress.mit.edu/sites/default/files/journal/WP1-Fig13.jpg' />"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Box and Whisker Plots"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "normal_sample = np.random.normal(loc=0.0, scale=1.0, size=10000)\n",
    "random_sample = np.random.random(size=10000)\n",
    "gamma_sample = np.random.gamma(2, size=10000)\n",
    "\n",
    "df = pd.DataFrame({'normal': normal_sample, \n",
    "                   'random': random_sample, \n",
    "                   'gamma': gamma_sample})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>gamma</th>\n",
       "      <th>normal</th>\n",
       "      <th>random</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>10000.000000</td>\n",
       "      <td>10000.000000</td>\n",
       "      <td>10000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.006490</td>\n",
       "      <td>0.008564</td>\n",
       "      <td>0.498081</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>1.402464</td>\n",
       "      <td>0.987082</td>\n",
       "      <td>0.288909</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.010057</td>\n",
       "      <td>-3.749408</td>\n",
       "      <td>0.000248</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>0.979564</td>\n",
       "      <td>-0.657294</td>\n",
       "      <td>0.245444</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>1.705771</td>\n",
       "      <td>0.013892</td>\n",
       "      <td>0.495934</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>2.694594</td>\n",
       "      <td>0.687385</td>\n",
       "      <td>0.748506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>12.754745</td>\n",
       "      <td>3.490559</td>\n",
       "      <td>0.999988</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              gamma        normal        random\n",
       "count  10000.000000  10000.000000  10000.000000\n",
       "mean       2.006490      0.008564      0.498081\n",
       "std        1.402464      0.987082      0.288909\n",
       "min        0.010057     -3.749408      0.000248\n",
       "25%        0.979564     -0.657294      0.245444\n",
       "50%        1.705771      0.013892      0.495934\n",
       "75%        2.694594      0.687385      0.748506\n",
       "max       12.754745      3.490559      0.999988"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\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"
    }
   ],
   "source": [
    "# Whiskers are the end points and show the range (lowest and highest point) of all the data.\n",
    "# The line in the middle of the box is the overeall median.\n",
    "# The ends of the box are the medians of those sections. For example. the top of the box is the median of the data in between the overall median and the largest data point.\n",
    "# Therefore the data is split into 4 sections, or 'quartiles'.\n",
    "\n",
    "plt.figure()\n",
    "# create a boxplot of the normal data, assign the output to a variable to supress output\n",
    "_ = plt.boxplot(df['normal'], whis='range')\n",
    "\n",
    "# whis : float, sequence, or string (default = 1.5)\n",
    "# As a float, determines the reach of the whiskers to the beyond the first and third quartiles.\n",
    "# In other words, where IQR is the interquartile range (Q3-Q1), the upper whisker will extend to last datum less than Q3 + whis*IQR).\n",
    "# Similarly, the lower whisker will extend to the first datum greater than Q1 - whis*IQR.\n",
    "# Beyond the whiskers, data are considered outliers and are plotted as individual points. Set this to an unreasonably high value to force the whiskers to show the min and max values.\n",
    "# Alternatively, set this to an ascending sequence of percentile (e.g., [5, 95]) to set the whiskers at specific percentiles of the data.\n",
    "# Finally, whis can be the string 'range' to force the whiskers to the min and max of the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# clear the current figure\n",
    "plt.clf()\n",
    "# plot boxplots for all three of df's columns\n",
    "_ = plt.boxplot([ df['normal'], df['random'], df['gamma'] ], whis='range')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4Xu3dDaxtaV3f8d+ICiHOHTCBwsjIaGyhRiyi1gBWwFYpUF8jirSJ2Coi1tcEuKDJIDYKIoKFSgK2CKattaDGMCJVixrfCipofEGpLzAjCqTEO0IVotA8M+vUw5kz9+6z/3ut86z1fHYy4eXuZ5+1Ps9/3/netV/uVXEjQIAAAQIECBAYSuCqoc7WyRIgQIAAAQIECEQAGgICBAgQIECAwGACAnCwDXe6BAgQIECAAAEBaAYIECBAgAABAoMJCMDBNtzpEiBAgAABAgQEoBkgQIAAAQIECAwmIAAH23CnS4AAAQIECBAQgGaAAAECBAgQIDCYgAAcbMOdLgECBAgQIEBAAJoBAgQIECBAgMBgAgJwsA13ugQIECBAgAABAWgGCBAgQIAAAQKDCQjAwTbc6RIgQIAAAQIEBKAZIECAAAECBAgMJiAAB9twp0uAAAECBAgQEIBmgAABAgQIECAwmIAAHGzDnS4BAgQIECBAQACaAQIECBAgQIDAYAICcLANd7oECBAgQIAAAQFoBggQIECAAAECgwkIwME23OkSIECAAAECBASgGSBAgAABAgQIDCYgAAfbcKdLgAABAgQIEBCAZoAAAQIECBAgMJiAABxsw50uAQIECBAgQEAAmgECBAgQIECAwGACAnCwDXe6BAgQIECAAAEBaAYIECBAgAABAoMJCMDBNtzpEiBAgAABAgQEoBkgQIAAAQIECAwmIAAH23CnS4AAAQIECBAQgGaAAAECBAgQIDCYgAAcbMOdLgECBAgQIEBAAJoBAgQIECBAgMBgAgJwsA13ugQIECBAgAABAWgGCBAgQIAAAQKDCQjAwTbc6RIgQIAAAQIEBKAZIECAAAECBAgMJiAAB9twp0uAAAECBAgQEIBmgAABAgQIECAwmIAAHGzDnS4BAgQIECBAQACaAQIECBAgQIDAYAICcLANd7oECBAgQIAAAQFoBggQIECAAAECgwkIwME23OkSIECAAAECBASgGSBAgAABAgQIDCYgAAfbcKdLgAABAgQIEBCAZoAAAQIECBAgMJiAABxsw50uAQIECBAgQEAAmgECBAgQIECAwGACAnCwDXe6BAgQIECAAAEBaAYIECBAgAABAoMJCMDBNtzpEiBAgAABAgQEoBkgQIAAAQIECAwmIAAH23CnS4AAAQIECBAQgGaAAAECBAgQIDCYgACsbXjzuzbJX9YexmoCBAgQIEBgYYGrk7w9yQcX/rld/DgBWNuGj0lyc+0hrCZAgAABAgTOSeA+Sf70nH72uf5YAVjjv5Dk0k033ZQLF9p/dSNAgAABAgR6F7jlllty3XXXtcO8JsktvR/vHMcnAGuqtwbgpUuXBGDN0WoCBAgQILCYQAvAa65p7ScAF0Pf2A8SgBvbUKdDgAABAtsXEICJK4C1OReANT+rCRAgQIDA4gICUABWh04AVgWtJ0CAAAECCwsIQAFYHTkBWBW0ngABAgQILCwgAAVgdeQEYFXQegIECBAgsLCAABSA1ZETgFVB6wkQIECAwMICAlAAVkdOAFYFrSdAgAABAgsLCEABWB05AVgVtJ4AAQIECCwsIAAFYHXkBGBV0HoCBAgQILCwgAAUgNWRE4BVQesJECBAgMDCAgJQAFZHTgBWBa0nQIAAAQILCwhAAVgdOQFYFbSeAAECBAgsLCAABWB15ARgVdB6AgQIECCwsIAAFIDVkROAVUHrCRAgQIDAwgICUABWR27oALz+4o238/uTZz+mamo9AQIECBCYVUAACsDqgAnAE4ICsDpS1hMgQIDA3AICUABWZ0wACsDqDFlPgAABAgsLCEABWB25oQLwtJd8rwToiuCVhPw6AQIECCwtIAAFYHXmNhuA+8TeaZgCsDpi1hMgQIDAoQUEoACszpQAvIKgAKyOmPUECBAgcGgBASgAqzMlAAVgdYasJ0CAAIGFBQSgAKyOnAAUgNUZsp4AAQIEFhYQgAKwOnICUABWZ8h6AgQIEFhYQAAKwOrIbSYAD/Whj5Og3gNYHTHrCRAgQODQAgJQAFZnSgC6AlidIesJECBAYGEBASgAqyMnAAVgdYasJ0CAAIGFBQSgAKyOnAAUgNUZsp4AAQIEFhYQgAKwOnICUABWZ8h6AgQIEFhYQAAKwOrICUABWJ0h6wkQIEBgYQEBKACrIycABWB1hqwnQIAAgYUFBKAArI6cABSA1RmyngABAgQWFhCAArA6cgJQAFZnyHoCBAgQWFhAAArA6sgJQAFYnSHrCRAgQGBhAQEoAKsjJwAFYHWGrCdAgACBhQUEoACsjpwAFIDVGbKeAAECBBYWEIACsDpyAlAAVmfIegIECBBYWEAACsDqyK0yAK+/eGP1vHde/yfPfszO93VHAgQIECCwhIAAFIDVOROArgBWZ8h6AgQIEFhYQAAKwOrICcA9BF0V3APNEgIECBA4mIAAFIDVYRKAewgKwD3QLCFAgACBgwkIQAFYHSYBuIegANwDzRICBAgQOJiAABSA1WESgHsICsA90CwhQIAAgYMJCEABWB0mAbiHoADcA80SAgQIEDiYgAAUgNVhEoB7CArAPdAsIUCAAIGDCQhAAVgdJgG4h6AA3APNEgIECBA4mIAAFIDVYRKAewgKwD3QLCFAgACBgwkIQAFYHSYBuIegANwDzRICBAgQOJiAABSA1WESgHsICsA90CwhQIAAgYMJCEABWB0mAbiHoADcA80SAgQIEDiYgAAUgNVhEoB7CArAPdAsIUCAAIGDCQhAAVgdJgG4h6AA3APNEgIECBA4mIAAFIDVYRKAewgKwD3QLCFAgACBgwkIQAFYHSYBuIegANwDzRICBAgQOJiAABSA1WESgHsICsA90CwhQIAAgYMJCEABWB0mAbiHoADcA80SAgQIEDiYgAAUgNVhEoB7CArAPdAsIUCAAIGDCQjA7QTgxSTfleT7knzTNCF3SfK8JI9Lcuckr03y5CTvODZBH5vkxUkekeQ9SV6e5OlJ/mbHKROAO0Idv5sA3APNEgIECBA4mIAA3EYAfnqSH0lyS5LXHQvAFnaPSfKEJJeSvCjJB5I8dJqgOyV5U5I/T/KUJPdO8ookL03yjB2nTADuCCUA94CyhAABAgRmERCA6w/Aj0ryG9OVvW+bgq5dAbwmybuSPD7JK6fpuX+S30vy4CS/muRRSV6d5NpjVwWflOQ5Se6R5P07TJ0A3AHp5F1cAdwDzRICBAgQOJiAAFx/ALaXbN+d5JuT/NyxAPzsJD+b5O5J/uLYxLw1yQuSPD/Js5J8fpIHHvv1j0vyR0kelOSNO0yaANwBSQDugWQJAQIECMwmIADXHYDtvX3fmqS9BPzXJwKwXfl72fTev+MD9PrpZeKnJXlJkvsmeeSxO9w1yXuTPDrJa06ZvPZewvbP0e3qJDdfunQpFy60FlzH7fqLN57rge5yBfDkMe6y5lxPyg8nQIAAgdUICMD1BuB1SX4tyeck+a1p4o5fAZwrAJ+Z5IaTEy4Az/ac3yXmBODZTN2bAAECBHYXEIDrDcAvTPJjSf722Ha3D3V8cPqgR7uq9zMzvATsCuDuz687vKcAPACihyBAgACBvQUE4HoDsL302l6+PX5rL/m+efoQx03Th0C+PMmrpjvdb/r1kx8CaZ/+fed0nycmeW6SeyZ53w6T5T2AOyCdvIsA3APNEgIECBA4mIAAXG8AnjYEx18Cbr/evgamvZevfQ1M+4qYF06LHjL959HXwLw9yVOT3CvJDyX5AV8Dc7Dn2KkPJADn9fXoBAgQIHB5AQG47QA8+iLodhXw+BdBt+/9O7q1q4gtFB8+ffijfaq4fam0L4Ke8XcPATgjrocmQIAAgSsKCMBtBeAVN3yGO3gJeA9UAbgHmiUECBAgcDABASgAq8MkAPcQFIB7oFlCgAABAgcTEIACsDpMAnAPQQG4B5olBAgQIHAwAQEoAKvDJAD3EBSAe6BZQoAAAQIHExCAArA6TAJwD0EBuAeaJQQIECBwMAEBKACrwyQA9xAUgHugWUKAAAECBxMQgAKwOkwCcA/BfQLwtB+zy+PscXiWECBAgMDGBQSgAKyOuADcQ3CXcDv5dwELwD2gLSFAgACBUwUEoACsPjUE4B6CAnAPNEsIECBA4GACAlAAVodpFQG4y9W0KsRZ1gvAs2i5LwECBAgcWkAACsDqTAnAPQQF4B5olhAgQIDAwQQEoACsDpMA3ENQAO6BZgkBAgQIHExAAArA6jAJwKpgktOCcJeXrXcJyQMcnocgQIAAgY0JCEABWB1pAVgVFIAHEPQQBAgQIHAWAQEoAM8yL6fdVwBWBQXgAQQ9BAECBAicRUAACsCzzIsArGodeL2XgA8M6uEIECAwiIAAFIDVUXcFsCpYWC8AC3iWEiBAYGABASgAq+PfXQDu8uGJ6kn3sl4A9rITjoMAAQLrEhCAArA6sQKwKlhYLwALeJYSIEBgYAEBKACr4y8Aq4KF9QKwgGcpAQIEBhYQgAKwOv4CsCpYWC8AC3iWEiBAYGABASgAq+MvAKuChfUCsIBnKQECBAYWEIACsDr+ArAqWFgvAAt4lhIgQGBgAQEoAKvjLwCrgoX1ArCAZykBAgQGFhCAArA6/gKwKlhYLwALeJYSIEBgYAEBKACr4y8Aq4KF9QKwgGcpAQIEBhYQgAKwOv4CsCpYWC8AC3iWEiBAYGABASgAq+MvAKuChfUCsIBnKQECBAYWEIACsDr+ArAqWFgvAAt4lhIgQGBgAQEoAKvjLwCrgoX1ArCAZykBAgQGFhCAArA6/gKwKlhYLwALeJYSIEBgYAEBKACr4y8Aq4KF9QKwgGcpAQIEBhYQgAKwOv4CsCpYWC8AC3iWEiBAYGABASgAq+MvAKuChfUCsIBnKQECBAYWEIACsDr+ArAqWFgvAAt4lhIgQGBgAQEoAKvjLwCrgoX1ArCAZykBAgQGFhCAArA6/gKwKlhYLwALeJYSIEBgYAEBKACr4y8Aq4KF9QKwgGcpAQIEBhYQgAKwOv4CsCpYWC8AC3iWEiBAYGABASgAq+MvAKuChfUCsIBnKQECBAYWEIACsDr+ArAqWFgvAAt4lhIgQGBgAQEoAKvjLwCrgoX1ArCAZykBAgQGFhCAArA6/gKwKlhYLwALeJYSIEBgYAEBKACr4y8Aq4KF9QKwgGcpAQIEBhYQgAKwOv4CsCpYWC8AC3iWEiBAYGABASgAq+MvAKuChfUCsIBnKQECBAYWEIACsDr+ArAqWFgvAAt4lhIgQGBgAQEoAKvjLwCrgoX1ArCAZykBAgQGFhCAArA6/gKwKlhYLwALeJYSIEBgYAEBKACr4y8Aq4KF9QKwgGcpAQIEBhYQgAKwOv7nHoDXX7yxeg6rXS8AV7t1DpwAAQLnKiAABWB1AAVgVbCwXgAW8CwlQIDAwAICUABWx18AVgUL6wVgAc9SAgQIDCwgAAVgdfwFYFWwsF4AFvAsJUCAwMACAlAAVsdfAFYFC+sFYAHPUgIECAwsIAAFYHX8BWBVsLBeABbwLCVAgMDAAgJQAFbHXwBWBQvrBWABz1ICBAgMLCAABWB1/AVgVfCA6wXhATE9FAECBDYsIAAFYHW8BWBV8IDrBeABMT0UAQIENiwgAAVgdbwFYFXwgOsF4AExPRQBAgQ2LCAABWB1vAVgVfCA6wXgATE9FAECBDYsIAAFYHW8BWBV8IDrBeABMT0UAQIENiwgAAVgdbwFYFVw5vWicGZgD0+AAIEVCghAAVgdWwFYFZx5vQCcGdjDEyBAYIUCAlAAVsdWAFYFZ14vAGcG9vAECBBYoYAAFIDVsRWAVcGZ1wvAmYE9PAECBFYoIAAFYHVsBWBVcOb1AnBmYA9PgACBFQoIwPUG4Ncmaf9cP83d7yR5VpLXTP/7Lkmel+RxSe6c5LVJnpzkHcfm9GOTvDjJI5K8J8nLkzw9yd+cYZYF4BmwzuOuAvA81P1MAgQI9C0gANcbgJ+X5G+TvCW3ncNXJHlKkk9J0mKwhd1jkjwhyaUkL0rygSQPnUbyTknelOTPp3X3TvKKJC9N8owzjK0APAPWedxVAJ6Hup9JgACBvgUE4HoD8LTJevcUc69M8q4kj0/S/nu73T/J7yV5cJJfTfKoJK9Ocu2xq4JPSvKcJPdI8v4dR1cA7gjVy90EYS874TgIECBwfgICcBsB2K7mPXZ6CbddAbxXkp9Ncvckf3FsvN6a5AVJnj+9XPz5SR547Nc/LskfJXlQkjfewVi2l5PbP0e3q5PcfOnSpVy40Fpw+dv1F29c/oeu+CcKwBVvnkMnQIDAgQQE4LoD8AFJfiVJe79few9fu+L3k9N/vuxEqLWReX2S1yV5WpKXJLlvkkcem6W7Jnlvkkcfey/hyVF7ZpIbTv6fAvBAz8gFHkYALoDsRxAgQKBzAQG47gD8yCTtgxzXJPmSJF+V5GHTVb25AtAVwM6f1Fc6PAF4JSG/ToAAge0LCMB1B+DJCf2ZJH+Y5L/N+BLwyZ/pPYAr+31CAK5swxwuAQIEZhAQgNsKwP+Z5G1JvnH6EMiXJ3nVNDf3S/LmUz4E0j79+87pPk9M8twk90zyvh3nTQDuCNXL3QRgLzvhOAgQIHB+AgJwvQH4XdP79FrwtQ9itPf/tff2tff0/fT0NTDtvXzta2BuSfLCacweMv3n0dfAvD3JU6cPjvxQkh/wNTDn94Rc4icLwCWU/QwCBAj0LSAA1xuA/zHJP03SruC17/n7rekrXFr8tdvRF0G3q4DHvwi6fe/f0a19CKR9X+DDpw9/tC+CvuiLoPt+0laPTgBWBa0nQIDA+gUE4HoDsJfp8xJwLzux43EIwB2h3I0AAQIbFhCAArA63gKwKrjwegG4MLgfR4AAgQ4FBKAArI6lAKwKLrxeAC4M7scRIECgQwEBKACrYykAq4ILrxeAC4P7cQQIEOhQQAAKwOpYCsCq4MLrBeDC4H4cAQIEOhQQgAKwOpYCsCq48HoBuDC4H0eAAIEOBQSgAKyOpQCsCi68XgAuDO7HESBAoEMBASgAq2MpAKuCC68XgAuD+3EECBDoUEAACsDqWArAquDC6wXgwuB+HAECBDoUEIACsDqWArAq2MF6UdjBJjgEAgQILCggAAVgddwEYFWwg/UCsINNcAgECBBYUEAACsDquAnAqmAH6wVgB5vgEAgQILCggAAUgNVxE4BVwQ7WC8AONsEhECBAYEEBASgAq+MmAKuCHawXgB1sgkMgQIDAggICUABWx00AVgU7WC8AO9gEh0CAAIEFBQSgAKyOmwCsCnawXgB2sAkOgQABAgsKCEABWB03AVgV7GC9AOxgExwCAQIEFhQQgAKwOm4CsCrYwXoB2MEmOAQCBAgsKCAABWB13ARgVbCD9QKwg01wCAQIEFhQQAAKwOq4CcCqYAfrBWAHm+AQCBAgsKCAABSA1XETgFXBDtYLwA42wSEQIEBgQQEBKACr4yYAq4IdrBeAHWyCQyBAgMCCAgJQAFbHTQBWBTtYLwA72ASHQIAAgQUFBKAArI6bAKwKdrBeAHawCQ6BAAECCwoIQAFYHTcBWBXsYL0A7GATHAIBAgQWFBCAArA6bgKwKtjBegHYwSY4BAIECCwoIAAFYHXcBGBVsIP1ArCDTXAIBAgQWFBAAArA6rgJwKpgB+sFYAeb4BAIECCwoIAAFIDVcROAVcEO1gvADjbBIRAgQGBBAQEoAKvjJgCrgh2sF4AdbIJDIECAwIICAlAAVsdNAFYFO1gvADvYBIdAgACBBQUEoACsjpsArAp2sF4AdrAJDoEAAQILCghAAVgdNwFYFexgvQDsYBMcAgECBBYUEIACsDpuArAq2MF6AdjBJjgEAgQILCggAAVgddwEYFWwg/UCsINNcAgECBBYUEAACsDquAnAqmAH6wVgB5vgEAgQILCggAAUgNVxE4BVwQ7WC8AONsEhECBAYEEBASgAq+MmAKuCHawXgB1sgkMgQIDAggICUABWx00AVgU7WC8AO9gEh0CAAIEFBQSgAKyOmwCsCnawXgB2sAkOgQABAgsKCEABWB03AVgV7GC9AOxgExwCAQIEFhQQgAKwOm4CsCrYwXoB2MEmOAQCBAgsKCAABWB13ARgVbCD9QKwg01wCAQIEFhQQAAKwOq4CcCqYAfrBWAHm+AQCBAgsKCAABSA1XETgFXBDtYLwA42wSEQIEBgQQEBKACr4yYAq4IrWS8SV7JRDpMAAQI7CAhAAbjDmFz2LgKwKriS9QJwJRvlMAkQILCDgAAUgDuMiQCsIm1hvQDcwi46BwIECNwmIAAFYPW54ApgVXAl6wXgSjbKYRIgQGAHAQEoAHcYE1cAq0hbWC8At7CLzoEAAQKuAB7NwFWGoSTgCmCJbz2LBeB69sqREiBA4EoCrgC6AnilGbnSrwvAKwlt5NcF4EY20mkQIEDAewBvnQFXAGtPBQFY81vNagG4mq1yoAQIELiigCuAAvCKQ3KFOwjAquBK1gvAlWyUwyRAgMAOAgJQAO4wJpe9iwCsCq5kvQBcyUY5TAIECOwgIAAF4A5jIgCrSFtYLwC3sIvOgQABArcJCEABWH0uuAJYFVzJegG4ko1ymAQIENhBQAAKwB3GxBXAKtIW1gvALeyicyBAgIArgEcz4FPAtWeDK4A1v9WuFoSr3ToHToAAAS8B+xqY8rNAAJYJ1/kAAnCd++aoCRAg0AS8BOwl4OozQQBWBVe6XgCudOMcNgECBATgrTPgJeDaU0EA1vxWu1oArnbrHDgBAgRcARSA5WeBACwTrvMBBOA6981REyBAwEvAt82AK4C154IArPmtdrUAXO3WOXACBAi4AigAy88CAVgmXOcDCMB17pujJkCAgCuArgAe4lmwaABef/HGQxyzxziAgAA8AKKHIECAwDkJ+BTwel8CfnqSL05y/yR/leSXkzwtye8fm6W7JHlekscluXOS1yZ5cpJ3HLvPxyZ5cZJHJHlPkpcnaY/9NzvOpADcEWprdxOAW9tR50OAwEgCAnC9AfhTSX44yRuSfHiS70zySUk+Mcl7pyFuYfeYJE9IcinJi5J8IMlDp1+/U5I3JfnzJE9Jcu8kr0jy0iTP2PGJIAB3hNra3QTg1nbU+RAgMJKAAFxvAJ6c03skeWeShyX5hSTXJHlXkscneeV053a18PeSPDjJryZ5VJJXJ7n22FXBJyV5TpL2eO/f4ckgAHdA2uJdBOAWd9U5ESAwioAA3E4AfkKStyR5QJLfTvLZSX42yd2T/MWxgX5rkhckeX6SZyX5/CQPPPbrH5fkj5I8KMkbT3kitJeS2z9Ht6uT3Hzp0qVcuNBacN6b9wDO63uWRxeAZ9FyXwIECPQlIAC3EYAfluQnktwtyWdOI9au/L3sRKy1X3p9ktdN7xd8SZL7JnnksbG86/QS8qOTvOaUcX1mkhtO/v8CsK8n9hJHIwCXUPYzCBAgMI+AANxGALb3+rWXc1v83TxzALoCOM9zcXWPKgBXt2UOmAABAv9fQACuPwDbBzu+IMlnJfnjY7M910vAJ58+3gM46G8oAnDQjXfaBAhsQkAArjcA299g8sIkX5Tk4dP7/44P5dGHQL48yaumX7hfkjef8iGQ9unf9gGSdntikucmuWeS9+0w5QJwB6Qt3kUAbnFXnRMBAqMICMD1BuD3T5/wbVf/jn/3X/u6l/a9gO3WXhpu7+VrXwNzyxSM7f9/yPTrR18D8/YkT01yryQ/lOQHfA3MKL8FHPY8ReFhPT0aAQIE5hIQgOsNwA/ewVB8ZZIfnH7t6Iug21XA418E3b737+jWPgTSQrFdRWzfH9i+CPqiL4Ke6ym37ccVgNveX2dHgMB2BATgegOwlyn0EnAvO9HBcQjADjbBIRAgQGAHAQEoAHcYk8veRQBWBTe0XgBuaDOdCgECmxYQgAKwOuACsCq4ofUCcEOb6VQIENi0gAAUgNUBF4BVwQ2tF4Ab2kynQoDApgUEoACsDrgArApuaL0A3NBmOhUCBDYtIAAFYHXABWBVcEPrBeCGNtOpECCwaQEBKACrAy4Aq4IbWi8AN7SZToUAgU0LCEABWB1wAVgV3ND6kwF4/cUbb3d2InFDG+5UCBBYrYAAFIDV4RWAVcENrReAG9pMp0KAwKYFBKAArA64AKwKbmi9ANzQZjoVAgQ2LSAABWB1wAVgVXBD6wXghjbTqRAgsGkBASgAqwMuAKuCG1ovADe0mU6FAIFNCwhAAVgdcAFYFdzQegG4oc10KgQIbFpAAArA6oALwKrghtYLwA1tplMhQGDTAgJQAFYHXABWBTe0XgBuaDOdCgECmxYQgAKwOuACsCq4ofUCcEOb6VQIENi0gAAUgNUBF4BVwQ2tF4Ab2kynQoDApgUEoACsDrgArApuaL0A3NBmOhUCBDYtIAAFYHXABWBVcEPrBeCGNtOpECCwaQEBKACrAy4Aq4IbWi8AN7SZToUAgU0LCEABWB1wAVgV3NB6AbihzXQqBAhsWkAACsDqgAvAquCG1gvADW2mUyFAYNMCAlAAVgdcAFYFN7ReAG5oM50KAQKbFhCAArA64AKwKrih9QJwQ5vpVAgQ2LSAABSA1QEXgFXBwdafjMTBTt/pEiBAoAsBASgAq4MoAKuCg60XgINtuNMlQKBLAQEoAKuDKQCrgoOtF4CDbbjTJUCgSwEBKACrgykAq4KDrReAg2240yVAoEsBASgAq4MpAKuCg60XgINtuNMlQKBLAQEoAKuDKQCrgoOtF4CDbbjTJUCgSwEBKACrgykAq4KDrReAg2240yVAoEsBASgAq4MpAKuCg60XgINtuNMlQKBLAQEoAKuDKQCrgoOtF4CDbbjTJUCgSwEBKACrgykAq4KDrReAg2240yVAoEsBASgAq4MpAKuCg60XgINtuNMlQKBLAQEoAKuDKQCrgmQHI9EAABWJSURBVIOtF4CDbbjTJUCgSwEBKACrgykAq4KDrReAg2240yVAoEsBASgAq4MpAKuCg60XgINtuNMlQKBLAQEoAKuDKQCrgoOtF4CDbbjTJUCgSwEBKACrgykAq4KDrReAg2240yVAoEsBASgAq4MpAKuCg60/GYDXX7zxdgIicbChcLoECCwuIAAFYHXoBGBVcLD1AnCwDXe6BAh0KSAABWB1MAVgVXCw9QJwsA13ugQIdCkgAAVgdTAFYFXQei8BmwECBAgsLCAABWB15ARgVdB6AWgGCBAgsLCAABSA1ZETgFVB6wWgGSBAgMDCAgJQAFZHTgBWBa0XgGaAAAECCwsIQAFYHTkBWBW0XgCaAQIECCwsIAAFYHXkBGBV0HoBaAYIECCwsIAAFIDVkROAVUHrBaAZIECAwMICAlAAVkdOAFYFrReAZoAAAQILCwhAAVgdOQFYFbReAJoBAgQILCwgAAVgdeQEYFXQegFoBggQILCwgAAUgNWRE4BVQesFoBkgQIDAwgICUABWR04AVgWtF4BmgAABAgsLCEABWB05AVgVtF4AmgECBAgsLCAABWB15ARgVdB6AWgGCBAgsLCAABSA1ZETgFVB6wWgGSBAgMDCAgJQAFZHTgBWBa0XgGaAAAECCwsIQAFYHTkBWBW0XgCaAQIECCwsIAAFYHXkBGBV0HoBaAYIECCwsIAAFIDVkROAVUHrBaAZIECAwMICAlAAVkdOAFYFrReAZoAAAQILCwhAAVgdOQFYFbReAJoBAgQILCwgAAVgdeQEYFXQegFoBggQILCwgAAUgNWRE4BVQev3EviTZz9mr3UWESBAgEAiANcbgJ+V5ClJPjXJvZN8UZIfPzbUVyX59iRfneRuSX4pydcmecux+3x0khcm+bwkH0jyqiTfmOQ9Z3hyCMAzYLnr4QQE4OEsPRIBAuMJCMD1BuCjkjw0ya8n+dFTAvBpSZ6e5CuS/HGS70jygCSfmOSvp1F/zRSPX5PkI5K8LMkbkjz+DE8FAXgGLHedT0AQzmfrkQkQ2J6AAFxvAB6fxg+eCMB29e/tSZ6X5HumO16T5B1JnpDkh5P8wyS/m+TTk/zadJ9/nuQnk9xnWr/LxAvAXZTcZ3YBATg7sR9AgMCGBATgNgPw45P8YZJPSfKmY/P689P/bi/z/uspEO9+7Nc/fLo6+NgkP7bjnAvAHaHcbV4BATivr0cnQGBbAgJwmwH4kOk9f9cm+bNjI/sjSdrVwi9L8ozp5eH7nRjpdya5IcmL72DU75yk/XN0uzrJzZcuXcqFC60F571df/HGeX+AR1+tgABc7dY5cAIEzkFAAArAswbgM6dA/JBxFYDn8Oz1Iz9EQAAaCAIECOwuIAC3GYBzvgTsCuDuzy/3XFBAAC6I7UcRILB6AQG4zQA8+hBI+wBI+yBIu7XXZ9vLuyc/BPJp0yeJ230+N8lP+RDI6p/XTmASEIVGgQABAqcLCMD1BuBHJfmEaVvfmORbkrwuybuTvC1J+xqYiye+BuaTT/kamL+X5EnHvgamfSLY18D4HWMTAgJwE9voJAgQmEFAAK43AB8+Bd/JsXj5dJXv6Iugnzh9EfQvJnlykj84tqB9EfSLTnwR9Df4IugZnmke8lwEBOC5sPuhBAisQEAArjcAexkvXwPTy044jtsJCEBDQYAAAS8B39EMtCtlbvsLCMD97aycWUAAzgzs4QkQWK2AK4CuAFaHVwBWBa2fTUAAzkbrgQkQWLmAABSA1REWgFVB62cTEICz0XpgAgRWLiAABWB1hAVgVdD62QQE4Gy0HpgAgZULCEABWB1hAVgVtH42AQE4G60HJkBg5QICUABWR1gAVgWtn01AAM5G64EJEFi5gAAUgNURFoBVQetnExCAs9F6YAIEVi4gAAVgdYQFYFXQ+tkEBOBstB6YAIGVCwhAAVgdYQFYFbR+NgEBOButByZAYOUCAlAAVkdYAFYFrZ9NQADORuuBCRBYuYAAFIDVERaAVUHrZxMQgLPRemACBFYuIAAFYHWEBWBV0PrZBATgbLQemACBlQsIQAFYHWEBWBW0fjYBATgbrQcmQGDlAgJQAFZHWABWBa2fTWCfALz+4o23O559Hme2k/LABAgQOICAABSA1TESgFVB62cT2CfcBOBs2+GBCRDoSEAACsDqOArAqqD1swkIwNloPTABAisXEIACsDrCArAqaP1iArsEoSuAi22HH0SAwDkKCEABWB0/AVgVtH4xAQG4GLUfRIBA5wICUABWR3TWADztakz1gK0fV+C0ANxlxnYJx3FVnTkBAmsUEIACsDq3ArAqaH33AgKw+y1ygAQInFFAAArAM47M7e4uAKuC1ncvIAC73yIHSIDAGQUEoAA848gIwCqY9esTEIDr2zNHTIDA5QUEoACsPkdcAawKWt+9gADsfoscIAECZxQQgALwjCPjCmAVzPr1CQjA9e2ZIyZAwBXAK83AVVe6g1+/rIArgAZk8wICcPNb7AQJDCfgCqArgNWhF4BVQeu7FxCA3W+RAyRA4IwCAlAAnnFkvARcBbN+fQICcH175ogJEPAS8JVmwEvAVxK6/K+7Aljzs3oFArsE4MkvlN5lzQpO3SESILBRAVcAXQGsjrYArApa373ALjEnALvfRgdIgMAxAQEoAKtPCAFYFbS+ewEB2P0WOUACBM4oIAAF4BlH5nZ3F4BVQeu7FxCA3W+RAyRA4IwCAlAAnnFkBGAVzPr1CQjA9e2ZIyZA4PICAlAAVp8jrgBWBa1fncBpQeg9gKvbRgdMYGgBASgAq08AAVgVtH51AgJwdVvmgAkQOCEgAAVg9UkhAKuC1q9OYN8AdJVwdVvtgAlsVkAACsDqcAvAqqD1qxMQgKvbMgdMgIArgLebAV8EXXtaCMCan9UrFBCAK9w0h0yAwIcIuALoCmD1KSEAq4LWb1Jg30jcJIaTIkCgOwEBKACrQykAq4LWDyuwy9fLDIvjxAkQmFVAAArA6oAJwKqg9cMKCMBht96JEzh3AQEoAKtDKACrgtYPKyAAh916J07g3AUEoACsDqEArApaP6yAABx26504gXMXEIACsDqEArAqaP2wAgJw2K134gTOXUAACsDqEArAqqD1wwoIwGG33okTOHcBASgAq0MoAKuC1g8rIACH3XonTuDcBQSgAKwOoQCsClo/rIAAHHbrnTiBcxcQgAKwOoQCsCpo/bACAnDYrXfiBM5dQAAKwOoQCsCqoPXDCgjAYbfeiRM4dwEBKACrQygAq4LWEzgmIAqNAwECSwgIQAFYnTMBWBW0noAANAMECCwsIAAFYHXkBGBV0HoClxHY5Yrg9RdvvN0j7LIOPAEC4woIQAFYnX4BWBW0nsAZBU7GnQA8I6C7EyAQASgAq08DAVgVtJ7AGQUE4BnB3J0AgdsJCEABWH1aCMCqoPUEziggAM8I5u4ECAjAU2bgKnNREhCAJT6LCZxdYMkA9PLy2ffHCgJrEHAF0BXA6pwKwKqg9QTOKCAAzwjm7gQIuALoCuDBnwUC8OCkHpDA5QV2CcCTj7Dvp4JdATSNBLYp4AqgK4DVyRaAVUHrCSwgIAAXQPYjCKxIQAAKwOq4CsCqoPUEFhDYJQBPu9p32qHt8lgLnJIfQYBAQUAACsDC+Ny6VABWBa0nsIDAadG2a/Ad6uXkBU7TjyBAYEcBASgAdxyVO7ybAKwKWk9gAQEBuACyH0FgRQICUABWx1UAVgWtJ7CAwHkHoA+TLLDJfgSBMwgIQAF4hnE59a4CsCpoPYGVCezyHsBdXl7e5XFWRuNwCaxGQAAKwOqwCsCqoPUEBhUQgINuvNPuQkAACsDqIArAqqD1BAYV2OX7DPeJRC83DzpQTvtMAgJQAJ5pYE65swCsClpPYFABATjoxjvtLgQEoABsg/h1SZ6S5F5JfjPJ1yd5/Y4TKgB3hHI3AgTqArtcEXQFsO7sEbYvIAAF4JcleUWSJyX5X0m+Kcljk9wvyTt3eAoIwB2Q3IUAgcMI7Ptp5n3CcZc1p53VyQDd93EOI+ZRCJwuIAAFYIu+NyT5t9OIfFiSm5K8MMmzd3jiCMAdkNyFAIHzFdglwvYJN592Pt999dP3FxCAYwfgRyb5v0m+JMmPHxujlye5W5IvOGW07pyk/XN0uzrJzTfddFMuXGgteNjbJ93w2sM+oEcjQIDA4AK//e2P3Evg5O/HuzzOLr+H7/I4ex3wShft47zPqbYAvO6669rSa5Lcss9jrH3NVWs/gcLxX5vkT5M8JMmvHHuc707ysCSfccpjPzPJDYWfaSkBAgQIECDQj8B9phbo54gWOhIBeLYAPHkFsG3TRyd594H369Yri0naYP7lgR977Q/H5o53kM3pNlzMzD6/75mb7c9N2+O3J/ngPgOy9jUjB+A+LwEvtd+3vrdw5EvTl4Fmc8c4bE634WJm9vm929yYm33mZjVrRg7AtkntQyDtK1/aV7+0W/sQyNuSvGjHD4HMtdF+4/Ebzz6zZW4E4Fnnxsz4veasM9Pub272UetszegB2L4Gpn3o42umEGxfA/OlSe6f5B3nuFeeXH5T3mf8zI0APOvcmBm/15x1ZgTgPmIdrhk9ANuWtK+AOfoi6Dcl+YbpyuB5bld7r+HTk3xXkved54F0+LPZ3PGmsDndhouZ2ee3MnNjbvaZm9WsEYCr2SoHSoAAAQIECBA4jIAAPIyjRyFAgAABAgQIrEZAAK5mqxwoAQIECBAgQOAwAgLwMI4ehQABAgQIECCwGgEBuJqtcqAECBAgQIAAgcMICMDDOB76Ub7u2CeTf3P6nsL2fYUj39qnor94+oqev0ryy0meluT3R0Y55dwvTp8e/74k7WuNRr99TJLnJHlUkrsm+d9JvjLJrw0Oc6ck7a+2/FdJ7jX9bQg/mOTfDfi3InzW9Pvtpya5d5IvOvH3w7d/T357kq+e/p74X0rytUneMsAMXc7mI6Z5eXSSj5/+8oKfSdJ+D2p/u4Zb5wICsL8Nat9N+IokT5q+jqb9S/yxSe6X5J39He5iR/RTSX44yRuSfHiS70zySUk+Mcl7FzuKvn/Qpyf5kekvNn+dAMzdk7wxSbN4cZJ3Jfn7Sf5w+qfv3Zz36J6R5FuSfEWS30nyaUleluRbk/z7eX90d4/e/nDw0CS/nuRHTwnA9gfN9gfQZvXHSb4jyQOm33v+uruzOewBXc7mmiSvTPLSJO1CRXu+tT94tj9ctHly61xAAPa3Qe1vJ2mR076fsN3a305yU5IXnvPfTtKb1D2mIH5Ykl/o7eDO4Xg+KslvJHlykm9L0r7TcvQrgM+e/sX+T85hP3r/ka+evuz+3xw70FclaVfX21XBUW/t74Q9fgWw/TuyXc16XpLvmVBa+LS/KOAJ0x9KR7E6aXPaebc/hLZXq+47/a1ao9is8jwFYF/b1vPfT9yXVPIJ00sw7U/iv93bwZ3D8bS/0ebdSb45yc8JwFt34HeTvDbJfZK0Pyj8aZLvn65YnMMWdfUj2xXAJyb53CR/kOQfJfkf01XB/9zVkS57MCcjp7202a4Yf8r0nDo6mp+f/vc3Lnt45/rTdgnAfzbN0d2mVyLO9YD98MsLCMC+JuTa6V9SD0nyK8cO7bunf4F9Rl+He25H066K/sT0fpzPPLej6OcHP2566a796bu9JCUAb9ubo5fnvjfJf0/SfNpLVO3tFS2YR76151B7G8VTk/zt9LJde/m3/e1DI99ORk77vbi956/93vxnx2DaWy3afdtbdka5XSkA7zJZvTnJvxwFZc3nKQD72j0BuNt+tPdztfemtPi7ebclm73XddMHGj4nyW9NZykAb4N4/2TT/iV+dGvvb2sh+ODNTsRuJ9b+0PDc6cMP7T2AD0zygukK4MhxLADveH4uF4DtAyHtLQTtavvDXf3b7Ul43vcSgOe9Ax/6870EfOX9eFGSL0jSPp3W3pA9+u0Lk/zYdBXnyKK9Cbv9Zv2BJO3vM21XeEa8vTXJTyf5qmMn3z692d4j2T4dPPKtva+4vUfyPxxDaC7t/X/3HxjGS8BnD8AWf+2KaHu5/LOT/J+B52dVpy4A+9uu9iGQ9ibar58Orb1U87YkLXzab9ij3tqstg/CtDdotz9hjvAVDLvs9dXTG66P37d9mrO9DNO+/mTk90f+lyTtCunxD4E8P0l7K8Xxq4K7OG/tPu1f0i342tX0o1v7pGv7ipx/sLWTPcP53NGHQNoHQNoHQdrtwvQBNB8CSY7ir326/hHTJ+3PwO2u5ykgAM9T//Sf3d5T0l6C+ZopBNsnOb90+lN5++TZqLf25v3HT1f/jn/336Xpk4ujupx23l4Cvk2lvdTbvi/yhukKxT+ePgDSPvww8gcdmk37zr/2hv32+0x7Cbh9yOElSf7T9P2aIz2f2ifo24fK2q19bVD7epz21UHtQ1XtD9/ta2Dad9sd/xqYTx7ka2AuZ9PeE9m+BuZBSf7F9Mnoo7lpdu0tGG4dCwjAPjenfQXMU6YvaG1f5/EN03cC9nm0yxxV+5P5abd2xaL9y8zt7wQE4N9ZtH8xtQ82tCsU7S0D7QMh7XvLRr+1K8ft++zaFfV7Tl918l+TPGvAf3G3VxRa8J28tT+It6t8R18E3f7g0D7d+ovT1y21T09v/XY5m/ZF4nf0Npx2NbD9PuTWsYAA7HhzHBoBAgQIECBAYA4BATiHqsckQIAAAQIECHQsIAA73hyHRoAAAQIECBCYQ0AAzqHqMQkQIECAAAECHQsIwI43x6ERIECAAAECBOYQEIBzqHpMAgQIECBAgEDHAgKw481xaAQIECBAgACBOQQE4ByqHpMAAQIECBAg0LGAAOx4cxwaAQIECBAgQGAOAQE4h6rHJECAAAECBAh0LCAAO94ch0aAAAECBAgQmENAAM6h6jEJECBAgAABAh0LCMCON8ehESBAgAABAgTmEBCAc6h6TAIECBAgQIBAxwICsOPNcWgECBAgQIAAgTkEBOAcqh6TAAECBAgQINCxgADseHMcGgECBAgQIEBgDgEBOIeqxyRAgAABAgQIdCwgADveHIdGgAABAgQIEJhDQADOoeoxCRAgQIAAAQIdCwjAjjfHoREgQIAAAQIE5hAQgHOoekwCBAgQIECAQMcCArDjzXFoBAgQIECAAIE5BATgHKoekwABAgQIECDQsYAA7HhzHBoBAgQIECBAYA4BATiHqsckQIAAAQIECHQsIAA73hyHRoAAAQIECBCYQ0AAzqHqMQkQIECAAAECHQsIwI43x6ERIECAAAECBOYQEIBzqHpMAgQIECBAgEDHAgKw481xaAQIECBAgACBOQQE4ByqHpMAAQIECBAg0LHA/wNnrrj+WvcIDgAAAABJRU5ErkJggg==\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "_ = plt.hist(df['gamma'], bins=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": 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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0rx583TsscdqzZo1zbOCM2bM0CWXXKJ33nlH2223XRmjyE4XBDBcrhFABNBaTQiglaBHfwTQAxJNIFAGgcIvwVWrVuVm8wpHp06d5P60drhHtr169dJPfvITfe1rX2sWwMcff1xHHXWU3n//ffXs6fbV/9ux66676rzzztP555+vK664Qg8++KCee+655s+XL1+u3XffXU5uhgwZUsYostMFAQyXawQQAbRWEwJoJejRvxwBLPThG0I8ANMkswSKfgluwWDSpEmaPNltibrl4d7t+/GPfyz3CHj77bffQgDdzN+YMWNy7/4VHwceeGDuMfG0adN01lln6Y033tBjjz3W3GTDhg3aYYcd9Mgjj2jECPcNnRxtEUAAw9UGAogAWqsJAbQS9OiPAHpAogkEyiAQZQbQzRLuv//++u1vf6t99903d7biGUAEsIwEROyCAEYE1k5zBBABtFYTAmgl6NEfAfSARBMIlEEgyjuAc+fO1fHHH69tttmm+UxuUUeHDh1yCz3crN7RRx/NI+Ay8uDbBQH0JVW6HQKIAJaukvZbIIBWgh79EUAPSDSBQBkEogjg+vXrc49viw/3yLeuri63iGPAgAG5RSB33323TjzxxFyzZcuW5T5vuQjErf7t06dPrs2tt96qCRMm6O23327zvcMyhpbKLghguLQigAigtZoQQCtBj/4IoAckmkCgDAJRBLC18MWPgN3nbhsY9y6f2wbGLSoZP358rtuiRYty/yxsA9O/f39dc801WrdunU477TSdeeaZbAPjkT8E0AOSZxMEEAH0LJU2myGAVoIe/S0C6MKzEMQDMk0ySSC0ABY2gnazgMUbQbt9/wqHm0V0ojh//vzc4g+3qthtKs1G0KVLEAEszci3BQKIAPrWSlvtEEArwXb6+4pfIUSx6BX3RQBjTBKhE03AKoCJHnwCLx4BDJc0BBABtFYTAmglGFAAi0UQAYwxMYRODQEEMFmpRADD5QsBRACt1YQAWgnGIIAtQzIDGGOSCJ1oAghgstKHAIbLFwKIAFqrCQG0Emyjf9THv+1dBgIYU5IIm3gCCGCyUogAhssXAogAWqsJAbQSRABjIkhYCJQmgACWZlRLLRDAcNlAABFAazUhgFaCCGBMBAkLgdIEEMDSjGqpBQIYLhsIIAJorSYE0EoQAYyJIGEhUJoAAliaUS21QADDZQMB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\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Use one of the toolkits that comes with matplotlib to overlay axes.\n",
    "\n",
    "import mpl_toolkits.axes_grid1.inset_locator as mpl_il\n",
    "\n",
    "plt.figure()\n",
    "plt.boxplot([ df['normal'], df['random'], df['gamma'] ], whis='range')\n",
    "\n",
    "# overlay axis on top of another \n",
    "ax2 = mpl_il.inset_axes(plt.gca(), width='60%', height='40%', loc=2)\n",
    "ax2.hist(df['gamma'], bins=100)\n",
    "ax2.margins(x=0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# switch the y axis ticks for ax2 to the right side to avoid clashing with ax2.\n",
    "ax2.yaxis.tick_right()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4Xu3dC7RVZb338d/eKAjIpWNQqCQaGBiUwukihoKaV1RETLmcVztlXs7lPaGCIKYGQhpY59TQ4wFPWShailsFFFPBQCgbqBkFsVNRUF5Byy3JVpLNO57V2pvFZq09nzn/c82915zfOYajYD3/udb8zP+a/nzmZVWJBQEEEEAAAQQQQCBTAlWZ2lo2FgEEEEAAAQQQQEAEQJoAAQQQQAABBBDImAABMGM7nM1FAAEEEEAAAQQIgPQAAggggAACCCCQMQECYMZ2OJuLAAIIIIAAAggQAOkBBBBAAAEEEEAgYwIEwIztcDYXAQQQQAABBBAgANIDCCCAAAIIIIBAxgQIgBnb4WwuAggggAACCCBAAKQHEEAAAQQQQACBjAkQADO2w9lcBBBAAAEEEECAAEgPIIAAAggggAACGRMgAGZsh7O5CCCAAAIIIIAAAZAeQAABBBBAAAEEMiZAAMzYDmdzEUAAAQQQQAABAiA9gAACCCCAAAIIZEyAAJixHc7mIoAAAggggAACBEB6AAEEEEAAAQQQyJgAATBjO5zNRQABBBBAAAEECID0AAIIIIAAAgggkDEBAmDGdjibiwACCCCAAAIIEADpAQQQQAABBBBAIGMCBMCM7XA2FwEEEEAAAQQQIADSAwgggAACCCCAQMYECIAZ2+FsLgIIIIAAAgggQACkBxBAAAEEEEAAgYwJEAAztsPZXAQQQAABBBBAgABIDyCAAAIIIIAAAhkTIABmbIezuQgggAACCCCAAAGQHkAAAQQQQAABBDImQADM2A5ncxFAAAEEEEAAAQIgPYAAAggggAACCGRMgACYsR3O5iKAAAIIIIAAAgRAegABBBBAAAEEEMiYAAEwYzuczUUAAQQQQAABBAiA9AACCCCAAAIIIJAxAQJgxnY4m4sAAggggAACCBAA6QEEEEAAAQQQQCBjAgTAjO1wNhcBBBBAAAEEECAA0gMIIIAAAggggEDGBAiAGdvhbC4CCCCAAAIIIEAApAcQQAABBBBAAIGMCRAAM7bD2VwEEEAAAQQQQIAASA8ggAACCCCAAAIZEyAAZmyHs7kIIIAAAggggAABkB5AAAEEEEAAAQQyJkAAzNgOZ3MRQAABBBBAAAECID2AAAIIIIAAAghkTIAAmLEdzuYigAACCCCAAAIEQHoAAQQQQAABBBDImAABMGM7nM1FAAEEEEAAAQQIgPQAAggggAACCCCQMQECYMZ2OJuLAAIIIIAAAggQAOkBBBBAAAEEEEAgYwIEwIztcDYXAQQQQAABBBAgANIDCCCAAAIIIIBAxgQIgLYd7vwOlrTdthqqEUAAAQQQQCBhgS6S3pC0O+H3bRNvRwC07YZDJG22rYJqBBBAAAEEEGglgUMlvd5K792qb0sAtPF3lVS3adMmde3q/i8LAggggAACCLR1gXfffVe9e/d2H7ObpHfb+uctx+cjANpUcwGwrq6OAGhzpBoBBBBAAIHEBFwA7NbNZT8CYGLoKXsjAmDKdiibgwACCCCQfgECoMQMoK3PCYA2P6oRQAABBBBIXIAASAC0Nh0B0CpIPQIIIIAAAgkLEAAJgNaWIwBaBalHAAEEEEAgYQECIAHQ2nIEQKsg9QgggAACCCQsQAAkAFpbjgBoFaQeAQQQQACBhAUIgARAa8sRAK2C1COAAAIIIJCwAAGQAGhtOQKgVZB6BBBAAAEEEhYgABIArS1HALQKUo8AAgggECiwa9curVixQlu2bFGvXr00bNgwtWvXLrCOAcUFCIAEQOt3gwBoFaQeAQQQQKBFgYULF+rKK6/Uxo0bm8b16dNHc+bM0ejRo9GLIEAAJABGaJu9SgiAVkHqEUAAAQRKCrjwN2bMGI0cOVJTp07VwIEDtXbtWs2cOVOLFi3S/fffTwiM0D8EQAJghLYhAFrRqEcAAQQQCBZwp3379u2rQYMGqaamRtXV1U1FDQ0NGjVqVC4M1tbWcjo4mHOvEQRAAmDIltlnODOAVkHqEUAAAQSKCixfvlwjRozQ6tWr9cUvfnGfMe7vhw4dqmXLlmn48OEohhAgABIAQ7RL0aEEQKsg9QgggAACRQUWLFigcePGafv27TrwwAP3GeP+vmvXrrrnnns0duxYFEMIEAArJwAeL+lqSUMk9ZJ0rqSa/L7eX9IMSWdIOkJSnaQnJF0j6Y0W+uEGSdc3e/2PkvqH6CECYAgshiKAAAII+AswA+hvFXYkAbByAuDpko6TtEbSwmYBsJuk+yXNlfRbSR+R9J+S3P3x/xgQAMdIOrlgzIeS3grRSATAEFgMRQABBBDwF+AaQH+rsCMJgJUTAAv37e5mAbDYfv+cpGclHSbptRKN4WYAR0k6OmzjFIwnABrwKEUAAQQQaFmg8C7gKVOmNN0FPGvWLO4CNjQPATC9AdDN6j0uqbukd1sIgO60sjtl/L6k1ZKmtBAYi62GAGj4AlKKAAIIIBAsUOw5gIcffrhmz57NI2CC+YqOIACmMwAeIOkZSesljW+hN9xpZXdVrbvuz11X6K4HPETSQEnbS9R1kOT+aVy6SNpcV1eXuxCXBQEEEEAAgXII8Esg8aoSANMXAN0NIQ9IOlSSuye+1OxfsU5ys4WvSpoo6c4WZg2b3zgiAmC8X0zWhgACCCCAQDkFCIDpCoAu/P0sfyfwiZLejtA8v8nfQexOBRdbmAGMgEoJAggggAACbUmAAJieANgY/vpJGiFpW4RGc6eD3Q0j7uaQ//Ks5xpATyiGIYAAAggg0FYECICVEwBdOOubb5zn86dpl0n6s6Qt+cfADJY0UtKbBQ3mXt+Z//OTkh6U9MP8n2dLeiR/2vdgSTfm7wg+KkSAJAC2lW8znwMBBBBAAAFPAQJg5QRAdz2fC3zNl7vyM3avlNjnbjZwef61jZJ+nB/v/upeSe4B0wflA99KSddKesmzf9wwAmAILIYigAACCCDQFgQIgJUTANtCvxT7DATAtrpn+FwIIIAAAgiUECAAEgCtXw4CoFWQegQQQAABBBIWIAASAK0tRwC0ClKPAAIIIIBAwgIEQAKgteUIgFZB6hFAAAEEEEhYgABIALS2HAHQKkg9AggggAACCQsQAAmA1pYjAFoFqUcAAQQQQCBhAQIgAdDacgRAqyD1CCCAAAIIJCxAACQAWluOAGgVpB4BBBBAAIGEBQiABEBryxEArYLUI4AAAgggkLAAAZAAaG05AqBVkHoEEEAAAQQSFiAAEgCtLUcAtApSjwACCCCAQMICBEACoLXlCIBWQeoRQAABBBBIWIAASAC0thwB0CpIPQIIIIAAAgkLEAAJgNaWIwBaBalHAAEEEEAgYQECIAHQ2nIEQKsg9QgggAACCCQsQAAkAFpbjgBoFaQeAQQQQACBhAUIgARAa8sRAK2C1COAAAIIIJCwAAGQAGhtOQKgVZB6BBBAAAEEEhYgABIArS1HALQKUo8AAggggEDCAgRAAqC15QiAVkHqEUAAAQQQSFiAAEgAtLYcAdAqSD0CCCCAAAIJCxAACYDWliMAWgWpRwABBBBAIGEBAiAB0NpyBECrIPUIIIAAAggkLEAAJABaW44AaBWkHgEEEEAAgYQFCIAEQGvLEQCtgtQjgAACCCCQsAABkABobTkCoFWQegQQQAABBBIWIAASAK0tRwC0ClKPAAIIIBAosGvXLq1YsUJbtmxRr169NGzYMLVr1y6wjgHFBQiABEDrd4MAaBWkHgEEEECgRYGFCxfqyiuv1MaNG5vG9enTR3PmzNHo0aPRiyBAACQARmibvUoIgFZB6hFAAAEESgq48DdmzBiNHDlSU6dO1cCBA7V27VrNnDlTixYt0v33308IjNA/BEACYIS2IQBa0ahHAAEEEAgWcKd9+/btq0GDBqmmpkbV1dVNRQ0NDRo1alQuDNbW1nI6OJhzrxEEQAJgyJbZZzgzgFZB6hFAAAEEigosX75cI0aM0OrVq/W5z31un2sAn332WQ0dOlTLli3T8OHDUQwhQAAkAIZol6JDCYBWQeoRQAABBIoKLFiwQOPGjdP8+fM1bdq0fa4BnDFjhiZMmKB77rlHY8eORTGEAAGQABiiXQiAVizqEUAAAQT8BRpnAKuqqkpeA7h7925mAP1Jm0YSAAmAEdpmrxJmAK2C1COAAAIIFBXYuXOnOnfurIMOOkibN2/Wfvvt1zTuww8/1KGHHqq3335b7733ntq3b49iCAECIAEwRLswA2jFoh4BBBBAwF+gcQbQVZx11lmaMmVK013As2bN0iOPPJJbGdcA+ps2jiQAEgDDd83eFcwAWgWpRwABBBAoKtDSNYCHH364pk+fzjWAEXuHAEgAjNg6TWUEQKsg9QgggAACRQW4C7h8jUEAJABau4sAaBWkHgEEEECgqADPASxfYxAACYDW7iIAWgWpRwABBBAoKdD4SyBnnnmmTjvtNHXs2FH19fV67LHHtHjxYn4JJGLvEAAJgBFbh1PAVjjqEUAAAQT8BCZNmqTvfe97cnf+Ni7ujuBvfvObuuWWW/xWwqi9BAiABEDrV4IZQKsg9QgggAACXjOAp59+etMM4KOPPsoMoKFvCICVEwCPl3S1pCGSekk6V1JNwb6vknSjpEskdZf0jKTLJdUG9Me/5Nf7cUm/lfRvkp4N0VMEwBBYDEUAAQQQ8BfgGkB/q7AjCYCVEwBPl3ScpDWSFhYJgJMlTZF0kaRXJE2XNEjSUZLeL9EYF0j6iaTLJP1a0n9IOl/SpyRt9WwmAqAnFMMQQAABBMIJFN4F/MUvfnGfYvcbwfwWcDjTxtEEwMoJgIV7eHezAOhm/96QNEfS7PzAbpLelHSxpHtLtIcLfb+R9K/516slbZL0A0nf8WwpAqAnFMMQQAABBMIJND4HcPv27TrwwAP3KXZ/37VrV34LOBxrbjQBMB0B8AhJL0k6RtILBX3wdP7P/7dIb7jfzNkhaUyzU8l35U8hn1OinzpIcv80Ll0kba6rq8t9CVkQQAABBBCIS4AZwLgk910PATAdAXBo/pq/gyVtKdjNP5PkZgvdqd7mixv7uiRXu7rgRXc71QmSvlCi7W6QdH3z1wiA5fuSsmYEEEAgqwJcA1i+PU8AJACGDYDMAJbv+8iaEUAAAQSaCTQ+B3DkyJH7/BbwokWLeA5gxI4hAKYjACZ5Crh5q3ENYMQvH2UIIIAAAn4CLgReeeWV2rhxY1OB+y3g2bNna/To0X4rYdReAgTAdATAxptA3A0g7kYQt7hg5u7kDboJxD3yxT36xS3uJpDXJP2Qm0A4UiCAAAIItCUBdzp4xYoV2rJli3r16qVhw4apXbt2bekjVtRnIQBWTgB0tz/1zXfX85ImSlom6c/50OYeA3NNs8fAfKbZY2CelPRgPuC5VblrA91NH5fmn/3nHgPzFUn983cQ+zQzM4A+SoxBAAEEEDAJEABNfPsUEwArJwAOzwe+5jvRBTg3y9f4IOhv5O/iXSnpCkkbCgrc3PmPJbkbORoX9wgY94Bp9yBodwfxv+efCejbaQRAXynGIYAAAghEEih2CrhPnz6aM2cOp4AjifIYGMfmghNLdAECYHQ7KhFAAAEEAgQabwI588wzxU/BxdcuzAASAK3dRAC0ClKPAAIIIFBUoPExMB/96Ee1detWvfaau0z978snPvEJ9ezZU2+//bZqa2u5HjBkDxEACYAhW2af4QRAqyD1CCCAAAJFBRofBO1e7Nixo+rr65vGFf552bJlGj7cXSnF4itAACQA+vZKqXEEQKsg9QgggAACRQXuvvtuTZgwIfeaOwV8xhlnNAXBJUuWaPHixbnX5s+fr/Hjx6MYQoAASAAM0S5FhxIArYLUI4AAAggUFbj11ltzz/877LDDtHv37n1OAVdVVenVV1/N3QwycaJ7OAaLrwABkADo2yvMAFqlqEcAAQQQCCVw7bXXaubMmbmalk4BT506VTfddFOodWd9MAGQAGj9DjADaBWkHgEEEECgqEBhAPzYxz6m6dOny/0knPsJuOuuu05vvvlmro4AGL6BCIAEwPBds3cFAdAqSD0CCCCAQFGB7373u5o0aVJu9q9Hjx57nQJ2p4XdncHuxpBbbrlFV1/tHmnL4itAACQA+vZKqXEEQKsg9QgggAACgTOABxxwgN5///2mcYV/ZgYwfAMRAAmA4buGGUCrGfUIIIAAAh4C7jTvjBkzciOrq6vV0NDQVOV+B9g9J9At06ZNy50eZvEXIAASAP27pfhIZgCtgtQjgAACCBQV+MUvfqFTTjlFnTt3lnsYtLvjt3FxPwW3bds2vffee3r88cf15S9/GcUQAgRAAmCIdik6lABoFaQeAQQQQKCowJNPPqmTTz4591r79u21c+fOpnGFf37iiSd00kknoRhCgABIAAzRLgRAKxb1CCCAAAL+AgsWLNC4ceMCC+655x6NHTs2cBwD9ggQAAmA1u8DM4BWQeoRQAABBAJnAJs/B7BTp07asWNHro4ZwPANRAAkAIbvmr0rCIBWQeoRQAABBIoKuGv7Tj31VP3DP/yDNm7cqClTpqi2tlb9+vXTrFmz5K4D/POf/6ylS5fmrhVk8RcgABIA/bul+EgCoFWQegQQQACBogKFdwG3RMRdwOEbiABIAAzfNcwAWs2oRwABBBDwECAAeiBFHEIAJABGbJ2mMmYArYLUI4AAAggUFXCndk877bTca6effrqOPPLI3C9/uOsBN2zYoEcffTT32mOPPZY7VcziL0AAJAD6d0vxkQRAqyD1CCCAAAJFBWbPnt30E2/777+//va3vzWNK/yz+8m4q666CsUQAgRAAmCIdik6lABoFaQeAQQQQKCowLnnnquamppAnVGjRunBBx8MHMeAPQIEQAKg9ftAALQKUo8AAgggUFRgwoQJuvvuuwN1xo8fr/nz5weOYwABsLAHqmgIkwAB0MRHMQIIIIBAKQH3qJepU6fmXj7ooIM0aNAg7d69W1VVVfrd736nt99+O/fazJkzc4+IYfEXYAaQGUD/bik+kgBoFaQeAQQQQKCowIUXXqj77rsvUOeCCy7QvffeGziOAcwAMgMY37eAABifJWtCAAEEECgQcDN+a9euDTQZOHBgbkaQxV+AGUBmAP27hRlAqxX1CCCAAAIhBIYOHarVq1fnKtq1a6ddu3Y1VRf++dhjj9WqVatCrJmhBEACoPVbwAygVZB6BBBAAIGiAmeffbYeeeSRQJ2zzjpLDz/8cOA4BuwRIAASAK3fBwKgVZB6BBBAAIGiApdeeqn+53/+J1DnG9/4hu64447AcQwgABb2AHcB274RBECbH9UIIIAAAiUErrjiCt1+++2BPpdffrluu+22wHEMIAASAOP7FhAA47NkTQgggAACBQLXXHONbr755kCTyZMn6zvf+U7gOAYQAAmA8X0LCIDxWbImBBBAAIECAR4EXb524BpArgG0dhcB0CpIPQIIIIBAUQECYPkagwBIALR2FwHQKkg9AggggEBRAXdq95ZbbgnUmTRpktep4sAVZWgAAZAAaG13AqBVkHoEEEAAgaIC7u7euXPn5l5zP//mfgaucSn88yWXXOJ1tzDMewQIgARA6/eBAGgVpB4BBBBAoKjAcccd5/WAZ/fA6GeeeQbFEAIEQAJgiHYpOpQAaBWkHgEEEECgqAA/BVe+xiAAEgCt3UUAtApSjwACCCBQVODCCy/Ufffdl3utQ4cO+uCDD5rGFf75ggsu0L333otiCAECIAEwRLswA2jFoh4BBBBAwF/A3QDibgRxS3V1tRoaGpqKC//snhXobgRh8RcgABIA/bul+EhmAK2C1COAAAIIFBW49tprNXPmzECdqVOn6qabbgocx4A9AgRAAqD1+0AAtApSjwACCCBAAEy4BwiABEBryxEArYLUI4AAAggUFfj2t7+t66+/PlDnxhtv1Le+9a3AcQxgBrCwB6poCJMAAdDERzECCCCAQCmB3r17a/PmzYFAhx56qDZt2hQ4jgEEwLQGwI2SDivS4LdJ+pcif3+xpB81+3t3i9UBIb4kBMAQWAxFAAEEEPAX6NSpk+rr6wMLOnbsqB07dgSOYwABMK0BsIekdgUbN1DSLySNkLS8RAD8T0mfKnjNPWb9zRBfEgJgCCyGIoAAAgj4CxAA/a3CjuQawHRfA/h9SSMl9ZO05/dz9nSJmwF0Y7qHbZyC8QRAAx6lCCCAAAKlBY444gi98sorgUSHH364Xn755cBxDGAGMK0zgIXb1V7SG5JulVTqHnoXAOdJet09YknSc5KmSvp9C1+SDu55nAWvd5G0ua6uTl27uizIggACCCCAQDwCgwcP1vPPPx+4smOOOUbPPef+FcbiK8AMYHpnAL8i6R5Jn8gHwWI9cWx+dvBFSd0kXSXpeEmfdqGuRBPdIGmfW7IIgL5fOcYhgAACCPgKFP4SSEs1/BKIrygzgFmYAVwqaaeks0K0xf6S1klaIOm6EnXMAIYAZSgCCCCAQHQBAmB0u6BKZgDTOQPo7gR2F0OMlvRQUBM0e/3nkj6UNNazjmsAPaEYhgACCCAQTuDEE0/UsmXLAotGjBihp556KnAcA5gBTPsMoDtNe6mk3vkw59vz7g5id/3fEkkTPYsIgJ5QDEMAAQQQCCcwYMAArV+/PrCof//+WrfOncBi8RVgBjB9M4DuZg53y5Q7jXtNs0b4Sf6Gjyn5v3ePTf+VpD/l7wS+WtIoSUMk/cGziQiAnlAMQwABBBAIJ3DggQfqvffeCyzq3Lmz/vrXvwaOYwAzgGmeATxFkrv+zz3bb0OzZnfPAnQPi3Z3/7rle/nTxB+X9BdJayRNkxR8y9WeFRMAOaIggAACCJRFoEOHDtq5013O3vLSvn17ffCB+x0DFl8BZgDTNwPou+/jGkcAjEuS9SCAAAII7CXQvXt3uadMBC3dunXTO++8EzSM1wsECIAEQOsXggBoFaQeAQQQQKCowKBBg7R27dpAnYEDB+p3v/td4DgG7BEgABIArd8HAqBVkHoEEEAAgaICPXv21LZt2wJ1evTooa1btwaOYwABsLAHqmgIkwAB0MRHMQIIIIBAKYGOHTvq/fffDwQ64IADVF9fHziOAQRAAmB83wICYHyWrAkBBBBAoECgXbt2amhoCDSprq7Wrl27AscxgABIAIzvW0AAjM+SNSGAAAIIFAhUVfmfpNu9ezd2IQS4BpBrAEO0S9GhBECrIPUIIIAAAkUFCIDlawwCIAHQ2l0EQKsg9QgggAACBMCEe4AASAC0thwB0CpIPQIIIIAAATDhHiAAEgCtLUcAtApSjwACCCBAAEy4BwiABEBryxEArYLUI4AAAggUFdhvv/287u51dwt/+OGHKIYQIAASAEO0S9GhBECrIPUIIIAAAkUF3G/8/u1vfwvU2X///b1+MzhwRRkaQAAkAFrbnQBoFaQeAQQQQKCogAt2PjN7bqbQJyjCvEeAAEgAtH4fCIBWQeoRQAABBDgFnHAPEAAJgNaWIwBaBalHAAEEECAAJtwDBEACoLXlCIBWQeoRQAABBIoK8CDo8jUGAZAAaO0uAqBVkHoEEEAAAQJgwj1AACQAWluOAGgVpB4BBBBAgACYcA8QAAmA1pYjAFoFqUcAAQQQIAAm3AMEQAKgteUIgFZB6hFAAAEECIAJ9wABkABobTkCoFWQegQQQAABAmDCPUAAJABaW44AaBWkHgEEEECAAJhwDxAACYDWliMAWgWpRwABBBAgACbcAwRAAqC15QiAVkHqEUAAAQQIgAn3AAGQAGhtOQKgVZB6BBBAAAECYMI9QAAkAFpbjgBoFaQeAQQQQIAAmHAPEAAJgNaWIwBaBalHAAEEECAAJtwDBEACoLXlCIBWQeoRQAABBAiACfcAAZAAaG05AqBVkHoEEEAAAQJgwj1AACQAWluOAGgVpB4BBBBAgACYcA8QAAmA1pYjAFoFqUcAAQQQIAAm3AMEQAKgteUIgFZB6hFAAAEECIAJ9wABkABobTkCoFWQegQQQAABAmDCPUAAJABaW44AaBWkHgEEEECAAJhwDxAACYDWliMAWgWpRwABBBAgACbcAwRAAqC15QiAVkHqEUAAAQQIgAn3AAGQAGhtOQKgVZB6BBBAAAECYMI9QAAkAFpbjgBoFaQeAQQQQIAAmHAPEAAJgNaWIwBaBalHAAEEECAAJtwDBEACoLXlCIBWQeoRQACBjArs2LFD69evL7n1Q4YM8ZZZs2ZNi2P79++vTp06ea8v7QMJgARAa48TAK2C1COAAAIZFXjuuecUJuRZmFxAHDx4sGUVqaolAKYnAN4g6fpm3flHSf1b6NjzJU2X1EdSraTJkpaE7HACYEgwhiOAAAII/F0gaAbw1FNP1VtvvRXI9dGPflRLly5lBjBQas8AAmC6AuAYSScX7P8PJZX65gyV9EtJUyQtkjQuHwDdfx6tDdFDBMAQWAxFAAEEEPAX2LZtm3r27BlYsHXrVvXo0SNwHAMIgIU9UJWShnAzgKMkHe25PfdJ6ixpZMH4X0l6QdJlnutwwwiAIbAYigACCCAQTqB79+6qq6srWdStWze988474VbKaDEDmK4ZwKsluW/J+5JW52f3XivR5+7vb5X0/YLXb8yHyM+28N3oIMn907h0kbTZfTm7dnVZkAUBBBBAAIF4BUqFQMJfdGcCYHoC4OmSDpTkrvvrlb8e8BBJAyVtL9IiOyVdJGlBwWtX5Os+1kJLFbvWMPdfZwTA6F9EKhFAAAEEWhZwp4OPPvpovfHGGzr44IP1wgsvcNrX0DQEwPQEwOZt0F3Sq5ImSrozxgDIDKDhC0cpAggggEB0gca7hrmjN7phYyUBML0B0O3j30h6In8quHm3RD0F3Hw9XANo/x6yBgQQQAABDwECoAeS5xACYHoDoDsd7EKeO2X7X0X6wd0E4p6IeVbBa6skvchNIJ7fHoYhgFbQyAIAACAASURBVAACCCQqQACMj5sAmJ4AOFvSI/nTvgdLcjd0uDuCj5K0TdJPJL1eMBvoHgPztKRrJC2WdKGkqZJ4DEx83y/WhAACCCAQowABMD5MAmB6AuC9ko6XdFA+8K2UdK2kl/LtslzSRkkXF7SPexD0jIIHQU/iQdDxfblYEwIIIIBAvAIEwPg8CYDpCYDxdUW4NXENYDgvRiOAAAIIRBQgAEaEK1JGACQAWruJAGgVpB4BBBBAwEuAAOjF5DWIAEgA9GqUFgYRAK2C1COAAAIIeAkQAL2YvAYRAAmAXo1CALQyUY8AAgggYBUgAFoF99QTAAmA1m5iBtAqSD0CCCCAgJcAAdCLyWsQAZAA6NUozABamahHAAEEELAKEACtgswAFgpWxceZyTUxA5jJ3c5GI4AAAskLEADjM2cGkBlAazcRAK2C1COAAAIIeAkQAL2YvAYRAAmAXo3CKWArE/UIIIAAAlYBAqBVkFPAnAKOr4eYAYzPkjUhgAACCLQgQACMrz2YAWQG0NpNBECrIPUIIIAAAl4CBEAvJq9BBEACoFejcArYykQ9AggggIBVgABoFeQUMKeA4+shZgDjs2RNCCCAAAKcAk6kB5gBZAbQ2mgEQKsg9QgggAACXgLMAHoxeQ0iABIAvRqFU8BWJuoRQAABBKwCBECrIKeAOQUcXw8xAxifJWtCAAEEEOAUcCI9wAwgM4DWRiMAWgWpRwABBBDwEmAG0IvJaxABkADo1SicArYyUY8AAgggYBUgAFoFOQXMKeD4eogZwPgsWRMCCCCAAKeAE+kBZgCZAbQ2GgHQKkg9AggggICXADOAXkxegwiABECvRuEUsJWp5fqdO3fqtttu00svvaRPfvKTuuKKK9S+ffvyvilrRwABBCpMgAAY3w4jABIArd3EDKBRcNKkSbr11lu1a9eupjW1a9dOEydO1C233GJcO+UIIIBAegQIgPHtSwIgAdDaTQRAg6ALf9/97ndVXV2thoaGpjU1/vnqq68mBBp8KUUAgXQJEADj258EQAKgtZsIgBEF3Wnfjh075oLfmWeeqWnTpmngwIFau3atZsyYocWLF+eCYX19PaeDIxpThgAC6RIgAMa3PwmABEBrNxEAIwrOmTNHV111lT7zmc9o1apVmjx5smpra9WvXz/dfPPNGjp0qF588UXNnj1bV155ZcR3oQwBBBBIjwABML59SQAkAFq7iQAYUfDcc89VTU2NvvCFL+jXv/71Pmv5/Oc/r2effVajRo3Sgw8+GPFdKEMAAQTSI0AAjG9fEgAJgNZuIgBGFPynf/onzZ8/P1ft7vh1N318/etf17x583I3hbhTxG6ZMGGCfvrTn0Z8F8oQQACB9AgQAOPblwRAAqC1mwiAEQUffvhhnXPOOblq90Vcs2aNtmzZol69emnIkCHq2tXRSg899JDOPvvsiO9CGQIIIJAeAQJgfPuSAEgAtHYTATCi4OWXX67//u//Dqy+7LLLdPvttweOYwACCCCQdgECYHx7mABIALR2EwEwouCpp56qxx9/PLD6lFNO0dKlSwPHMQABBBBIuwABML49TAAkAFq7iQAYUZAZwIhwlCGAQGYFCIDx7XoCIAHQ2k0EwIiCCxcu1HnnnddUfdJJJ+Wu/3PXAT755JNNf//AAw9o9OjREd+FMgQQQCA9AgTA+PYlAZAAaO0mAmBEQRf4nnrqqcDqE088ca9AGFjAAAQQQCClAgTA+HYsAZAAaO0mAmBEwZ49e2rbtm2B1T169NDWrVsDxzEAAQQQSLsAATC+PUwAJABau4kAGFHw0EMP1euvvx5Yfcghh2jz5s2B4xiAAAIIpF2AABjfHiYAEgCt3UQAjCjofv93yZIlgdVnnHFG7neBWRBAAIGsCxAA4+sAAiAB0NpNBMCIghdccIF+9rOfBVZ/5Stf0X333Rc4jgEIIIBA2gUIgPHtYQIgAdDaTQTAiILHHXecVq1aFVg9dOhQPfPMM4HjGIAAAgikXYAAGN8eJgASAK3dRACMKHj00Ufrt7/9bWD1Zz/7Wb3wwguB4xiAAAIIpF2AABjfHiYAEgCt3UQAjCj4kY98RO+8806u2v0qSOfOnXN/7t69u957772mX/9wf/7LX/4S8V0oQwABBNIjQACMb18SAAmA1m4iAEYUdIFvx44dueqqqirt3r27aU3V1dVqaGjI/blTp065QMiCAAIIVIJAbW2ttm/fXpaPum7dOk2YMEHz58/XgAEDyvIebqVdunRRv379yrb+trBiAmB6AuAUSe7nIvpLqpfkLi6bLOmPLTTaxZJ+1Oz1DyQdEKI5CYBFsFywW79+fYuMo0aN0qZNmwKpe/furZqampLj+vfvnwuJLAgggEBrC7jwd+SRR7b2x4jl/Tds2JDqEEgATE8AfEzSvZJ+I2k/STMlDZR0lKRS00cuAP6npE8VfFvcNNSbIb49BMAiWI2nKUI4Rh66Zs0aDR48OHI9hQgggEBcAo3HvnLN0NXX12vjxo3q06ePOnbsGNfH3ms9jbOMaT+2EgDTEwCbfxF6SHI/H3GCpF+W+Ja4APh9Sd0N3yICYMQZwF27dunYY4+V+99SS7t27bR69Wq5/y21MANo6F5KEUAgVoE0XKOXhm3w2akEwPQGwL6SaiUNkrS2hQA4T5L7OYpqSc9Jmirp9y00TwdJ7p/GpYukzXV1dera1WVBljACCxcu1HnnnVey5IEHHtDo0e7MPgsCCCDQ9gXSEJ7SsA0+nUIATGcAdGHu4fzM3pdaaIRjJbmrXF+U1E3SVZKOl/RpF+pK1N0g6frmrxEAfb5uxce4EPjNb35Tr732WtOAww47TLfeeivhLzorlQgg0AoCaQhPadgGn11PAExnALxd0umSXPgL8yOy+0taJ2mBpOtKNBAzgD7frJBj3GngO++8U5deeqnuuOMOfe1rX2vxtG/I1TMcAQQQSEQgDeEpDdvgs7MJgOkLgD+UdE5+Ju8VnyZoNubnkj6UNNazlmsAPaGChmXloBPkwOsIIFC5Amk4jqVhG3w6iACYngBYJekHks6VNDx//Z9PDxSOcXcauOv/lkia6FlMAPSEChqWlYNOkAOvI4BA5Qqk4TiWhm3w6SACYHoC4G2SxuVn/wqf/VeXfy6g64ef5G/4cM8MdMu3JP1K0p/y1wteLWmUpCGS/uDTQJIIgJ5QQcOyctAJcuB1BBCoXIE0HMfSsA0+HUQATE8A3PMzEnvv+a9K+nH+r5ZL2ijJPf7FLd/LPzz645Lcb42tkTRN0vM+zZMfQwAMgdXS0KwcdGLiYjUIINAGBdJwHEvDNvi0BgEwPQHQZ3+XYwwBMCbVrBx0YuJiNQgg0AYF0nAcS8M2+LQGAZAA6NMnLY0hAFoF8/VZOejExMVqEECgDQqk4TiWhm3waQ0CIAHQp08IgFYlj/qsHHQ8KBiCAAIVKpCG41gatsGnfQiABECfPiEAWpU86rNy0PGgYAgCCFSoQBqOY2nYBp/2IQASAH36hABoVfKoz8pBx4OCIQggUKECaTiOpWEbfNqHAEgA9OkTAqBVyaM+KwcdDwqGIIBAhQqk4TiWhm3waR8CIAHQp08IgFYlj/qsHHQ8KBiCAAIVKpCG41gatsGnfQiABECfPiEAWpU86rNy0PGgYAgCCFSoQBqOY2nYBp/2IQASAH36hABoVfKoz8pBx4OCIQggUKECaTiOpWEbfNqHAEgA9OkTAqBVyaM+KwcdDwqGIIBAhQo8/+wqfe2cYbr77rs1oH//ityKdevXa/z48brzoRU65vNDK3IbfD40AZAA6NMnBECrkkc9AdADiSEIINCmBdY9da8G/PLSNv0ZfT/cuuPv0IATL/QdXnHjCIAEQGvT8ksgVsF8PQEwJkhWgwACrSbADGCr0Yd+YwIgATB00zQrIABaBQmAMQmyGgQQaG2BNPyHbBq2wacPCIAEQJ8+aWkMAdAqSACMSZDVIIBAawukITylYRt8+oAASAD06RMCoFXJoz4rBx0PCoYggECFCqThOJaGbfBpHwIgAdCnTwiAViWP+qwcdDwoGIIAAhUqkIbjWBq2wad9CIAEQJ8+IQBalTzqs3LQ8aBgCAIIVKhAGo5jadgGn/YhABIAffqEAGhV8qjPykHHg4IhCCBQoQJpOI6lYRt82ocASAD06RMCoFXJoz4rBx0PCoYggECFCqThOJaGbfBpHwIgAdCnTwiAViWP+qwcdDwoGIIAAhUqkIbjWBq2wad9CIAEQJ8+IQBalTzqs3LQ8aBgCAIIVKhAGo5jadgGn/YhABIAffqEAGhV8qjPykHHg4IhCCBQoQJpOI6lYRt82ocASAD06RMCoFXJoz4rBx0PCoYggECFCqThOJaGbfBpHwIgAdCnTwiAViWP+qwcdDwoGIIAAhUqkIbjWBq2wad9CIAEQJ8+IQBalTzqs3LQ8aBgSJkEduzYofXr13uvvb6+Xhs3blSfPn3UsWNH77r+/furU6dO3uMZmB6BlStXatiwYZo7d64GDx4c+4ZF7ckwH2TdunWaMGGC1qxZU5ZtCPNZyjmWAEgAtPYXvwVsFczXEwBjgmQ1JQUae6zcRGn/F2e5/Sp5/fPmzdMll1xSyZvQ9Nk3bNigfv36pWJbim0EAZAAaG1uAqBVkAAYkyCrCRIIOwPYOBMyf/58DRgwIGj1Ta8zA+hNlbqBb731lmpqalSuHojak2Ghu3Tpkurw5zwIgATAsN+L5uMJgFZBAmBMgqwmbgFmpeMWZX1WAXrSKrinngBIALR2EwHQKkgAjEmQ1cQtwL9s4xZlfVYBetIqSAAsFKyKjzOTayIAxrTbObDFBJmh1dTW1mr79u1l22JOt5WNlhVHFOA4GRGuSBkzgMwAWrspMwEwDf+yzcJ1LdaGrpR6149HHnlkpXzcwM+Z9gvuAwEY4CVAAPRi8hpEACQAejVKC4MyEQDT9C9b/kVrbfm2Ud/4L8KwN2iE+fQ8ciOMFmOTECAAxqdMACQAWrspEwEwDf+yzcqzrawNXSn1afkXYVq2o1L6ptI/J/0S3x4kABIArd2UqQBYyc8348BpbfW2VZ+W/ZmW7Whb3ZHeT0O/xLdvCYAEQGs3EQCtggnVc+BMCDqht3n+2VX62jnDdPfdd2tA//4JvWv8b7Nu/XqNHz9edz60Qsd8fmj8b8AaUyXAcSy+3UkAJABau4kAaBVMqJ4DZ0LQCb3Nuqfu1YBfXprQu5X/bdYdf4cGnHhh+d+Id6hoAY5j8e0+AiAB0NpNBECrYEL1HDgTgk7obZgBTAiat2lTAhzH4tsdBEACoLWbCIBWwYTqOXAmBJ3Q26Rlf6ZlOxLa7Zl/G/olvhYgABIArd1EALQKJlTPgTMh6ITeJi37My3bkdBuz/zb0C/xtQABkABo7SYCoFUwoXoOnAlBJ/Q2K1eu1LBhwzR37lwNHjy4LO/KcwDLwspKDQIcxwx4zUoJgARAazcRAK2CCdVz4EwIOqG3mTdvni655JKE3q38b8MDystvnIZ34DgW314kAKYvAP6LpKslfVzSbyX9m6RnW2iZ8yVNl9RHUq2kyZKWhGgxAmAIrNYcyoGzNfXjf++33npLNTU16t+/vzp16hT/G0jit4DLwspKDQIcxwx4zADug1cVH2err+kCST+RdJmkX0v6D0ku4H1K0tYin849dOuXkqZIWiRpXD4AuvNJaz23hgDoCdXawzhwtvYeqLz3p2cqb5+l/RPTk/HtYWYA0zUD6ELfbyT9a75FqiVtkvQDSd8p0jb3SeosaWTBa7+S9EI+RPp0GgHQR6kNjOHA2QZ2QoV9BHqmwnZYBj4uPRnfTiYApicAtpe0Q9IYSTUFLXKXpO6SzinSNq9JulXS9wteu1HSKEmfLdFmHSS5fxqXLpI219XVqWtXlwXTuaThmWv84kI6ezPMVu3YsUPr16/3Lol6Cricp6W9PzwDK0IgqZ50GPTl3i1BAExPADxY0uuS3Gnd1QW7+RZJJ0j6QpGjwU5JF0laUPDaFZKul/SxEkePG/Kv7/Vy2gNgmn51gV9cqIh/L5blQzbOnpRl5QUrreTfzC63DevfWyCpnnTvSl8SAJt//9JyDWBSAZAZwAr93VVmAPlXb9jZlqiPgWGmhV7zFUiqJ5kB3HePMAOYnhnApE4BN+8irgH0PdK18jiunWnlHcDbI4AAAm1IgACYngDo2srdBOIe+eIe/eIWdxOIu87vhy3cBOKeH3FWQU+ukvQiN4EUP01RyacQCIBt6MjLR0EAAQRaWYAAmK4A6B4D4276uDQfBN1jYL7irn2V9Gb+ETHuOkH32Be3uOsFn5Z0jaTFki6UNFUSj4Fp9sVMQ3hKwza08vGSt0cAAQRSI0AATFcAdI3pHgHT+CBo9ziXf8/PDLrXlkvaKOnigg52zwmcUfAg6Ek8CHrf73cawlMatiE1R142BAEEEGhlAQJg+gJg0i3FNYBJi0d8PwJgRDjKEEAAgRQKEAAJgNa2JgBaBROqJwAmBM3bIIAAAhUgQAAkAFrblABoFUyongCYEDRvgwACCFSAAAGQAGhtUwKgVTChegJgQtC8DQIIIFABAgRAAqC1TQmAVsGE6gmACUHzNggggEAFCBAACYDWNiUAWgUTqicAJgTN2yCAAAIVIEAAJABa2zQTAXDlypUaNmyY5s6dq8GD3WMS41+i/uyW7ydZt26dJkyYwO9h+oIxDgEEEEixAAGQAGht70wEwHnz5umSSy6xWrWJ+g0bNqhfv35t4rPwIRBAAAEEWkeAAEgAtHZeJgLgW2+9pZqaGpXzR+4bZ+jmz5+vAQMGWPdL0fouXboQ/soiy0oRQACByhIgABIArR2biQBoRfKp5xo9HyXGIIAAAgjEIUAAJABa+4gAaBXM1xMAY4JkNQgggAACgQIEQAJgYJMEDCAAWgUJgDEJshoEEEAAAV8BAiAB0LdXSo0jAFoFCYAxCbIaBBBAAAFfAQIgAdC3VwiAVqmAek4BlxmY1SOAAAIINAkQAAmA1q8DM4BWQWYAYxJkNQgggAACvgIEQAKgb68wA2iVYgawzIKsHgEEEEDAV4AASAD07RUCoFWKAFhmQVaPAAIIIOArQAAkAPr2CgHQKkUALLMgq0cAAQQQ8BUgABIAfXuFAGiVIgCWWZDVI4AAAgj4ChAACYC+vUIAtEoRAMssyOoRQAABBHwFCIAEQN9eIQBapQiAZRZk9QgggAACvgIEQAKgb68QAK1SBMAyC7J6BBBAAAFfAQIgAdC3VwiAVikCYJkFWT0CCCCAgK8AAZAA6NsrBECrFAGwzIKsHgEEEEDAV4AASAD07RUCoFWKAFhmQVaPAAIIIOArQAAkAPr2CgHQKkUALLMgq0cAAQQQ8BUgABIAfXuFAGiVIgCWWZDVI4AAAgj4ChAACYC+vUIAtEoRAMssyOoRQAABBHwFCIAEQN9eIQBapQiAZRZk9QgggAACvgIEQAKgb68QAK1SBMAyC7J6BBBAAAFfAQIgAdC3VwiAVikCYJkFWT0CCCCAgK8AAZAA6NsrBECrFAGwzIKsHgEEEEDAV4AASAD07RUCoFWKAFhmQVaPAAIIIOArQAAkAPr2CgHQKkUALLMgq0cAAQQQ8BUgABIAfXuFAGiVIgCWWZDVI4AAAgj4ChAACYC+vUIAtEoRAMssyOoRQAABBHwFCIAEQN9eIQBapQiAZRZk9QgggAACvgIEQAKgb68QAK1SBMAyC7J6BBBAAAFfAQIgAdC3VwiAVikCYJkFWT0CCCCAgK8AAZAA6NsrBECrFAGwzIKsHgEEEEDAV4AAmI4A2EfSdZJOlPRxSW9Imi/pJkk7W2iG5ZJOaPb6HZIu820gSV0l1dXV1alrV/d/WaIKPPfccxoyZIjWrFmjwYMHR10NdQgggAACCAQKEADTEQBPk3SBpAWS/iRpoKS5kn4q6aqAALhB0rcKxuyQ9G5g5+wZQAAMgdXSUAJgTJCsBgEEEEAgUIAAmI4AWGxHXy3pcklHBATAFyT9R2CnlB5AADTgFZYSAGOCZDUIIIAAAoECBMD0BsAZktzM4D8GBMBP6+8G/0/SI5KmS3KzgL4LAdBXKmAcATAmSFaDAAIIIBAoQABMZwDsK2lN/vSvOxVcavmGpFfz1wx+RtLNkp6VNLqFmg6S3D+NSxdJm7kGMPC71uKA+vp6XXTRRfr5z3+u888/X3fddZc6duxoWynVCCCAAAIIlBAgALbtAPgdSZMDuneApPUFYw6R9LQkd4PH10N2vruJ5ElJLkC+VKL2BknXN3+NABhSumD4qFGj9NBDD+2zgnPOOUc1NTXRV0wlAggggAACBMCSPeBOf7bVpYekgwI+3MsFd/oenA9+v5J0saSGkBvWWdJf86eOl5aoZQYwJGpLw0uFv8YaQmCM2KwKAQQQQKBJgBnAtj0DGKZV3czfsvyp3wmSdoUpzo89TtJKSZ+V9KJnPdcAekI1H+ZO+3bq1CmweseOHZwODlRiAAIIIIBAGAECYDoCoAt/7pSvu57vombhz93c4RY3xp3e/T/56/w+KWmcpCWS3pbkrgH8nruer8izAVvqKQJgER0X2tavLzwzv++gG2+8UQ8//HDg9/Xss8/W9dfvc9a9qa5///5eQTLwjRiAAAIIIJAZAQJgOgKgO937oxJd23iK2z0s+hVJI/JhsXf+YdHumYHu1O8mSQ9KcncP8xxA4yGg8Y5e42q8ynlwtBcTgxBAAAEECgQIgOkIgK3Z1MwARpwBdL/64bu4kFdqYQbQV5FxCCCAAAKNAgRAAqD120AAjChYVeV//9Hu3bsjvgtlCCCAAAII7CtAACQAWr8XBMCIgs0DoJsR7Nu3r/70pz/lfg+4cCEARkSmDAEEEECgqAABkABo/WoQACMKtmvXTg0NwU/qqa6u1q5dUW7qjvjBKEMAAQQQSL0AAZAAaG1yAmBEwe7du8s9QDto6datm955552gYbyOAAIIIICAtwABkADo3SwlBhIAIwq6n3y7//77A6vHjBmT+4k4FgQQQAABBOISIAASAK29RACMKPjP//zP+tGPSj29Z89Kv/rVr+p///d/I74LZQgggAACCOwrQAAkAFq/FwTAiIJHHXWU1q1bF1g9YMAA/eEPfwgcxwAEEEAAAQR8BQiABEDfXik1jgAYUbBnz57atm1bYHWPHj20devWwHEMQAABBBBAwFeAAEgA9O0VAqBVqln9wIED9fvf/z73twcccIDef//9phGFf/70pz+ttWvXxvzurA4BBBBAIMsCBEACoLX/mQGMKDhr1ixNnTo1V33QQQfpoosu0hFHHKGXX35Zd911l95+2/1EszRz5kxNmTIl4rtQhgACCCCAwL4CBEACoPV7QQCMKPj444/r1FNPDaxeunSpTjnllMBxDEAAAQQQQMBXgABIAPTtlVLjCIARBRcsWKBx48YFVt9zzz0aO3Zs4DgGIIAAAggg4CtAACQA+vYKAdAq1ax++fLlGjFihMaPHy8X8gp/7s39+seFF16Y+/tly5Zp+PDhMb87q0MAAQQQyLIAAZAAaO1/ZgAjCrqfd3O//Tto0CC52cDJkyertrZW/fr1080335yb9XM3f7i/cz8bx4IAAggggEBcAgRAAqC1lwiABsGFCxfqvPPOU8eOHVVfX9+0psY/P/DAAxo9erThHShFAAEEEEBgXwECIAHQ+r0gABoEGwNgVVXVXqeAG/9MADTgUooAAgggUFKAAEgAtH49CIARBd0p4IMPPjj3kOczzzxTZ5xxRtNM4JIlS7R48WK5h0W/8cYbnAKOaEwZAggggEBxAQIgAdD63SAARhR88skndfLJJ+tLX/qSnn76abkbPxqXhoYGHX/88XrmmWf0xBNP6KSTTor4LpQhgAACCCDAKeBiPVBFY5gECIAR+a677jrNmDFDLgieeOKJ+6zFBb8vf/nLmjZtmqZPnx7xXShDAAEEEECAAEgAjP9bQACMaEoAjAhHGQIIIICAWYBTwJwCtjYRATCiYNAp4BNOOEErV67kFHBEX8oQQAABBEoLEAAJgNbvBwEwoqC7CaRXr17atm2bRo4cmftd4IEDB+ae/ed+/3fRokXcBBLRljIEEEAAgZYFCIAEQOt3hABoECz1HMBOnTppx44d4jEwBlxKEUAAAQRKChAACYDWrwcB0CjoQuDEiRP16quvNq2pT58+mjNnDg+BNtpSjgACCCBQXIAASAC0fjcIgFZBSe508IoVK7Rly5bcaeFhw4bx7L8YXFkFAggggAABsFQP8BgY27eDAGjzoxoBBBBAAIHEBZgBZAbQ2nQEQKsg9QgggAACCCQsQAAkAFpbjgBoFaQeAQQQQACBhAUIgARAa8sRAK2C1COAAAIIIJCwAAGQAGhtOQKgVZB6BBBAAAEEEhYgABIArS1HALQKUo8AAggggEDCAgRAAqC15QiAVkHqEUAAAQQQSFiAAEgAtLYcAdAqSD0CCCCAAAIJCxAACYDWliMAWgWpRwABBBBAIGEBAiAB0NpyBECrIPUIIIAAAggkLEAAJABaWy4XADdt2qSuXd3/ZUEAAQQQQACBti7gAmDv3r3dx+wm6d22/nnL8fn4KTib6iGSNttWQTUCCCCAAAIItJLAoZJeb6X3btW3JQDa+J3fwZK221ZDtaQu+TDtvox40hJtQYCebAt7gc9QKEBPxtsPzvMNSbvjXW1lrI0AWBn7KQufMnc6PcvT8VnYyRW2jfRkhe2wDHxcejIDOzmpTSQAJiXN+wQJcGALEuL1pAXoyaTFeb8gAXoySIjXvQUIgN5UDCyzAAe2MgOz+tAC9GRoMgrKLEBPlhk4S6snAGZpb7ftbe0gaYqkWZI+aNsflU+XEQF6MiM7uoI2k56soJ3V1j8qAbCt7yE+HwIIIIAAAgggELMAATBmUFaHAAIIIIAAAgi0dQECnwpFcQAABIJJREFUYFvfQ3w+BBBAAAEEEEAgZgECYMygrA4BBBBAAAEEEGjrAgTAtr6H+HwIIIAAAggggEDMAgTAmEFZXWiB4yVdLWmIpF6SzpVUE3otFCAQn4C7G320pP6S6iWtkjRZ0h/jewvWhEAogcsluX/65Kt+L+nbkh4NtRYGI1AgQACkHVpb4HRJx0laI2khAbC1dwfvL+kxSfdK+o2k/STNlDRQ0lGS3kMIgVYQOEvSLkm1kty/ty/K/4fzMZJcGGRBILQAATA0GQVlFHC/x8gMYBmBWXUkgR6Stko6QdIvI62BIgTiF/hzPgTeGf+qWWMWBAiAWdjLlbONBMDK2VdZ+qR98zMvgyStzdKGs61tUqCdpPMl3SXJzQD+oU1+Sj5UmxcgALb5XZSpD0gAzNTuroiNrZb0sKTukr5UEZ+YD5lWAfcfIKslHSDpr5LGSVqS1o1lu8ovQAAsvzHv4C9AAPS3YmQyArdLctepuvC3OZm35F0QKCrQXtInJHWTNEbS1/OXJTADSMNEEiAARmKjqEwCBMAywbLaSAI/lHSOJHen+iuR1kARAuUTeELSS5IuLd9bsOY0CxAA07x3K2/bCICVt8/S+IndcfEH+RuShuev/0vjdrJNlS3wlKTXJF1c2ZvBp28tAQJga8nzvo0CB0pyF9m75XlJEyUtk+TucHMHNxYEkha4LX99lZv9K3z2X13+uYBJfx7eD4FZ+Wf+uWNil3x/umdTnirpF/AgEEWAABhFjZo4BdwMiwt8zRd3hxv/ZRunNOvyFXAz0cWWr0r6se9KGIdAjALuUS8n5R+W7/5D5EVJNxP+YhTO4KoIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgUIgBnc6WwyAggggAACCGRbgACY7f3P1iOAAAIIIIBABgX+Pz21yXZtN2cUAAAAAElFTkSuQmCC\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# if `whis` argument isn't passed, boxplot defaults to showing 1.5*interquartile (IQR) whiskers with outliers\n",
    "# Outliers are the circles beyond the whiskers.\n",
    "\n",
    "plt.figure()\n",
    "_ = plt.boxplot([ df['normal'], df['random'], df['gamma'] ] )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Heatmaps"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": 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"
    }
   ],
   "source": [
    "# loc is the centre or mean of the distribution.\n",
    "# scale is the SD of the distribution.\n",
    "# size is the number of samples. \n",
    "\n",
    "plt.figure()\n",
    "\n",
    "Y = np.random.normal(loc=0.0, scale=1.0, size=10000)\n",
    "X = np.random.random(size=10000)\n",
    "_ = plt.hist2d(X, Y, bins=25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": 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"
    }
   ],
   "source": [
    "plt.figure()\n",
    "_ = plt.hist2d(X, Y, bins=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.colorbar.Colorbar at 0x7febcca79cf8>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# add a colorbar legend\n",
    "plt.colorbar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Animations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.animation as animation\n",
    "\n",
    "n = 100\n",
    "x = np.random.randn(n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# create the function that will do the plotting, where curr is the current frame\n",
    "def update(curr):\n",
    "    # check if animation is at the last frame, and if so, stop the animation a\n",
    "    if curr == n: \n",
    "        a.event_source.stop()\n",
    "    plt.cla()\n",
    "    bins = np.arange(-4, 4, 0.5)\n",
    "    plt.hist(x[:curr], bins=bins)\n",
    "    plt.axis([-4,4,0,30])\n",
    "    plt.gca().set_title('Sampling the Normal Distribution')\n",
    "    plt.gca().set_ylabel('Frequency')\n",
    "    plt.gca().set_xlabel('Value')\n",
    "    plt.annotate('n = {}'.format(curr), [3,27]) # [3,27] are the coordinates of the annotated text on the graph!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": 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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAYlklEQVR4Xu3WQQEAAAgCMelf2iA3GzB8sHMECBAgQIAAAQIpgaXSCkuAAAECBAgQIHAGoCcgQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgACBB+4+AeEFWYvzAAAAAElFTkSuQmCC\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "a = animation.FuncAnimation(fig, update, interval=10) # 10 ms delay between frames."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Interactivity"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\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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CIiACIiACISMgARgyCZcwxUBERABERABERABCUD5gAiIgAiIgAiIgAiEjIAEYMgmXMMVAREQAREQAREQAQlA+YAIiIAIiIAIiIAIhIyABGDIJlzDFQEREAEREAEREAEJQPmACIiACIiACIiACISMgARgyCZcwxUBERABERABERABCUD5gAiIgAiIgAiIgAiEjIAEYMgmXMMVAREQAREQAREQAQlA+YAIiIAIiIAIiIAIhIyABGDIJlzDFQEREAEREAEREAEJQPmACIiACIiACIiACISMgARgyCZcwxUBERABERABERABCUD5gAiIgAiIgAiIgAiEjIAEYMgmXMMVAREQAREQAREQAQlA+YAIiIAIiIAIiIAIhIyABGDIJlzDFQEREAEREAEREAEJQPmACIiACIiACIiACISMgARgyCZcwxUBERABERABERABCUD5gAiIgAiIgAiIgAiEjIAEYMgmXMMVAREQAREQAREQAQlA+YAIiIAIiIAIiIAIhIyABGDIJlzDFQEREAEREAEREAEJQPmACIiACIiACIiACISMgARgyCZcwxUBERABERABERABCUD5gAiIgAiIgAiIgAiEjIAEYMgmXMMVAREQAREQAREQAQlA+YAIiIAIiIAIiIAIhIyABGDIJlzDFQEREAEREAEREIH/B+X9WAxEDPbxAAAAAElFTkSuQmCC\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "7"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plt.figure()\n",
    "data = np.random.rand(10)\n",
    "plt.plot(data)\n",
    "\n",
    "def onclick(event):\n",
    "    plt.cla()\n",
    "    plt.plot(data)\n",
    "    plt.gca().set_title('Event at pixels {},{} \\nand data {},{}'.format(event.x, event.y, event.xdata, event.ydata))\n",
    "\n",
    "# tell mpl_connect we want to pass a 'button_press_event' into onclick when the event is detected\n",
    "plt.gcf().canvas.mpl_connect('button_press_event', onclick)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>height</th>\n",
       "      <th>origin</th>\n",
       "      <th>weight</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.261996</td>\n",
       "      <td>Canada</td>\n",
       "      <td>0.972507</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.497171</td>\n",
       "      <td>Brazil</td>\n",
       "      <td>0.273131</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.362815</td>\n",
       "      <td>Germany</td>\n",
       "      <td>0.037290</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.980562</td>\n",
       "      <td>Iraq</td>\n",
       "      <td>0.196854</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.846853</td>\n",
       "      <td>China</td>\n",
       "      <td>0.793289</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.169947</td>\n",
       "      <td>Mexico</td>\n",
       "      <td>0.946880</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.847509</td>\n",
       "      <td>UK</td>\n",
       "      <td>0.599280</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.750711</td>\n",
       "      <td>Chile</td>\n",
       "      <td>0.715652</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.145350</td>\n",
       "      <td>USA</td>\n",
       "      <td>0.134514</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.899971</td>\n",
       "      <td>India</td>\n",
       "      <td>0.036752</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     height   origin    weight\n",
       "0  0.261996   Canada  0.972507\n",
       "1  0.497171   Brazil  0.273131\n",
       "2  0.362815  Germany  0.037290\n",
       "3  0.980562     Iraq  0.196854\n",
       "4  0.846853    China  0.793289\n",
       "5  0.169947   Mexico  0.946880\n",
       "6  0.847509       UK  0.599280\n",
       "7  0.750711    Chile  0.715652\n",
       "8  0.145350      USA  0.134514\n",
       "9  0.899971    India  0.036752"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from random import shuffle\n",
    "origins = ['China', 'Brazil', 'India', 'USA', 'Canada', 'UK', 'Germany', 'Iraq', 'Chile', 'Mexico']\n",
    "\n",
    "shuffle(origins)\n",
    "\n",
    "df = pd.DataFrame({'height': np.random.rand(10),\n",
    "                   'weight': np.random.rand(10),\n",
    "                   'origin': origins})\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": 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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G9/4J+1+8IMf8NjHPpajjz6as88+mzve8Y686EUvYp999tmSqwKoAGbfdApglqD9JSABCUhglAROOOEE3vCGN3DDG96QxzzmMTzxiU/8KQF8/etfzwMe8ABe8pKXcJOb3ITnP//5vPGNb+TEE0/kMpe5zAa3hz70obzjHe/gqKOOYq+99uIRj3gEF7zgBfnwhz+sAG5TWRcYZdUtbtAK4OJYeicJSEACElgTgQMOOIDrXe967LHHHrzsZS/jIhe5CA95yEM47LDDVhLRVa5ylQ35m54BDOm70Y1uxJFHHrkRxznnnMO+++7LIx/5SJ70pCexe/duLn3pS/Pa176We93rXhttPve5z3HNa16T448/npve9Kabxu8MoDOA2cJWALME7S8BCUhAAmsnEAL4iU98gkMOOYT73e9+G/J00EEHccwxx3CHO9xh0/he85rX8OAHP3jb2N/1rndxq1vdasfxbSaAP/zhD7n4xS/Om970Jg488MCf3OOBD3wg3/72t3nrW9/Ksccey+1vf3u+9a1vsffee/+kzZWvfOUNmYyZxc0uBVAB3LEod2igAGYJ2l8CEpCABNZOIATwRz/6ER/84Ad/Ekvss7vd7W7H4Ycfvml8Z511Fqeffvq2sV/hClfgYhe72I7j20wATz31VKL/cccdx81udrOf3OMJT3gC73//+/nIRz6yMfN38MEHb+z9m7wi9tve9rY861nPUgC3oO8S8I5luW0DBTDHz94SkIAEJFABgRDAa1/72sQDF/11t7vdjUte8pK84hWvWHqECuDSEf/UCyiAOeYKYI6fvSUgAQlIoAICIYA3uMENNh6y6K9Ydo1l1Xi4YrPLJeAKEpcIQQFMwAMUwBw/e0tAAhKQQAUE5hHAZS8BB5Z4CCSWc+Pol7jiIZArXelKG0/6Tj4E8rrXvY573vOeG23iCeH999/fh0B2qCsFMPfGUwBz/OwtAQlIQAIVEJhHALNhx0Men/nMZzZuc5e73IXf/u3f3viz5557st9++238fRwDEw99vPSlL90QwZihjKNj4knf/py/OAbmne9858ZM5a5duzaeEI4r9g5udfkQiA+BZOtXAcwStL8EJCABCaydwDoE8Mtf/jJXvepVf2rst7nNbXjf+973k7+PI2D6g6BjmfoFL3jBxsxgf/UHQccs4ORB0Je97GUVwG0qyxnA3NtOAczxs7cEJCABCUhg5QScAXQGMFt0CmCWoP0lIAEJSEACKyagACqA2ZJTALME7S8BCUhAAhJYMQEFUAHMlpwCmCVofwlIQAISkMCKCSiACmC25BTALEH7S0ACEpCABFZMQAFUALMlpwBmCdpfAhKQgAQksGICCqACmC05BTBL0P4SkIAEJCCBFRNQABXAbMkpgFmC9peABCQgAQmsmIACqABmS04BzBK0vwQkIAEJSGDFBBRABTBbcgpglqD9JSABCUhAAismoAAqgNmSUwCzBO0vAQlIQAISWDEBBVABzJacApglaH8JSEACEpDAigkogApgtuQUwCxB+0ugYgJXedI71hbdlw+/69pe2xeWwNAJKIAKYLbGFcAsQftLoGICCmDFyTE0CSQIKIAKYKJ8NroqgFmC9pdAxQQUwIqTY2gSSBBQABXARPkogFl49pdA7QQUwNozZHwSmI+AAqgAzlc55/VyBjBL0P4SqJiAAlhxcgxNAgkCCqACmCgfZwCz8OwvgdoJKIC1Z8j4JDAfAQVQAZyvcpwBzHKzvwSaIKAANpEmg5TAzAQUQAVw5qKZ6uAScJag/SVQMQEFsOLkGJoEEgQUwGEL4JOBewD7A98HjgOeCJw4UTPvA24zVUMvBR5SWFcKYCEom0mgRQIKYItZM2YJ7ExAARy2AL4bOBo4AbgQ8AzgOsC1gO925REC+F/AUyfK5XvAmTuXz0YLBbAQlM0k0CIBBbDFrBmzBHYmoAAOWwCnK+DSwBndjN8HJgTwk8Cjdy6XTVsogHOCs5sEWiCgALaQJWOUwOwEFMBxCeB+wOeB6wKfmhDAa/NjDqcBbweeDsQs4GbXRYH401+XAE7ZvXs3u3aFC3pJQAJDIqAADimbjkUC5xFQAMcjgBcE3gbsDdxy4k3wIOAk4FTgesCzgI92ewc3e68cBhw6/Q8KoD9WJDBMAgrgMPPqqCSgAI5HAF8M3LmTv1O2Kf3bAe8BYrbwC5u0cwbQnxsSGBEBBXBEyXaooyKgAI5DAI8E7gbcGvjSDhX+s8B3gDsBxxS8G9wDWADJJhJolYAC2GrmjFsC2xNQAIctgLGv7wjg7sAB3f6/nd4TtwA+BFwf+I+dGvsUcAEhm0igYQIKYMPJM3QJbENAARy2AL4IuF83+zd59t/u7lzAq3f//k7gm90ewOfFQx2bnA24VRk5A+iPGAkMmIACOODkOrRRE1AAhy2A525R3QcDRwH7Aq/uzgaMpd+TgbcAf+Y5gKP+ueDgJfATAgqgxSCBYRJQAIctgKuoWmcAV0HZ15DAmggogGsC78tKYMkEFEAFMFtiCmCWoP0lUDEBBbDi5BiaBBIEFEAFMFE+G10VwCxB+0ugYgIKYMXJMTQJJAgogApgonwUwCw8+0ugdgIKYO0ZMj4JzEdAAVQA56uc83o5A5glaH8JVExAAaw4OYYmgQQBBVABTJSPM4BZePaXQO0EFMDaM2R8EpiPgAKoAM5XOc4AZrnZXwJNEFAAm0iTQUpgZgIKoAI4c9FMdXAJOEvQ/hKomIACWHFyDE0CCQIKoAKYKB+XgLPw7C+B2gkogLVnyPgkMB8BBVABnK9yXALOcrO/BJogoAA2kSaDlMDMBBRABXDmonEJOIvM/hJoh4AC2E6ujFQCsxBQABXAWepls7buAcwStL8EKiagAFacHEOTQIKAAqgAJspno6sCmCVofwlUTEABrDg5hiaBBAEFUAFMlI8CmIVnfwnUTkABrD1DxieB+QgogArgfJVzXi9nALME7S+BigkogBUnx9AkkCCgACqAifJxBjALz/4SqJ2AAlh7hoxPAvMRUAAVwPkqxxnALDf7S6AJAgpgE2kySAnMTEABVABnLpqpDi4BZwnaXwIVE1AAK06OoUkgQUABVAAT5eMScBae/SVQOwEFsPYMGZ8E5iOgACqA81WOS8BZbvaXQBMEFMAm0mSQEpiZgAKoAM5cNC4BZ5HZXwLtEFAA28mVkUpgFgIKoAI4S71s1tY9gFmC9pdAxQQUwIqTY2gSSBBQABXARPlsdFUAswTtL4GKCSiAFSfH0CSQIKAAKoCJ8lEAs/DsL4HaCSiAtWfI+CQwHwEFUAGcr3LO6+UMYJag/SVQMQEFsOLkGJoEEgQUQAUwUT7OAGbh2V8CtRNQAGvPkPFJYD4CCqACOF/lOAOY5WZ/CTRBQAFsIk0GKYGZCSiACuDMRTPVwSXgLEH7S6BiAgpgxckxNAkkCCiACmCifFwCzsKzvwRqJ6AA1p4h45PAfAQUQAVwvspxCTjLzf4SaIKAAthEmgxSAjMTUAAVwJmLxiXgLDL7S6AdAgpgO7kyUgnMQkABVABnqZfN2roHMEvQ/hKomIACWHFyDE0CCQIKoAKYKJ+NrgpglqD9JVAxAQWw4uQYmgQSBBRABTBRPgpgFp79JVA7AQWw9gwZnwTmI6AAKoDzVc55vZwBzBK0vwQqJqAAVpwcQ5NAgoACqAAmyscZwCw8+0ugdgIKYO0ZMj4JzEdAAVQA56scZwCz3OwvgSYIKIBNpMkgJTAzAQVQAZy5aKY6uAScJWh/CVRMQAGsOH5Xvi8AACAASURBVDmGJoEEAQVQAUyUj0vAWXj2l0DtBBTA2jNkfBKYj4ACqADOVzkuAWe52V8CTRBQAJtIk0FKYGYCCqACOHPRuAScRWZ/CbRDQAFsJ1dGKoFZCCiACuAs9bJZW/cAZgnaXwIVE1AAK06OoUkgQUABVAAT5bPRVQHMErS/BComoABWnBxDk0CCgAKoACbKRwHMwrO/BGonoADWniHjk8B8BBRABXC+yjmvlzOAWYL2l0DFBBTAipNjaBJIEFAAFcBE+TgDmIVnfwnUTkABrD1DxieB+QgogArgfJXjDGCWm/0l0AQBBbCJNBmkBGYmoAAqgDMXzVQHl4CzBO0vgYoJKIAVJ8fQJJAgoAAqgInycQk4C8/+EqidgAJYe4aMTwLzEVAAFcD5Kscl4Cw3+0ugCQIKYBNpMkgJzExAAVQAZy4al4CzyOwvgXYIKIDt5MpIJTALAQVw2AL4ZOAewP7A94HjgCcCJ04UyR7AXwD3BS4KHAM8DDi9sJDcA1gIymYSaJGAAthi1oxZAjsTUACHLYDvBo4GTgAuBDwDuA5wLeC7XXm8GLgrcBCwGzgSOAe4xc7ls9FCASwEZTMJtEhAAWwxa8YsgZ0JKIDDFsDpCrg0cAZwG+ADwF7A14H7AW/qGsds4WeBmwH/unMJKYAFjGwigWYJKIDNps7AJbAtAQVwXAK4H/B54LrAp4DbAe8Bfg749kSlnAQ8H3hewfvHGcACSDaRQKsEFMBWM2fcEtiegAI4HgG8IPA2YG/gll1ZxMzfK7u9f5OV8lHgvd1+wekKin2C8ae/LgGcsnv3bnbtChf0koAEhkRAARxSNh2LBM4joACORwBjr9+dO/k7JSGAhwGHTr+JFEB/rEhgmAQUwGHm1VFJQAEchwDGgx13A24NfGmi7OdZAnYG0J8bEhgRAQVwRMl2qKMioAAOWwAvABwB3B04oNv/N1ng/UMgvwX8ffcP1wA+50Mgo/o54GAlsCUBBdDikMAwCSiAwxbAF3VP+Mbs3+TZf3HcS5wLGFcsDd+lOwbmzE4Y4+9vXljyPgRSCMpmEmiRgALYYtaMWQI7E1AAhy2A525RAgcDR3X/1h8EHbOAkwdBn7Zz+Wy0UAALQdlMAi0SUABbzJoxS2BnAgrgsAVw5wrIt1AA8wy9gwSqJaAAVpsaA5NAioACqACmCsgZwCw++0ugbgIKYN35MToJzEtAAVQA562dvp8zgFmC9pdAxQQUwIqTY2gSSBBQABXARPlsdFUAswTtL4GKCSiAFSfH0CSQIKAAKoCJ8lEAs/DsL4HaCSiAtWfI+CQwHwEFUAGcr3LO6+UMYJag/SVQMQEFsOLkGJoEEgQUQAUwUT7OAGbh2V8CtRNQAGvPkPFJYD4CCqACOF/lOAOY5WZ/CTRBQAFsIk0GKYGZCSiACuDMRTPVwSXgLEH7S6BiAgpgxckxNAkkCCiACmCifFwCzsKzvwRqJ6AA1p4h45PAfAQUQAVwvspxCTjLzf4SaIKAAthEmgxSAjMTUAAVwJmLxiXgLDL7S6AdAgpgO7kyUgnMQkABVABnqZfN2roHMEvQ/hKomIACWHFyDE0CCQIKoAKYKJ+NrgpglqD9JVAxAQWw4uQYmgQSBBRABTBRPgpgFp79JVA7AQWw9gwZnwTmI6AAKoDzVc55vZwBzBK0vwQqJqAAVpwcQ5NAgoACqAAmyscZwCw8+0ugdgIKYO0ZMj4JzEdAAVQA56scZwCz3OwvgSYIKIBNpMkgJTAzAQVQAZy5aKY6uAScJWh/CVRMQAGsODmGJoEEAQVQAUyUj0vAWXj2l0DtBBTA2jNkfBKYj4ACqADOVzkuAWe52V8CTRBQAJtIk0FKYGYCCqACOHPRuAScRWZ/CbRDQAFsJ1dGKoFZCCiACuAs9bJZW/cAZgnaXwIVE1AAK06OoUkgQUABrFMA7w+8EfhBIrer6qoAroq0ryOBNRBQANcA3ZeUwAoIKIB1CuA3gAsBrwdeDnx0BbUw70sogPOSs58EGiCgADaQJEOUwBwEFMA6BfAiwN2Ag4BfBU4EXgn8LfD1OfK8zC4K4DLpem8JrJmAArjmBPjyElgSAQWwTgGcTPflgAcADwSuDryjmxV8J3DukupiltsqgLPQsq0EGiOgADaWMMOVQCEBBbB+AYxU3hD4XeD3gDOAvbv/Hgx8sDDXy2qmAC6LrPeVQAUEFMAKkmAIElgCAQWwXgG8FPA7QEjeNYC3dzN/xwB7AocC9wSuuoS6mOWWCuAstGwrgcYIKICNJcxwJVBIQAGsUwDfAtwF+BLwMuBVm+z9uwxwGnDBwlwvq5kCuCyy3lcCFRBQACtIgiFIYAkEFMA6BTCEL8Rvu+XdCwBXA76whLqY5ZYK4Cy0bCuBxggogI0lzHAlUEhAAaxTAAvTV0UzBbCKNBiEBJZDQAFcDlfvKoF1E1AA6xTA53Uze0dOFcjDu1m/x667cCZeXwGsKBmGIoFFE1AAF03U+0mgDgIKYJ0CeApwIPCxqTKJp4HfClyxjvLZiEIBrCgZhiKBRRNQABdN1PtJoA4CCmCdAhhfAXftTfb37Qd8CtijjvJRACvKg6FIYCkEFMClYPWmElg7AQWwTgH8NPBC4EVTFRJLwI8Arrn2yjkvAGcAK0qGoUhg0QQUwEUT9X4SqIOAAlinAP4B8HzgcODYrlRuDzwBeBzwkjrKxxnAivJgKBJYCgEFcClYvakE1k5AAaxTAKMwHgn8EbBPVyWxL/Aw4BVrr5rzB+AMYGUJMRwJLJKAArhImt5LAvUQUADrFcC+SuK7gL8PfLuesjlfJApgpYkxLAksgoACuAiK3kMC9RFQAOsXwPqqxhnA2nNifBJYGAEFcGEovZEEqiKgANYpgJcGng3Evr/4yrfpr3u7SEVV5AxgRckwFAksmoACuGii3k8CdRBQAOsUwHcAV++eBP4acO5Uufx9HeWzEYUCWFEyDEUCiyagAC6aqPeTQB0EFMA6BfAs4NbAJ+ook22jUAAbSJIhSmBeAgrgvOTsJ4G6CSiAdQrgZ4HfAj5Zd/k4A9hAfgxRAikCCmAKn50lUC0BBbBOAbwT8CggzgOM419qvpwBrDk7xrYwAmMVobGOe2GF440kUCkBBbBOAfw6cAngwsCZwP9O1U88GFLLpQDWkgnjWCqBsYrQWMe91GLy5hKogIACWKcA/t4OtfHyCmqnD0EBrCgZhrI8AmMVobGOe3mV5J0lUAcBBbBOAayjOsqiUADLONmqcQJjFaGxjrvxcjV8CexIQAGsVwCvAhzUHQfzWOAM4FeBk4F4SKSWSwGsJRPGsVQCYxWhsY57qcXkzSVQAQEFsE4BvBXwbuCjwM2BawJfBJ4M/D/g3hXUjkvAFSXBUJZPYKwiNNZxL7+ifAUJrJeAAlinAB4HvAV4DhBnAl6/E8AbA3EI9L7rLZvzvbozgBUlw1CWR2CsIjTWcS+vkryzBOogoADWKYDfAa4LfGlKAGNZ+HPAHnWUz0YUCmBFyTCU5REYqwiNddzLqyTvLIE6CCiAdQrgV4F7AcdPCeDdgL/s9gWWVFB8m8jjgRsClwPuDvzDRMejgAdO3egYIM4hLL0UwFJStmuawFhFaKzjbrpYDV4CBQQUwDoFMCQvpC0k8AvADYBLA6/p/hxakNtocmfgFsDHgTdvIYD7AAdP3O9s4FuF93cGcAZQNm2bwFhFaKzjbrtajV4COxNQAOsUwIsCLwF+B/gZ4IfdodBvAO4P/N/Oqf2pFuduIYB7AwfOcb++izOACXh2bYfAWEVorONupzKNVALzEVAA6xTAPptX7fYC7gn8W7f/b75Mw1YCGPIXghmzfscCfwx8c5sXCTmNP/0V31hyyu7du9m1K1zQSwLDJDBWERrruIdZxY5KAucRUADrFsBF1upmAnhf4HvdwyZXB54BxAMoNwN+tMWLHwb81BK0ArjIVHmvrQisU0bWmZUvH37Xtb38Opmvc9xrA+4LS2BFBBTAOgXwr3fI/4PmqI/NBHD6Nlfr9hz+CvCeLV7DGcA54NtlMQTWKSOLGcF8d1mnCK2T+TrHPV+m7CWBdggogHUK4NunSujCwLWBWG79APAbc5RYiQDGbb/eLQO/tPA13ANYCMpmeQLrlJF89PPfYZ0itE7m6xz3/NmypwTaIKAA1imAm1XPhboHQz7THQUza4WVCOAVga90D4W8rfAFFMBCUDbLE1injOSjn/8O6xShdTJf57jnz5Y9JdAGAQWwHQGMiroG8L7uTL+SCouHR/brGn4COAR4L/A/3Z/YyxffLHJad7bgs7tZxjiEOo6DKbkUwBJKtlkIgXXKyEIGMOdN1ilC62S+znHPmSq7SaAZAgpgWwIYBzS/GrhUYYUd0AnfdPNXAQ/tDoX+JSCOgjkV+CfgT4DTC+8fzRTAGWDZNEdgnTKSizzXe50itE7m6xx3LmP2lkD9BBTAOgUwZuImrwt0s36x9y8E8GEVlZYCWFEyhh7KOmVknWzXKULrZL7Oca8z3762BFZBQAGsUwA/OJX8c7qHM+Kcvr8B/ncVxVH4GgpgISib5QmsU0by0c9/h3WK0DqZr3Pc82fLnhJog4ACWKcAtlE9P45SAWwpW43Huk4ZWSe6dYrQOpmvc9zrzLevLYFVEFAAFcBsnSmAWYL2LyawThkpDnIJDdcpQutkvs5xLyGN3lICVRFQAOsUwBP48Ve3lVw3Lmm0xDYK4BLheuvzE1injKwzF+sUoXUyX+e415lvX1sCqyCgANYpgPEQyIOB/wKO7wrhpt0xMHFA8+QRLfHU7jovBXCd9Ef22uuUkXWiXqcIrZP5Ose9znz72hJYBQEFsE4BjK+C+wbwR1NF8OfAPsDvr6I4Cl9DASwEZbM8gXXKSD76+e+wThFaJ/N1jnv+bNlTAm0QUADrFMBvAzcCPj9VRr8AfAzYq6LyUgArSsbQQ1mnjAydbY3jUwBrzIoxDYWAAlinAMZBzI8D/m6q0O4P/AVwmYoKUAGsKBlDD0UBHHqGzz8+BXBc+Xa0qyWgANYpgE8B4s9LgI92JXET4A+AZwKxFFzLpQDWkokRxKEAjiDJE0NUAMeVb0e7WgIKYJ0CGFVwP+BRwDW7kvgs8FfAa1dbIju+mgK4IyIbLIqAArgokm3cRwFsI09G2SYBBbBeAWylohTAVjI1gDgVwAEkcYYhKIAzwLKpBGYkoADWK4AhVvcArgY8D/gWcH3gDOBrM+Z5mc0VwGXS9d7nI6AAjqsgFMBx5dvRrpaAAlinAF4H+Bfge8C+3fl/XwSeAVwBeOBqy2TbV1MAK0rG0ENRAIee4fOPTwEcV74d7WoJKIB1CuA/A/8JPBY4s5v5CwG8BfBq4KqrLRMFsCLeow5FARxX+hXAceXb0a6WgAJYpwDGOYC/DPw3cNaEAF4F+Bywx2rLRAGsiPeoQ1EAx5V+BXBc+Xa0qyWgANYpgF8H7gB8ckoAfwU4CrjiastEAayI96hDUQDHlX4FcFz5drSrJaAA1imAr+i+7eM+3cMf1wN+CLwVOA74w9WWiQJYEe9Rh6IAjiv9CuC48u1oV0tAAaxTAH8OeDNwXWBv4GTg8sAJwJ2A76y2TBTAiniPOhQFcFzpVwDHlW9Hu1oCCmCdAthXwW26/X97Av8GHAOcu9oS2fHVfAp4R0Q2WBQBBXBRJNu4jwLYRp6Msk0CCmB9Anhh4B+BRwCfb6CsFMAGkjSUEBXAoWSybBwKYBknW0lgHgIKYH0CGHn8BnDT7ingefK6yj4K4Cppj/y1FMBxFYACOK58O9rVElAA6xTA+M7f2Of3lNWWw1yvpgDOhc1O8xBQAOeh1m4fBbDd3Bl5/QQUwDoF8PnAwd2Zfx8DvjtVSk+oqLQUwIqSMfRQFMChZ/j841MAx5VvR7taAgpgnQL4wW3KIB4CufVqy2TbV1MAK0rG0ENRAIeeYQVwXBl2tOskoADWJYBXA75U4ZO+29WoArjOd/DIXlsBHFfCnQEcV74d7WoJKIB1CeCPgMsBZ3Rl8Pru0OfTV1sWM72aAjgTLhtnCCiAGXrt9VUA28uZEbdDQAGsSwDPAS47IYCT3wNca1UpgLVmZoBxKYADTOo2Q1IAx5VvR7taAgqgApitOAUwS9D+xQQUwGJUg2ioAA4ijQ6iUgIKYF0CGEvAMQP49a5eYgYwvgc49gXWeimAtWZmgHEpgANMqjOA40qqo62GgAJYlwDGEvC7gLO7Cvl14NhNjoG5RzUVBApgRckYeigK4NAzfP7xOQM4rnw72tUSUADrEsBXFqY/zgis5VIAa8nECOJQAEeQ5EqGqHxWkgjDWBoBBbAuAVxaopd4YwVwiXC99fkJKIBWxKoIKICrIu3rrIuAAqgAZmtPAcwStH8xAQWwGJUNkwQUwCRAu1dPQAFUALNFqgBmCdq/mIACWIzKhkkCCmASoN2rJ6AAKoDZIlUAswTtX0xAASxGZcMkAQUwCdDu1RNQABXAbJEqgFmC9i8moAAWo7JhkoACmARo9+oJKIAKYLZIFcAsQfsXE1AAi1HZMElAAUwCtHv1BBRABTBbpApglqD9iwkogMWobJgkoAAmAdq9egIKoAKYLVIFMEvQ/sUEFMBiVDZMElAAkwDtXj0BBVABzBapApglaP9iAgpgMSobJgkogEmAdq+egAKoAGaLVAHMErR/MQEFsBiVDZMEFMAkQLtXT0ABVACzRaoAZgnav5iAAliMyoZJAgpgEqDdqyegACqA2SJVALME7V9MQAEsRmXDJAEFMAnQ7tUTUAAVwGyRKoBZgvYvJqAAFqOyYZKAApgEaPfqCSiACmC2SBXALEH7FxNQAItR2TBJQAFMArR79QQUQAUwW6QKYJag/YsJKIDFqGyYJKAAJgHavXoCCqACmC1SBTBL0P7FBBTAYlQ2TBJQAJMA7V49AQVQAcwWqQKYJWj/YgIKYDEqGyYJKIBJgHavnoACqABmi1QBzBK0fzEBBbAYlQ2TBBTAJEC7V09AAVQAs0WqAGYJ2r+YgAJYjMqGSQIKYBKg3asnoAAqgNkiVQCzBO1fTEABLEZlwyQBBTAJ0O7VE1AAhy2AtwYeD9wQuBxwd+AfJqryAsDTgD8A9gY+DDwU+PwMlasAzgDLpjkCCmCOn73LCSiA5axs2SYBBXDYAnhn4BbAx4E3byKATwSeDDwQ+BLwdOC6wLWAHxSWtAJYCMpmeQIKYJ6hdygjoACWcbJVuwQUwGEL4GRlnjslgDH7dyrwF8Bzu4Z7AacDBwFHF5a1AlgIymZ5AgpgnqF3KCOgAJZxslW7BBTA8Qrg1YAvAL8EfHKihN/f/f9HbVHWFwXiT39dAjhl9+7d7NoVLuglgeURUACXx9Y7n5+AAmhFDJ2AAjheAbx5t+fv8sDXJgr9DUDMFt5ni+I/DDh0+t8UwKH/qKhjfApgHXkwiuUSUD6Xy9e7/5iAAqgAziqAzgD602NtBBTAtaH3hVdIQAFcIewRv5QCOF4BnHcJePrt4h7AEf8AWfXQFcBVE/f11kFAAVwH9fG9pgI4XgHsHwKJB0DiQZC4QubO8CGQ8f0gaGXECmArmTLODAEFMEPPvqUEFMBhC+CewH5dMXwCOAR4L/A/wFeAOAbmSVPHwFzPY2BK3z62WzUBBXDVxH29dRBQANdBfXyvqQAOWwAP6IRvurJf1c3y9QdBP6g7CPpDwMOA/5rhreAS8AywbJojoADm+Nm7DQIKYBt5aj1KBXDYAriK+lQAV0HZ19ggoABaCGMgoACOIcvrH6MCqABmq1ABzBK0fzEBBbAYlQ0bJqAANpy8hkJXABXAbLkqgFmC9i8moAAWo7JhwwQUwIaT11DoCqACmC1XBTBL0P7FBBTAYlQ2bJiAAthw8hoKXQFUALPlqgBmCdq/mIACWIzKhg0TUAAbTl5DoSuACmC2XBXALEH7FxNQAItR2bBhAgpgw8lrKHQFUAHMlqsCmCVo/2ICCmAxKhs2TEABbDh5DYWuACqA2XJVALME7V9MQAEsRmXDhgkogA0nr6HQFUAFMFuuCmCWoP2LCSiAxahs2DABBbDh5DUUugKoAGbLVQHMErR/MQEFsBiVDRsmoAA2nLyGQlcAFcBsuSqAWYL2LyagABajsmHDBBTAhpPXUOgKoAKYLVcFMEvQ/sUEFMBiVDZsmIAC2HDyGgpdAVQAs+WqAGYJ2r+YgAJYjMqGDRNQABtOXkOhK4AKYLZcFcAsQfsXE1AAi1HZsGECCmDDyWsodAVQAcyWqwKYJWj/YgIKYDEqGzZMQAFsOHkNha4AKoDZclUAswTtX0xAASxGZcOGCSiADSevodAVQAUwW64KYJag/YsJKIDFqGzYMAEFsOHkNRS6AqgAZstVAcwStH8xAQWwGJUNGyagADacvIZCVwAVwGy5KoBZgvYvJqAAFqOyYcMEFMCGk9dQ6AqgApgtVwUwS9D+xQQUwGJUNmyYgALYcPIaCl0BVACz5aoAZgnav5iAAliMyoYNE1AAG05eQ6ErgApgtlwVwCxB+xcTUACLUdmwYQIKYMPJayh0BVABzJarApglaP9iAgpgMSobNkxAAWw4eQ2FrgAqgNlyVQCzBO1fTEABLEZlw4YJKIANJ6+h0BVABTBbrgpglqD9iwkogMWobNgwAQWw4eQ1FLoCqABmy1UBzBK0fzEBBbAYlQ0bJqAANpy8hkJXABXAbLkqgFmC9i8moAAWo7JhwwQUwIaT11DoCqACmC1XBTBL0P7FBBTAYlQ2bJiAAthw8hoKXQFUALPlqgBmCdq/mIACWIzKhg0TUAAbTl5DoSuACmC2XBXALEH7FxNQAItR2bBhAgpgw8lrKHQFUAHMlqsCmCVo/2ICCmAxKhs2TEABbDh5DYWuACqA2XJVALME7V9MQAEsRmXDhgkogA0nr6HQFUAFMFuuCmCWoP2LCSiAxahs2DABBbDh5DUUugKoAGbLVQHMErR/MQEFsBiVDRsmoAA2nLyGQlcAFcBsuSqAWYL2LyagABajsmHDBBTAhpPXUOgKoAKYLVcFMEvQ/sUEFMBiVDZsmIAC2HDyGgpdAVQAs+WqAGYJ2r+YgAJYjMqGDRNQABtOXkOhK4AKYLZcFcAsQfsXE1AAi1HZsGECCmDDyWsodAVQAcyWqwKYJWj/YgIKYDEqGzZMQAFsOHkNha4AKoDZclUAswTtX0xAASxGZcOGCSiADSevodAVQAUwW64KYJag/YsJKIDFqGzYMAEFsOHkNRS6AqgAZstVAcwStH8xAQWwGJUNGyagADacvIZCVwAVwGy5KoBZgvYvJqAAFqOyYcMEFMCGk9dQ6AqgApgtVwUwS9D+xQQUwGJUNmyYgALYcPIaCl0BVACz5aoAZgnav5iAAliMyoYNE1AAG05eQ6ErgApgtlwVwCxB+xcTUACLUdmwYQIKYMPJayh0BVABzJarApglaP9iAgpgMSobNkxAAWw4eQ2FrgAqgNlyVQCzBO1fTEABLEZlw4YJKIANJ6+h0BVABTBbrgpglqD9iwkogMWobNgwAQWw4eQ1FLoCqABmy1UBzBK0fzEBBbAYlQ0bJqAANpy8hkJXABXAbLkqgFmC9i8moAAWo7JhwwQUwIaT11DoCqACeBhw6FTNngjsX1jHCmAhKJvlCSiAeYbeoX4CCmD9ORpChAqgAhgCeC/gVyYK+v+AbxQWuAJYCMpmeQIKYJ6hd6ifgAJYf46GEKECqACGAB4I3GDOglYA5wRnt9kJKICzM7NHewQUwPZy1mLECqACGAL4eGA38APgeODJwFcKC1oBLARlszwBBTDP0DvUT0ABrD9HQ4hQAVQA7wzsCcS+v8t1+wGvAFwHOGuTIr8oEH/66xLAKbt372bXrnBBLwksj4ACuDy23rkeAgpgPbkYciQKoAI4Xd97AycBhwAv36T4N3toBAVwyD8m6hmbAlhPLoxkeQQUwOWx9c7nEVAAFcDN3g8nAP/SLQVP/7szgP4EWRsBBXBt6H3hFRJQAFcIe8QvpQAqgNPlH8vBsf8vZvpeUPDecA9gASSbLIaAArgYjt6lbgIKYN35GUp0CqAC+Fzg7d2y7+WBp3VPBF8L+HpBoSuABZBsshgCCuBiOHqXugkogHXnZyjRKYAK4NHArYFLdsL3IeApwBcKi1wBLARlszwBBTDP0DvUT0ABrD9HQ4hQAVQAs3WsAGYJ2r+YgAJYjMqGDRNQABtOXkOhK4AKYLZcFcAsQfsXE1AAi1HZsGECCmDDyWsodAVQAcyWqwKYJWj/YgIKYDEqGzZMQAFsOHkNha4AKoDZclUAswTtX0xAASxGZcOGCSiADSevodAVQAUwW64KYJag/YsJKIDFqGzYMAEFsOHkNRS6AqgAZstVAcwStH8xAQWwGJUNGyagADacvIZCVwAVwGy5KoBZgvYvJqAAFqOyYcMEFMCGk9dQ6AqgApgtVwUwS9D+xQQUwGJUNmyYgALYcPIaCl0BVACz5aoAZgnav5iAAliMyoYNE1AAG05eQ6ErgApgtlwVwCxB+xcTUACLUdmwYQIKYMPJayh0BVABzJarApglaP9iAgpgMSobNkxAAWw4eQ2FrgAqgNlyVQCzBO1fTEABLEZlw4YJKIANJ6+h0BVABTBbrgpglqD9iwkogMWobNgwAQWw4eQ1FLoCqABmy1UBzBK0fzEBBbAYlQ0bJqAANpy8hkJXABXAbLkqgFmC9i8moAAWo7JhwwQUwIaT11DoCqACmC1XBTBL0P7FBBTAYlQ2bJiAAthw8hoKXQFUALPlqgBmCdq/mIACWIzKhg0TUAAbTl5DoSuACmC2XBXALEH7FxNQAItR2bBhAgpgw8lrKHQFUAHMlqsCmCVo/2ICCmAxKhs2TEABbDh5DYWuACqA2XJVALME7V9MQAEsRmXDhgkogA0nr6HQFUAFMFuuCmCWoP2L8nglVQAADr5JREFUCSiAxahs2DABBbDh5DUUugKoAGbLVQHMErR/MQEFsBiVDRsmoAA2nLyGQlcAFcBsuSqAWYL2LyagABajsmHDBBTAhpPXUOgKoAKYLVcFMEvQ/sUEFMBiVDZsmIAC2HDyGgpdAVQAs+WqAGYJ2r+YgAJYjMqGDRNQABtOXkOhK4AKYLZcFcAsQfsXE1AAi1HZsGECCmDDyWsodAVQAcyWqwKYJWj/YgIKYDEqGzZMQAFsOHkNha4AKoDZclUAswTtX0xAASxGZcOGCSiADSevodAVQAUwW64KYJag/YsJKIDFqGzYMAEFsOHkNRS6AqgAZstVAcwStH8xAQWwGJUNGyagADacvIZCVwAVwGy5KoBZgvYvJqAAFqOyYcMEFMCGk9dQ6AqgApgtVwUwS9D+xQQUwGJUNmyYgALYcPIaCl0BVACz5aoAZgk21l8JayxhhiuBRggovqtNlAKoAGYrTgHMEmysvwLYWMIMVwKNEFAAV5soBVABzFacApgl2Fh/BbCxhBmuBBohoACuNlEKoAKYrTgFMEuwsf4KYGMJM1wJNEJAAVxtohRABTBbcQpglmBj/RXAxhJmuBJohIACuNpEKYAKYLbiFMAswcb6K4CNJcxwJdAIAQVwtYlSABXAbMUpgFmCjfVXABtLmOFKoBECCuBqE6UAKoDZilMAswQb668ANpYww5VAIwQUwNUmSgFUALMVpwBmCTbWXwFsLGGGK4FGCCiAq02UAqgAZitOAcwSbKy/AthYwgxXAo0QUABXmygFUAHMVpwCmCXYWH8FsLGEGa4EGiGgAK42UQqgApitOAUwS7Cx/gpgYwkzXAk0QkABXG2iFEAFMFtxCmCW4Bz9lbA5oNlFAhKomoACuNr0KIAKYLbiFMAswTn6K4BzQLOLBCRQNQEFcLXpUQAVwGzFKYBZgnP0VwDngGYXCUigagIK4GrTowAqgNmKUwCzBOforwDOAc0uEpBA1QQUwNWmRwFUALMVpwBmCc7RXwGcA5pdJCCBqgkogKtNjwKoAGYrTgHMEpyjvwI4BzS7SEACVRNQAFebHgVQAcxWnAKYJThHfwVwDmh2kYAEqiagAK42PQqgApitOAUwS3CO/grgHNDsIgEJVE1AAVxtehRABTAq7uHA44HLAv8OPBL4aGEpKoCFoBbZTAFcJE3vJQEJ1EBAAVxtFhRABfA+wN8CDwE+AjwauDdwDeCMgnJUAAsgLbqJArhoot5PAhJYNwEFcLUZUAAVwJC+E4BHdKV3QeBk4Ajg8IJyVAALIC26iQK4aKLeTwISWDcBBXC1GVAAxy2AFwG+B9wL+IeJ0nsVsDdwt03K8aJA/OmvSwCnnHzyyezaFS7otQoC1zn0mFW8jK8hAQlIYGUEPvW0O67stXwhCAHcd999A8VewJljZHKBMQ66G/Plga8CNweOn+DwbOA2wE02YXMYcOiImTl0CUhAAhKQwJAIXBX48pAGVDoWBXA2Adx0BhC4InBWKfQBtNuY+XTcA8hk2RDMt+/vskppu5V1Ps46dwaw7fftXNHPswQ8/UIbewBHOIXsuMe1ZGC+zfdcP2Qb62SdW+eNlWwu3DHPAAa5eAgkjnyJo1/iiodAvgIcOctDIApgrggb6u0HhB8QDZXr3KFa59b53MXTUMex1vlPUjR2AYxjYOKhjwd3IhjHwPwmsD9wekEhj7WAHLcfEAVvj+abWOfWefNFXDAA63xcda4ATrwp4giY/iDoTwJ/2M0MFrxvNp4IfjLwTODskg4DaeO4zfdASnnbYVjn1rl1PlwCY31/K4DDrWlHJgEJSEACEpCABLYnMPYlYOtDAhKQgAQkIAEJjI6AAji6lDtgCUhAAhKQgATGTkABHHsFOH4JSEACEpCABEZHQAEcXcodsAQkIAEJSEACYyegAC6+AuLJojhf8PrALwHxZPGQr7cBNwAuA3wL+BfgicCpAx70VYA/AW4HXLYb66uBPwd+OOBxx9CeAty1y3mMNb43e4jXwydOB/j37qzQODN0yNetuzHfELgccPep70kf6tjjJId7dMd/fR84rvsZduJQB9yN66FA/ImfZ3F9GvhT4F0DH/fk8J7UneLxV0AcAzeqSwFcfLqjkH4BuPNIBPAx3Xcpfw24AvDcDml8x/JQrzsBcYbk64D/Bq4D/A3wd8DjhjroblxPA77dfQ3g7w1UACO3fws8pPtlLj4Y7g1cAzhjwPmNn1m3AD4OvHlEAvhu4GjgBOBCwDO69/S1gO8OON+/DvwI+DwQLvDA7heAmLgIGRz6dSPgDfz4DMD3KoBDT/fyxxc/QP8SuGf3BhrDDOA01d/oZg1iJvR/l4+8mleIsyTjt+mrVRPRcgM5CHj+QAUwZvBDBuKM0LjiG4JOBo4o/Iag5ZJfzd3PHZEAThO9dCf6twE+sBrc1bzK/3QS+PJqIlpOIHsC/wY8DPjjbqXOGcDlsB7FXffpfnM+EPgG8KWRzABOJvfngRd3M4G3HEXWzxvknwExM/jLIxn3UAVwEd8RPoQSGLMA7tfNil0X+NQQklkwhp/pZrnjm7Fi4uIzBX1abhLjDNmNFaz3KYAtp3L9scf0+TuBDwMhArGnYkwC+KxutuTiwL8CvwZ8c/1pWVkE8YERy2ax/BtLwWO4hiqAlwe+CsQWhuMnEvlsIGaEbjKG5AJjFcCY7Y19zbG3dQy/xIbkRp3vAXwHuF/3WTbkMr9vt5c5loB/oAAOOdW5sR3ebQbe7i7XBH61+w7h+ICIPRWtC2DpuD/XgbkUELN/VwYOBXZ3EhgfIi1ds447xhb7Ht/f/RD5/ZYGOxHrPONWABtNdmHYYxXAWMGIrTwhf6cUsmq5Wcx4XwnYC7gXED/D4nNsqDOA+wIfA+4A/EeXOGcAW67gJcYee0EuucP9v9htJI0NtZPCE1PqIYOv6TbXLjHMhd+6dNybPfF6xW6/1PQMysKDXMINZx13zBbFD4+Y9QwhOmcJMa3ilrOOO2IaqgC6BPzjihujAB4J3A2Ip6FjBWeMV5zi8AXgwQMdfGzRekv32dwPMT6ro97j53fsXY/P7VFcPgW8mDTHb1C7Jm4VYnBM9xtVbCgfw2+S/fCDxUnAbTs5Wgzh+u4SM3/x5Fgs/f7OmH5odKkYqgDG8OI9G0e+PLIbaywLfgUIQYjZ0jFcYxLA+ByMB3zi2JsDuv1/Y8jxZmM8tqv1eH8P8bpEt1I1ObZXArGaFVuZxrLnc2P8CuBySrz1JeBSKrEfKvZRfKg7A/DqwNOBeCDm2sDZpTdqrF3IX8z8hejG0QmTvzGe1thYZg03BD+W++Np73jy+VbdDeI4nNhDNIQrjoGJTeIxCxIiGE8H/mZ3TtzpQxjgFmOIJyNjP2tcnwAO6X7Jic3yIcBDvV7U7X2L2b/Js/9iK0ucCzjU65ndmX+R2xCj2P8XZ7jeEfjnoQ56k3G5BDyiZK9iqGMRwNhAHOcexqHXPwvEWYBxplY8CBMb6Yd6xW/H8VvjZtfQf6k6aostDUOb8Y0jYEJw46DvOMz9D7uZwaHWdIwrZr9iVnv6Chke6oxQjHWrvcoHA1HvQ73iqJfbd4d+h+zGnriYBRuT/EVuFcChVrjjkoAEJCABCUhAAhI4P4Ghz1aYbwlIQAISkIAEJCCBKQIKoCUhAQlIQAISkIAERkZAARxZwh2uBCQgAQlIQAISUACtAQlIQAISkIAEJDAyAgrgyBLucCUgAQlIQAISkIACaA1IQAISkIAEJCCBkRFQAEeWcIcrAQlIQAISkIAEFEBrQAISkMBPE3g1sEf3dY7ykYAEJDA4Agrg4FLqgCQwagJvBy4M3GkTCvG1dR/ovrkmvvVgu0sBHHUZOXgJDJ+AAjj8HDtCCYyJwIHA33df+H7K1MBfAcTXF8b3V+90KYA7EfLfJSCBpgkogE2nz+AlIIEpAhcCQvyO7L6Tuv/nPbvvqo7v943vQH0pcDtgH+ArXfsjJu41LYBxz8O7dn2zTwFHT7zOzwPPBX6jm4U8AXgM8J9mSQISkEBtBBTA2jJiPBKQQJbAs4F7AL8AnNvd7GDghd0X358NPAn4R+CbwC07Ifwd4M1d+3kE8L3AbuDpwFnAw4D7Ab8IfDs7KPtLQAISWCQBBXCRNL2XBCRQA4H9gc8CtwXe1wUUe/9OAu6/RYAvAfYG7junAB7QyeNlgR9294ifr1/shDCWn70kIAEJVENAAawmFQYiAQkskMCHgS8ADwD2Az4/JYSPBA7q9grG074XAT4G3HxOAXwU8JfA96fGcLFu6fgpCxybt5KABCSQJqAAphF6AwlIoEICvwvEnr6YkYvl3vtMLAnHUu9fA4cAH+mWa6PNDYBf3kIAY5/gc7p79sM9Efi7bg9gCN6DgNtvwuJb3VJzhZgMSQISGCsBBXCsmXfcEhg2gf6hj8cBfwy8GHhGN+T431cD7jiBIJaKo89WAvhx4Bjgj7o+sVx8Wid/fwbcGXhbd9+Th43W0UlAAkMgoAAOIYuOQQIS2IzAy7qHQXYBVwJO7RrFzN9TgXt3+wJjKfjh3TLxVgIYs3/xQMdvdjOG8aBHzPbFk8EhgBcEPtQdHv1E4L+BywO/BrwB+IQpkoAEJFATAQWwpmwYiwQksEgCNwOOA94J3HXixrHnL5aA47iWc4DXAt/rjoXZSgBjxu9vulnDWNKNWcUQvcljYEI0Y5YxnkC+VHfsTDx8EsvLX13kwLyXBCQggSwBBTBL0P4SkIAEJCABCUigMQIKYGMJM1wJSEACEpCABCSQJaAAZgnaXwISkIAEJCABCTRGQAFsLGGGKwEJSEACEpCABLIEFMAsQftLQAISkIAEJCCBxggogI0lzHAlIAEJSEACEpBAloACmCVofwlIQAISkIAEJNAYAQWwsYQZrgQkIAEJSEACEsgSUACzBO0vAQlIQAISkIAEGiOgADaWMMOVgAQkIAEJSEACWQIKYJag/SUgAQlIQAISkEBjBBTAxhJmuBKQgAQkIAEJSCBLQAHMErS/BCQgAQlIQAISaIzA/wcmOxxYPHALeQAAAABJRU5ErkJggg==\" width=\"640\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x7febcc998828>"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plt.figure()\n",
    "# picker=5 means the mouse doesn't have to click directly on an event, but can be up to 5 pixels away\n",
    "plt.scatter(df['height'], df['weight'], picker=5)\n",
    "plt.gca().set_ylabel('Weight')\n",
    "plt.gca().set_xlabel('Height')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def onpick(event):\n",
    "    origin1 = df.iloc[event.ind[0]]\n",
    "    origin = df.iloc[event.ind[0]]['origin']\n",
    "    plt.gca().set_title('Selected item came from {}'.format(origin))\n",
    "\n",
    "# tell mpl_connect we want to pass a 'pick_event' into onpick when the event is detected\n",
    "plt.gcf().canvas.mpl_connect('pick_event', onpick)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
