Format: application/octet-stream
⬇ Download File (2.7 MB)
   1  {
   2   "cells": [
   3    {
   4     "cell_type": "markdown",
   5     "metadata": {},
   6     "source": [
   7      "# Pandas Visualization"
   8     ]
   9    },
  10    {
  11     "cell_type": "code",
  12     "execution_count": 1,
  13     "metadata": {
  14      "collapsed": false
  15     },
  16     "outputs": [],
  17     "source": [
  18      "import pandas as pd\n",
  19      "import numpy as np\n",
  20      "import matplotlib.pyplot as plt\n",
  21      "\n",
  22      "%matplotlib notebook"
  23     ]
  24    },
  25    {
  26     "cell_type": "code",
  27     "execution_count": 2,
  28     "metadata": {
  29      "collapsed": false
  30     },
  31     "outputs": [
  32      {
  33       "data": {
  34        "text/plain": [
  35         "['grayscale',\n",
  36         " 'seaborn-colorblind',\n",
  37         " 'seaborn-bright',\n",
  38         " 'seaborn-deep',\n",
  39         " 'seaborn-pastel',\n",
  40         " 'classic',\n",
  41         " 'seaborn-muted',\n",
  42         " 'seaborn-darkgrid',\n",
  43         " 'seaborn-white',\n",
  44         " 'seaborn-paper',\n",
  45         " 'seaborn-dark',\n",
  46         " 'seaborn-whitegrid',\n",
  47         " 'dark_background',\n",
  48         " 'seaborn-poster',\n",
  49         " 'ggplot',\n",
  50         " 'seaborn-ticks',\n",
  51         " 'seaborn-dark-palette',\n",
  52         " 'seaborn-notebook',\n",
  53         " 'bmh',\n",
  54         " 'seaborn-talk',\n",
  55         " 'fivethirtyeight',\n",
  56         " 'seaborn']"
  57        ]
  58       },
  59       "execution_count": 2,
  60       "metadata": {},
  61       "output_type": "execute_result"
  62      }
  63     ],
  64     "source": [
  65      "# see the pre-defined styles provided.\n",
  66      "plt.style.available"
  67     ]
  68    },
  69    {
  70     "cell_type": "code",
  71     "execution_count": 3,
  72     "metadata": {
  73      "collapsed": true
  74     },
  75     "outputs": [],
  76     "source": [
  77      "# use the 'seaborn-colorblind' style\n",
  78      "plt.style.use('seaborn-colorblind')"
  79     ]
  80    },
  81    {
  82     "cell_type": "markdown",
  83     "metadata": {},
  84     "source": [
  85      "### DataFrame.plot"
  86     ]
  87    },
  88    {
  89     "cell_type": "code",
  90     "execution_count": 4,
  91     "metadata": {
  92      "collapsed": false,
  93      "scrolled": false
  94     },
  95     "outputs": [
  96      {
  97       "data": {
  98        "text/html": [
  99         "<div>\n",
 100         "<table border=\"1\" class=\"dataframe\">\n",
 101         "  <thead>\n",
 102         "    <tr style=\"text-align: right;\">\n",
 103         "      <th></th>\n",
 104         "      <th>A</th>\n",
 105         "      <th>B</th>\n",
 106         "      <th>C</th>\n",
 107         "    </tr>\n",
 108         "  </thead>\n",
 109         "  <tbody>\n",
 110         "    <tr>\n",
 111         "      <th>2017-01-01</th>\n",
 112         "      <td>-1.085631</td>\n",
 113         "      <td>20.059291</td>\n",
 114         "      <td>-20.230904</td>\n",
 115         "    </tr>\n",
 116         "    <tr>\n",
 117         "      <th>2017-01-02</th>\n",
 118         "      <td>-0.088285</td>\n",
 119         "      <td>21.803332</td>\n",
 120         "      <td>-16.659325</td>\n",
 121         "    </tr>\n",
 122         "    <tr>\n",
 123         "      <th>2017-01-03</th>\n",
 124         "      <td>0.194693</td>\n",
 125         "      <td>20.835588</td>\n",
 126         "      <td>-17.055481</td>\n",
 127         "    </tr>\n",
 128         "    <tr>\n",
 129         "      <th>2017-01-04</th>\n",
 130         "      <td>-1.311601</td>\n",
 131         "      <td>21.255156</td>\n",
 132         "      <td>-17.093802</td>\n",
 133         "    </tr>\n",
 134         "    <tr>\n",
 135         "      <th>2017-01-05</th>\n",
 136         "      <td>-1.890202</td>\n",
 137         "      <td>21.462083</td>\n",
 138         "      <td>-19.518638</td>\n",
 139         "    </tr>\n",
 140         "  </tbody>\n",
 141         "</table>\n",
 142         "</div>"
 143        ],
 144        "text/plain": [
 145         "                   A          B          C\n",
 146         "2017-01-01 -1.085631  20.059291 -20.230904\n",
 147         "2017-01-02 -0.088285  21.803332 -16.659325\n",
 148         "2017-01-03  0.194693  20.835588 -17.055481\n",
 149         "2017-01-04 -1.311601  21.255156 -17.093802\n",
 150         "2017-01-05 -1.890202  21.462083 -19.518638"
 151        ]
 152       },
 153       "execution_count": 4,
 154       "metadata": {},
 155       "output_type": "execute_result"
 156      }
 157     ],
 158     "source": [
 159      "np.random.seed(123)\n",
 160      "\n",
 161      "df = pd.DataFrame({'A': np.random.randn(365).cumsum(0), \n",
 162      "                   'B': np.random.randn(365).cumsum(0) + 20,\n",
 163      "                   'C': np.random.randn(365).cumsum(0) - 20}, \n",
 164      "                  index=pd.date_range('1/1/2017', periods=365))\n",
 165      "df.head()"
 166     ]
 167    },
 168    {
 169     "cell_type": "code",
 170     "execution_count": 5,
 171     "metadata": {
 172      "collapsed": false,
 173      "scrolled": false
 174     },
 175     "outputs": [
 176      {
 177       "data": {
 178        "application/javascript": [
 179         "/* Put everything inside the global mpl namespace */\n",
 180         "window.mpl = {};\n",
 181         "\n",
 182         "\n",
 183         "mpl.get_websocket_type = function() {\n",
 184         "    if (typeof(WebSocket) !== 'undefined') {\n",
 185         "        return WebSocket;\n",
 186         "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
 187         "        return MozWebSocket;\n",
 188         "    } else {\n",
 189         "        alert('Your browser does not have WebSocket support.' +\n",
 190         "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
 191         "              'Firefox 4 and 5 are also supported but you ' +\n",
 192         "              'have to enable WebSockets in about:config.');\n",
 193         "    };\n",
 194         "}\n",
 195         "\n",
 196         "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
 197         "    this.id = figure_id;\n",
 198         "\n",
 199         "    this.ws = websocket;\n",
 200         "\n",
 201         "    this.supports_binary = (this.ws.binaryType != undefined);\n",
 202         "\n",
 203         "    if (!this.supports_binary) {\n",
 204         "        var warnings = document.getElementById(\"mpl-warnings\");\n",
 205         "        if (warnings) {\n",
 206         "            warnings.style.display = 'block';\n",
 207         "            warnings.textContent = (\n",
 208         "                \"This browser does not support binary websocket messages. \" +\n",
 209         "                    \"Performance may be slow.\");\n",
 210         "        }\n",
 211         "    }\n",
 212         "\n",
 213         "    this.imageObj = new Image();\n",
 214         "\n",
 215         "    this.context = undefined;\n",
 216         "    this.message = undefined;\n",
 217         "    this.canvas = undefined;\n",
 218         "    this.rubberband_canvas = undefined;\n",
 219         "    this.rubberband_context = undefined;\n",
 220         "    this.format_dropdown = undefined;\n",
 221         "\n",
 222         "    this.image_mode = 'full';\n",
 223         "\n",
 224         "    this.root = $('<div/>');\n",
 225         "    this._root_extra_style(this.root)\n",
 226         "    this.root.attr('style', 'display: inline-block');\n",
 227         "\n",
 228         "    $(parent_element).append(this.root);\n",
 229         "\n",
 230         "    this._init_header(this);\n",
 231         "    this._init_canvas(this);\n",
 232         "    this._init_toolbar(this);\n",
 233         "\n",
 234         "    var fig = this;\n",
 235         "\n",
 236         "    this.waiting = false;\n",
 237         "\n",
 238         "    this.ws.onopen =  function () {\n",
 239         "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
 240         "            fig.send_message(\"send_image_mode\", {});\n",
 241         "            if (mpl.ratio != 1) {\n",
 242         "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
 243         "            }\n",
 244         "            fig.send_message(\"refresh\", {});\n",
 245         "        }\n",
 246         "\n",
 247         "    this.imageObj.onload = function() {\n",
 248         "            if (fig.image_mode == 'full') {\n",
 249         "                // Full images could contain transparency (where diff images\n",
 250         "                // almost always do), so we need to clear the canvas so that\n",
 251         "                // there is no ghosting.\n",
 252         "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
 253         "            }\n",
 254         "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
 255         "        };\n",
 256         "\n",
 257         "    this.imageObj.onunload = function() {\n",
 258         "        this.ws.close();\n",
 259         "    }\n",
 260         "\n",
 261         "    this.ws.onmessage = this._make_on_message_function(this);\n",
 262         "\n",
 263         "    this.ondownload = ondownload;\n",
 264         "}\n",
 265         "\n",
 266         "mpl.figure.prototype._init_header = function() {\n",
 267         "    var titlebar = $(\n",
 268         "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
 269         "        'ui-helper-clearfix\"/>');\n",
 270         "    var titletext = $(\n",
 271         "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
 272         "        'text-align: center; padding: 3px;\"/>');\n",
 273         "    titlebar.append(titletext)\n",
 274         "    this.root.append(titlebar);\n",
 275         "    this.header = titletext[0];\n",
 276         "}\n",
 277         "\n",
 278         "\n",
 279         "\n",
 280         "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
 281         "\n",
 282         "}\n",
 283         "\n",
 284         "\n",
 285         "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
 286         "\n",
 287         "}\n",
 288         "\n",
 289         "mpl.figure.prototype._init_canvas = function() {\n",
 290         "    var fig = this;\n",
 291         "\n",
 292         "    var canvas_div = $('<div/>');\n",
 293         "\n",
 294         "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
 295         "\n",
 296         "    function canvas_keyboard_event(event) {\n",
 297         "        return fig.key_event(event, event['data']);\n",
 298         "    }\n",
 299         "\n",
 300         "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
 301         "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
 302         "    this.canvas_div = canvas_div\n",
 303         "    this._canvas_extra_style(canvas_div)\n",
 304         "    this.root.append(canvas_div);\n",
 305         "\n",
 306         "    var canvas = $('<canvas/>');\n",
 307         "    canvas.addClass('mpl-canvas');\n",
 308         "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
 309         "\n",
 310         "    this.canvas = canvas[0];\n",
 311         "    this.context = canvas[0].getContext(\"2d\");\n",
 312         "\n",
 313         "    var backingStore = this.context.backingStorePixelRatio ||\n",
 314         "\tthis.context.webkitBackingStorePixelRatio ||\n",
 315         "\tthis.context.mozBackingStorePixelRatio ||\n",
 316         "\tthis.context.msBackingStorePixelRatio ||\n",
 317         "\tthis.context.oBackingStorePixelRatio ||\n",
 318         "\tthis.context.backingStorePixelRatio || 1;\n",
 319         "\n",
 320         "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
 321         "\n",
 322         "    var rubberband = $('<canvas/>');\n",
 323         "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
 324         "\n",
 325         "    var pass_mouse_events = true;\n",
 326         "\n",
 327         "    canvas_div.resizable({\n",
 328         "        start: function(event, ui) {\n",
 329         "            pass_mouse_events = false;\n",
 330         "        },\n",
 331         "        resize: function(event, ui) {\n",
 332         "            fig.request_resize(ui.size.width, ui.size.height);\n",
 333         "        },\n",
 334         "        stop: function(event, ui) {\n",
 335         "            pass_mouse_events = true;\n",
 336         "            fig.request_resize(ui.size.width, ui.size.height);\n",
 337         "        },\n",
 338         "    });\n",
 339         "\n",
 340         "    function mouse_event_fn(event) {\n",
 341         "        if (pass_mouse_events)\n",
 342         "            return fig.mouse_event(event, event['data']);\n",
 343         "    }\n",
 344         "\n",
 345         "    rubberband.mousedown('button_press', mouse_event_fn);\n",
 346         "    rubberband.mouseup('button_release', mouse_event_fn);\n",
 347         "    // Throttle sequential mouse events to 1 every 20ms.\n",
 348         "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
 349         "\n",
 350         "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
 351         "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
 352         "\n",
 353         "    canvas_div.on(\"wheel\", function (event) {\n",
 354         "        event = event.originalEvent;\n",
 355         "        event['data'] = 'scroll'\n",
 356         "        if (event.deltaY < 0) {\n",
 357         "            event.step = 1;\n",
 358         "        } else {\n",
 359         "            event.step = -1;\n",
 360         "        }\n",
 361         "        mouse_event_fn(event);\n",
 362         "    });\n",
 363         "\n",
 364         "    canvas_div.append(canvas);\n",
 365         "    canvas_div.append(rubberband);\n",
 366         "\n",
 367         "    this.rubberband = rubberband;\n",
 368         "    this.rubberband_canvas = rubberband[0];\n",
 369         "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
 370         "    this.rubberband_context.strokeStyle = \"#000000\";\n",
 371         "\n",
 372         "    this._resize_canvas = function(width, height) {\n",
 373         "        // Keep the size of the canvas, canvas container, and rubber band\n",
 374         "        // canvas in synch.\n",
 375         "        canvas_div.css('width', width)\n",
 376         "        canvas_div.css('height', height)\n",
 377         "\n",
 378         "        canvas.attr('width', width * mpl.ratio);\n",
 379         "        canvas.attr('height', height * mpl.ratio);\n",
 380         "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
 381         "\n",
 382         "        rubberband.attr('width', width);\n",
 383         "        rubberband.attr('height', height);\n",
 384         "    }\n",
 385         "\n",
 386         "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
 387         "    // upon first draw.\n",
 388         "    this._resize_canvas(600, 600);\n",
 389         "\n",
 390         "    // Disable right mouse context menu.\n",
 391         "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
 392         "        return false;\n",
 393         "    });\n",
 394         "\n",
 395         "    function set_focus () {\n",
 396         "        canvas.focus();\n",
 397         "        canvas_div.focus();\n",
 398         "    }\n",
 399         "\n",
 400         "    window.setTimeout(set_focus, 100);\n",
 401         "}\n",
 402         "\n",
 403         "mpl.figure.prototype._init_toolbar = function() {\n",
 404         "    var fig = this;\n",
 405         "\n",
 406         "    var nav_element = $('<div/>')\n",
 407         "    nav_element.attr('style', 'width: 100%');\n",
 408         "    this.root.append(nav_element);\n",
 409         "\n",
 410         "    // Define a callback function for later on.\n",
 411         "    function toolbar_event(event) {\n",
 412         "        return fig.toolbar_button_onclick(event['data']);\n",
 413         "    }\n",
 414         "    function toolbar_mouse_event(event) {\n",
 415         "        return fig.toolbar_button_onmouseover(event['data']);\n",
 416         "    }\n",
 417         "\n",
 418         "    for(var toolbar_ind in mpl.toolbar_items) {\n",
 419         "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
 420         "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
 421         "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
 422         "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
 423         "\n",
 424         "        if (!name) {\n",
 425         "            // put a spacer in here.\n",
 426         "            continue;\n",
 427         "        }\n",
 428         "        var button = $('<button/>');\n",
 429         "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
 430         "                        'ui-button-icon-only');\n",
 431         "        button.attr('role', 'button');\n",
 432         "        button.attr('aria-disabled', 'false');\n",
 433         "        button.click(method_name, toolbar_event);\n",
 434         "        button.mouseover(tooltip, toolbar_mouse_event);\n",
 435         "\n",
 436         "        var icon_img = $('<span/>');\n",
 437         "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
 438         "        icon_img.addClass(image);\n",
 439         "        icon_img.addClass('ui-corner-all');\n",
 440         "\n",
 441         "        var tooltip_span = $('<span/>');\n",
 442         "        tooltip_span.addClass('ui-button-text');\n",
 443         "        tooltip_span.html(tooltip);\n",
 444         "\n",
 445         "        button.append(icon_img);\n",
 446         "        button.append(tooltip_span);\n",
 447         "\n",
 448         "        nav_element.append(button);\n",
 449         "    }\n",
 450         "\n",
 451         "    var fmt_picker_span = $('<span/>');\n",
 452         "\n",
 453         "    var fmt_picker = $('<select/>');\n",
 454         "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
 455         "    fmt_picker_span.append(fmt_picker);\n",
 456         "    nav_element.append(fmt_picker_span);\n",
 457         "    this.format_dropdown = fmt_picker[0];\n",
 458         "\n",
 459         "    for (var ind in mpl.extensions) {\n",
 460         "        var fmt = mpl.extensions[ind];\n",
 461         "        var option = $(\n",
 462         "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
 463         "        fmt_picker.append(option)\n",
 464         "    }\n",
 465         "\n",
 466         "    // Add hover states to the ui-buttons\n",
 467         "    $( \".ui-button\" ).hover(\n",
 468         "        function() { $(this).addClass(\"ui-state-hover\");},\n",
 469         "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
 470         "    );\n",
 471         "\n",
 472         "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
 473         "    nav_element.append(status_bar);\n",
 474         "    this.message = status_bar[0];\n",
 475         "}\n",
 476         "\n",
 477         "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
 478         "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
 479         "    // which will in turn request a refresh of the image.\n",
 480         "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
 481         "}\n",
 482         "\n",
 483         "mpl.figure.prototype.send_message = function(type, properties) {\n",
 484         "    properties['type'] = type;\n",
 485         "    properties['figure_id'] = this.id;\n",
 486         "    this.ws.send(JSON.stringify(properties));\n",
 487         "}\n",
 488         "\n",
 489         "mpl.figure.prototype.send_draw_message = function() {\n",
 490         "    if (!this.waiting) {\n",
 491         "        this.waiting = true;\n",
 492         "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
 493         "    }\n",
 494         "}\n",
 495         "\n",
 496         "\n",
 497         "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
 498         "    var format_dropdown = fig.format_dropdown;\n",
 499         "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
 500         "    fig.ondownload(fig, format);\n",
 501         "}\n",
 502         "\n",
 503         "\n",
 504         "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
 505         "    var size = msg['size'];\n",
 506         "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
 507         "        fig._resize_canvas(size[0], size[1]);\n",
 508         "        fig.send_message(\"refresh\", {});\n",
 509         "    };\n",
 510         "}\n",
 511         "\n",
 512         "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
 513         "    var x0 = msg['x0'] / mpl.ratio;\n",
 514         "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
 515         "    var x1 = msg['x1'] / mpl.ratio;\n",
 516         "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
 517         "    x0 = Math.floor(x0) + 0.5;\n",
 518         "    y0 = Math.floor(y0) + 0.5;\n",
 519         "    x1 = Math.floor(x1) + 0.5;\n",
 520         "    y1 = Math.floor(y1) + 0.5;\n",
 521         "    var min_x = Math.min(x0, x1);\n",
 522         "    var min_y = Math.min(y0, y1);\n",
 523         "    var width = Math.abs(x1 - x0);\n",
 524         "    var height = Math.abs(y1 - y0);\n",
 525         "\n",
 526         "    fig.rubberband_context.clearRect(\n",
 527         "        0, 0, fig.canvas.width, fig.canvas.height);\n",
 528         "\n",
 529         "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
 530         "}\n",
 531         "\n",
 532         "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
 533         "    // Updates the figure title.\n",
 534         "    fig.header.textContent = msg['label'];\n",
 535         "}\n",
 536         "\n",
 537         "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
 538         "    var cursor = msg['cursor'];\n",
 539         "    switch(cursor)\n",
 540         "    {\n",
 541         "    case 0:\n",
 542         "        cursor = 'pointer';\n",
 543         "        break;\n",
 544         "    case 1:\n",
 545         "        cursor = 'default';\n",
 546         "        break;\n",
 547         "    case 2:\n",
 548         "        cursor = 'crosshair';\n",
 549         "        break;\n",
 550         "    case 3:\n",
 551         "        cursor = 'move';\n",
 552         "        break;\n",
 553         "    }\n",
 554         "    fig.rubberband_canvas.style.cursor = cursor;\n",
 555         "}\n",
 556         "\n",
 557         "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
 558         "    fig.message.textContent = msg['message'];\n",
 559         "}\n",
 560         "\n",
 561         "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
 562         "    // Request the server to send over a new figure.\n",
 563         "    fig.send_draw_message();\n",
 564         "}\n",
 565         "\n",
 566         "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
 567         "    fig.image_mode = msg['mode'];\n",
 568         "}\n",
 569         "\n",
 570         "mpl.figure.prototype.updated_canvas_event = function() {\n",
 571         "    // Called whenever the canvas gets updated.\n",
 572         "    this.send_message(\"ack\", {});\n",
 573         "}\n",
 574         "\n",
 575         "// A function to construct a web socket function for onmessage handling.\n",
 576         "// Called in the figure constructor.\n",
 577         "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
 578         "    return function socket_on_message(evt) {\n",
 579         "        if (evt.data instanceof Blob) {\n",
 580         "            /* FIXME: We get \"Resource interpreted as Image but\n",
 581         "             * transferred with MIME type text/plain:\" errors on\n",
 582         "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
 583         "             * to be part of the websocket stream */\n",
 584         "            evt.data.type = \"image/png\";\n",
 585         "\n",
 586         "            /* Free the memory for the previous frames */\n",
 587         "            if (fig.imageObj.src) {\n",
 588         "                (window.URL || window.webkitURL).revokeObjectURL(\n",
 589         "                    fig.imageObj.src);\n",
 590         "            }\n",
 591         "\n",
 592         "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
 593         "                evt.data);\n",
 594         "            fig.updated_canvas_event();\n",
 595         "            fig.waiting = false;\n",
 596         "            return;\n",
 597         "        }\n",
 598         "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
 599         "            fig.imageObj.src = evt.data;\n",
 600         "            fig.updated_canvas_event();\n",
 601         "            fig.waiting = false;\n",
 602         "            return;\n",
 603         "        }\n",
 604         "\n",
 605         "        var msg = JSON.parse(evt.data);\n",
 606         "        var msg_type = msg['type'];\n",
 607         "\n",
 608         "        // Call the  \"handle_{type}\" callback, which takes\n",
 609         "        // the figure and JSON message as its only arguments.\n",
 610         "        try {\n",
 611         "            var callback = fig[\"handle_\" + msg_type];\n",
 612         "        } catch (e) {\n",
 613         "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
 614         "            return;\n",
 615         "        }\n",
 616         "\n",
 617         "        if (callback) {\n",
 618         "            try {\n",
 619         "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
 620         "                callback(fig, msg);\n",
 621         "            } catch (e) {\n",
 622         "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
 623         "            }\n",
 624         "        }\n",
 625         "    };\n",
 626         "}\n",
 627         "\n",
 628         "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
 629         "mpl.findpos = function(e) {\n",
 630         "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
 631         "    var targ;\n",
 632         "    if (!e)\n",
 633         "        e = window.event;\n",
 634         "    if (e.target)\n",
 635         "        targ = e.target;\n",
 636         "    else if (e.srcElement)\n",
 637         "        targ = e.srcElement;\n",
 638         "    if (targ.nodeType == 3) // defeat Safari bug\n",
 639         "        targ = targ.parentNode;\n",
 640         "\n",
 641         "    // jQuery normalizes the pageX and pageY\n",
 642         "    // pageX,Y are the mouse positions relative to the document\n",
 643         "    // offset() returns the position of the element relative to the document\n",
 644         "    var x = e.pageX - $(targ).offset().left;\n",
 645         "    var y = e.pageY - $(targ).offset().top;\n",
 646         "\n",
 647         "    return {\"x\": x, \"y\": y};\n",
 648         "};\n",
 649         "\n",
 650         "/*\n",
 651         " * return a copy of an object with only non-object keys\n",
 652         " * we need this to avoid circular references\n",
 653         " * http://stackoverflow.com/a/24161582/3208463\n",
 654         " */\n",
 655         "function simpleKeys (original) {\n",
 656         "  return Object.keys(original).reduce(function (obj, key) {\n",
 657         "    if (typeof original[key] !== 'object')\n",
 658         "        obj[key] = original[key]\n",
 659         "    return obj;\n",
 660         "  }, {});\n",
 661         "}\n",
 662         "\n",
 663         "mpl.figure.prototype.mouse_event = function(event, name) {\n",
 664         "    var canvas_pos = mpl.findpos(event)\n",
 665         "\n",
 666         "    if (name === 'button_press')\n",
 667         "    {\n",
 668         "        this.canvas.focus();\n",
 669         "        this.canvas_div.focus();\n",
 670         "    }\n",
 671         "\n",
 672         "    var x = canvas_pos.x * mpl.ratio;\n",
 673         "    var y = canvas_pos.y * mpl.ratio;\n",
 674         "\n",
 675         "    this.send_message(name, {x: x, y: y, button: event.button,\n",
 676         "                             step: event.step,\n",
 677         "                             guiEvent: simpleKeys(event)});\n",
 678         "\n",
 679         "    /* This prevents the web browser from automatically changing to\n",
 680         "     * the text insertion cursor when the button is pressed.  We want\n",
 681         "     * to control all of the cursor setting manually through the\n",
 682         "     * 'cursor' event from matplotlib */\n",
 683         "    event.preventDefault();\n",
 684         "    return false;\n",
 685         "}\n",
 686         "\n",
 687         "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
 688         "    // Handle any extra behaviour associated with a key event\n",
 689         "}\n",
 690         "\n",
 691         "mpl.figure.prototype.key_event = function(event, name) {\n",
 692         "\n",
 693         "    // Prevent repeat events\n",
 694         "    if (name == 'key_press')\n",
 695         "    {\n",
 696         "        if (event.which === this._key)\n",
 697         "            return;\n",
 698         "        else\n",
 699         "            this._key = event.which;\n",
 700         "    }\n",
 701         "    if (name == 'key_release')\n",
 702         "        this._key = null;\n",
 703         "\n",
 704         "    var value = '';\n",
 705         "    if (event.ctrlKey && event.which != 17)\n",
 706         "        value += \"ctrl+\";\n",
 707         "    if (event.altKey && event.which != 18)\n",
 708         "        value += \"alt+\";\n",
 709         "    if (event.shiftKey && event.which != 16)\n",
 710         "        value += \"shift+\";\n",
 711         "\n",
 712         "    value += 'k';\n",
 713         "    value += event.which.toString();\n",
 714         "\n",
 715         "    this._key_event_extra(event, name);\n",
 716         "\n",
 717         "    this.send_message(name, {key: value,\n",
 718         "                             guiEvent: simpleKeys(event)});\n",
 719         "    return false;\n",
 720         "}\n",
 721         "\n",
 722         "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
 723         "    if (name == 'download') {\n",
 724         "        this.handle_save(this, null);\n",
 725         "    } else {\n",
 726         "        this.send_message(\"toolbar_button\", {name: name});\n",
 727         "    }\n",
 728         "};\n",
 729         "\n",
 730         "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
 731         "    this.message.textContent = tooltip;\n",
 732         "};\n",
 733         "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",
 734         "\n",
 735         "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
 736         "\n",
 737         "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
 738         "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
 739         "    // object with the appropriate methods. Currently this is a non binary\n",
 740         "    // socket, so there is still some room for performance tuning.\n",
 741         "    var ws = {};\n",
 742         "\n",
 743         "    ws.close = function() {\n",
 744         "        comm.close()\n",
 745         "    };\n",
 746         "    ws.send = function(m) {\n",
 747         "        //console.log('sending', m);\n",
 748         "        comm.send(m);\n",
 749         "    };\n",
 750         "    // Register the callback with on_msg.\n",
 751         "    comm.on_msg(function(msg) {\n",
 752         "        //console.log('receiving', msg['content']['data'], msg);\n",
 753         "        // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
 754         "        ws.onmessage(msg['content']['data'])\n",
 755         "    });\n",
 756         "    return ws;\n",
 757         "}\n",
 758         "\n",
 759         "mpl.mpl_figure_comm = function(comm, msg) {\n",
 760         "    // This is the function which gets called when the mpl process\n",
 761         "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
 762         "\n",
 763         "    var id = msg.content.data.id;\n",
 764         "    // Get hold of the div created by the display call when the Comm\n",
 765         "    // socket was opened in Python.\n",
 766         "    var element = $(\"#\" + id);\n",
 767         "    var ws_proxy = comm_websocket_adapter(comm)\n",
 768         "\n",
 769         "    function ondownload(figure, format) {\n",
 770         "        window.open(figure.imageObj.src);\n",
 771         "    }\n",
 772         "\n",
 773         "    var fig = new mpl.figure(id, ws_proxy,\n",
 774         "                           ondownload,\n",
 775         "                           element.get(0));\n",
 776         "\n",
 777         "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
 778         "    // web socket which is closed, not our websocket->open comm proxy.\n",
 779         "    ws_proxy.onopen();\n",
 780         "\n",
 781         "    fig.parent_element = element.get(0);\n",
 782         "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
 783         "    if (!fig.cell_info) {\n",
 784         "        console.error(\"Failed to find cell for figure\", id, fig);\n",
 785         "        return;\n",
 786         "    }\n",
 787         "\n",
 788         "    var output_index = fig.cell_info[2]\n",
 789         "    var cell = fig.cell_info[0];\n",
 790         "\n",
 791         "};\n",
 792         "\n",
 793         "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
 794         "    var width = fig.canvas.width/mpl.ratio\n",
 795         "    fig.root.unbind('remove')\n",
 796         "\n",
 797         "    // Update the output cell to use the data from the current canvas.\n",
 798         "    fig.push_to_output();\n",
 799         "    var dataURL = fig.canvas.toDataURL();\n",
 800         "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
 801         "    // the notebook keyboard shortcuts fail.\n",
 802         "    IPython.keyboard_manager.enable()\n",
 803         "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
 804         "    fig.close_ws(fig, msg);\n",
 805         "}\n",
 806         "\n",
 807         "mpl.figure.prototype.close_ws = function(fig, msg){\n",
 808         "    fig.send_message('closing', msg);\n",
 809         "    // fig.ws.close()\n",
 810         "}\n",
 811         "\n",
 812         "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
 813         "    // Turn the data on the canvas into data in the output cell.\n",
 814         "    var width = this.canvas.width/mpl.ratio\n",
 815         "    var dataURL = this.canvas.toDataURL();\n",
 816         "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
 817         "}\n",
 818         "\n",
 819         "mpl.figure.prototype.updated_canvas_event = function() {\n",
 820         "    // Tell IPython that the notebook contents must change.\n",
 821         "    IPython.notebook.set_dirty(true);\n",
 822         "    this.send_message(\"ack\", {});\n",
 823         "    var fig = this;\n",
 824         "    // Wait a second, then push the new image to the DOM so\n",
 825         "    // that it is saved nicely (might be nice to debounce this).\n",
 826         "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
 827         "}\n",
 828         "\n",
 829         "mpl.figure.prototype._init_toolbar = function() {\n",
 830         "    var fig = this;\n",
 831         "\n",
 832         "    var nav_element = $('<div/>')\n",
 833         "    nav_element.attr('style', 'width: 100%');\n",
 834         "    this.root.append(nav_element);\n",
 835         "\n",
 836         "    // Define a callback function for later on.\n",
 837         "    function toolbar_event(event) {\n",
 838         "        return fig.toolbar_button_onclick(event['data']);\n",
 839         "    }\n",
 840         "    function toolbar_mouse_event(event) {\n",
 841         "        return fig.toolbar_button_onmouseover(event['data']);\n",
 842         "    }\n",
 843         "\n",
 844         "    for(var toolbar_ind in mpl.toolbar_items){\n",
 845         "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
 846         "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
 847         "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
 848         "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
 849         "\n",
 850         "        if (!name) { continue; };\n",
 851         "\n",
 852         "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
 853         "        button.click(method_name, toolbar_event);\n",
 854         "        button.mouseover(tooltip, toolbar_mouse_event);\n",
 855         "        nav_element.append(button);\n",
 856         "    }\n",
 857         "\n",
 858         "    // Add the status bar.\n",
 859         "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
 860         "    nav_element.append(status_bar);\n",
 861         "    this.message = status_bar[0];\n",
 862         "\n",
 863         "    // Add the close button to the window.\n",
 864         "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
 865         "    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",
 866         "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
 867         "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
 868         "    buttongrp.append(button);\n",
 869         "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
 870         "    titlebar.prepend(buttongrp);\n",
 871         "}\n",
 872         "\n",
 873         "mpl.figure.prototype._root_extra_style = function(el){\n",
 874         "    var fig = this\n",
 875         "    el.on(\"remove\", function(){\n",
 876         "\tfig.close_ws(fig, {});\n",
 877         "    });\n",
 878         "}\n",
 879         "\n",
 880         "mpl.figure.prototype._canvas_extra_style = function(el){\n",
 881         "    // this is important to make the div 'focusable\n",
 882         "    el.attr('tabindex', 0)\n",
 883         "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
 884         "    // off when our div gets focus\n",
 885         "\n",
 886         "    // location in version 3\n",
 887         "    if (IPython.notebook.keyboard_manager) {\n",
 888         "        IPython.notebook.keyboard_manager.register_events(el);\n",
 889         "    }\n",
 890         "    else {\n",
 891         "        // location in version 2\n",
 892         "        IPython.keyboard_manager.register_events(el);\n",
 893         "    }\n",
 894         "\n",
 895         "}\n",
 896         "\n",
 897         "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
 898         "    var manager = IPython.notebook.keyboard_manager;\n",
 899         "    if (!manager)\n",
 900         "        manager = IPython.keyboard_manager;\n",
 901         "\n",
 902         "    // Check for shift+enter\n",
 903         "    if (event.shiftKey && event.which == 13) {\n",
 904         "        this.canvas_div.blur();\n",
 905         "        // select the cell after this one\n",
 906         "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
 907         "        IPython.notebook.select(index + 1);\n",
 908         "    }\n",
 909         "}\n",
 910         "\n",
 911         "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
 912         "    fig.ondownload(fig, null);\n",
 913         "}\n",
 914         "\n",
 915         "\n",
 916         "mpl.find_output_cell = function(html_output) {\n",
 917         "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
 918         "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
 919         "    // IPython event is triggered only after the cells have been serialised, which for\n",
 920         "    // our purposes (turning an active figure into a static one), is too late.\n",
 921         "    var cells = IPython.notebook.get_cells();\n",
 922         "    var ncells = cells.length;\n",
 923         "    for (var i=0; i<ncells; i++) {\n",
 924         "        var cell = cells[i];\n",
 925         "        if (cell.cell_type === 'code'){\n",
 926         "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
 927         "                var data = cell.output_area.outputs[j];\n",
 928         "                if (data.data) {\n",
 929         "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
 930         "                    data = data.data;\n",
 931         "                }\n",
 932         "                if (data['text/html'] == html_output) {\n",
 933         "                    return [cell, data, j];\n",
 934         "                }\n",
 935         "            }\n",
 936         "        }\n",
 937         "    }\n",
 938         "}\n",
 939         "\n",
 940         "// Register the function which deals with the matplotlib target/channel.\n",
 941         "// The kernel may be null if the page has been refreshed.\n",
 942         "if (IPython.notebook.kernel != null) {\n",
 943         "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
 944         "}\n"
 945        ],
 946        "text/plain": [
 947         "<IPython.core.display.Javascript object>"
 948        ]
 949       },
 950       "metadata": {},
 951       "output_type": "display_data"
 952      },
 953      {
 954       "data": {
 955        "text/html": [
 956         "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAAAXNSR0IArs4c6QAAQABJREFUeAHs0IEAAAAAgKD9qRcphAoDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGA0ZW4AABPhSURBVGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYuB06kAEAAAAY5G99j68QMmDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMPAfCAglAAHVK9XiAAAAAElFTkSuQmCC\" width=\"640\">"
 957        ],
 958        "text/plain": [
 959         "<IPython.core.display.HTML object>"
 960        ]
 961       },
 962       "metadata": {},
 963       "output_type": "display_data"
 964      },
 965      {
 966       "data": {
 967        "text/plain": [
 968         "<matplotlib.axes._subplots.AxesSubplot at 0x7ffa455eb630>"
 969        ]
 970       },
 971       "execution_count": 5,
 972       "metadata": {},
 973       "output_type": "execute_result"
 974      }
 975     ],
 976     "source": [
 977      "df.plot() # add a semi-colon to the end of the plotting call to suppress unwanted output"
 978     ]
 979    },
 980    {
 981     "cell_type": "markdown",
 982     "metadata": {},
 983     "source": [
 984      "We can select which plot we want to use by passing it into the 'kind' parameter."
 985     ]
 986    },
 987    {
 988     "cell_type": "code",
 989     "execution_count": 6,
 990     "metadata": {
 991      "collapsed": false
 992     },
 993     "outputs": [
 994      {
 995       "data": {
 996        "application/javascript": [
 997         "/* Put everything inside the global mpl namespace */\n",
 998         "window.mpl = {};\n",
 999         "\n",
1000         "\n",
1001         "mpl.get_websocket_type = function() {\n",
1002         "    if (typeof(WebSocket) !== 'undefined') {\n",
1003         "        return WebSocket;\n",
1004         "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
1005         "        return MozWebSocket;\n",
1006         "    } else {\n",
1007         "        alert('Your browser does not have WebSocket support.' +\n",
1008         "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
1009         "              'Firefox 4 and 5 are also supported but you ' +\n",
1010         "              'have to enable WebSockets in about:config.');\n",
1011         "    };\n",
1012         "}\n",
1013         "\n",
1014         "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
1015         "    this.id = figure_id;\n",
1016         "\n",
1017         "    this.ws = websocket;\n",
1018         "\n",
1019         "    this.supports_binary = (this.ws.binaryType != undefined);\n",
1020         "\n",
1021         "    if (!this.supports_binary) {\n",
1022         "        var warnings = document.getElementById(\"mpl-warnings\");\n",
1023         "        if (warnings) {\n",
1024         "            warnings.style.display = 'block';\n",
1025         "            warnings.textContent = (\n",
1026         "                \"This browser does not support binary websocket messages. \" +\n",
1027         "                    \"Performance may be slow.\");\n",
1028         "        }\n",
1029         "    }\n",
1030         "\n",
1031         "    this.imageObj = new Image();\n",
1032         "\n",
1033         "    this.context = undefined;\n",
1034         "    this.message = undefined;\n",
1035         "    this.canvas = undefined;\n",
1036         "    this.rubberband_canvas = undefined;\n",
1037         "    this.rubberband_context = undefined;\n",
1038         "    this.format_dropdown = undefined;\n",
1039         "\n",
1040         "    this.image_mode = 'full';\n",
1041         "\n",
1042         "    this.root = $('<div/>');\n",
1043         "    this._root_extra_style(this.root)\n",
1044         "    this.root.attr('style', 'display: inline-block');\n",
1045         "\n",
1046         "    $(parent_element).append(this.root);\n",
1047         "\n",
1048         "    this._init_header(this);\n",
1049         "    this._init_canvas(this);\n",
1050         "    this._init_toolbar(this);\n",
1051         "\n",
1052         "    var fig = this;\n",
1053         "\n",
1054         "    this.waiting = false;\n",
1055         "\n",
1056         "    this.ws.onopen =  function () {\n",
1057         "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
1058         "            fig.send_message(\"send_image_mode\", {});\n",
1059         "            if (mpl.ratio != 1) {\n",
1060         "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
1061         "            }\n",
1062         "            fig.send_message(\"refresh\", {});\n",
1063         "        }\n",
1064         "\n",
1065         "    this.imageObj.onload = function() {\n",
1066         "            if (fig.image_mode == 'full') {\n",
1067         "                // Full images could contain transparency (where diff images\n",
1068         "                // almost always do), so we need to clear the canvas so that\n",
1069         "                // there is no ghosting.\n",
1070         "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
1071         "            }\n",
1072         "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
1073         "        };\n",
1074         "\n",
1075         "    this.imageObj.onunload = function() {\n",
1076         "        this.ws.close();\n",
1077         "    }\n",
1078         "\n",
1079         "    this.ws.onmessage = this._make_on_message_function(this);\n",
1080         "\n",
1081         "    this.ondownload = ondownload;\n",
1082         "}\n",
1083         "\n",
1084         "mpl.figure.prototype._init_header = function() {\n",
1085         "    var titlebar = $(\n",
1086         "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
1087         "        'ui-helper-clearfix\"/>');\n",
1088         "    var titletext = $(\n",
1089         "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
1090         "        'text-align: center; padding: 3px;\"/>');\n",
1091         "    titlebar.append(titletext)\n",
1092         "    this.root.append(titlebar);\n",
1093         "    this.header = titletext[0];\n",
1094         "}\n",
1095         "\n",
1096         "\n",
1097         "\n",
1098         "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
1099         "\n",
1100         "}\n",
1101         "\n",
1102         "\n",
1103         "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
1104         "\n",
1105         "}\n",
1106         "\n",
1107         "mpl.figure.prototype._init_canvas = function() {\n",
1108         "    var fig = this;\n",
1109         "\n",
1110         "    var canvas_div = $('<div/>');\n",
1111         "\n",
1112         "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
1113         "\n",
1114         "    function canvas_keyboard_event(event) {\n",
1115         "        return fig.key_event(event, event['data']);\n",
1116         "    }\n",
1117         "\n",
1118         "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
1119         "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
1120         "    this.canvas_div = canvas_div\n",
1121         "    this._canvas_extra_style(canvas_div)\n",
1122         "    this.root.append(canvas_div);\n",
1123         "\n",
1124         "    var canvas = $('<canvas/>');\n",
1125         "    canvas.addClass('mpl-canvas');\n",
1126         "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
1127         "\n",
1128         "    this.canvas = canvas[0];\n",
1129         "    this.context = canvas[0].getContext(\"2d\");\n",
1130         "\n",
1131         "    var backingStore = this.context.backingStorePixelRatio ||\n",
1132         "\tthis.context.webkitBackingStorePixelRatio ||\n",
1133         "\tthis.context.mozBackingStorePixelRatio ||\n",
1134         "\tthis.context.msBackingStorePixelRatio ||\n",
1135         "\tthis.context.oBackingStorePixelRatio ||\n",
1136         "\tthis.context.backingStorePixelRatio || 1;\n",
1137         "\n",
1138         "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
1139         "\n",
1140         "    var rubberband = $('<canvas/>');\n",
1141         "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
1142         "\n",
1143         "    var pass_mouse_events = true;\n",
1144         "\n",
1145         "    canvas_div.resizable({\n",
1146         "        start: function(event, ui) {\n",
1147         "            pass_mouse_events = false;\n",
1148         "        },\n",
1149         "        resize: function(event, ui) {\n",
1150         "            fig.request_resize(ui.size.width, ui.size.height);\n",
1151         "        },\n",
1152         "        stop: function(event, ui) {\n",
1153         "            pass_mouse_events = true;\n",
1154         "            fig.request_resize(ui.size.width, ui.size.height);\n",
1155         "        },\n",
1156         "    });\n",
1157         "\n",
1158         "    function mouse_event_fn(event) {\n",
1159         "        if (pass_mouse_events)\n",
1160         "            return fig.mouse_event(event, event['data']);\n",
1161         "    }\n",
1162         "\n",
1163         "    rubberband.mousedown('button_press', mouse_event_fn);\n",
1164         "    rubberband.mouseup('button_release', mouse_event_fn);\n",
1165         "    // Throttle sequential mouse events to 1 every 20ms.\n",
1166         "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
1167         "\n",
1168         "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
1169         "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
1170         "\n",
1171         "    canvas_div.on(\"wheel\", function (event) {\n",
1172         "        event = event.originalEvent;\n",
1173         "        event['data'] = 'scroll'\n",
1174         "        if (event.deltaY < 0) {\n",
1175         "            event.step = 1;\n",
1176         "        } else {\n",
1177         "            event.step = -1;\n",
1178         "        }\n",
1179         "        mouse_event_fn(event);\n",
1180         "    });\n",
1181         "\n",
1182         "    canvas_div.append(canvas);\n",
1183         "    canvas_div.append(rubberband);\n",
1184         "\n",
1185         "    this.rubberband = rubberband;\n",
1186         "    this.rubberband_canvas = rubberband[0];\n",
1187         "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
1188         "    this.rubberband_context.strokeStyle = \"#000000\";\n",
1189         "\n",
1190         "    this._resize_canvas = function(width, height) {\n",
1191         "        // Keep the size of the canvas, canvas container, and rubber band\n",
1192         "        // canvas in synch.\n",
1193         "        canvas_div.css('width', width)\n",
1194         "        canvas_div.css('height', height)\n",
1195         "\n",
1196         "        canvas.attr('width', width * mpl.ratio);\n",
1197         "        canvas.attr('height', height * mpl.ratio);\n",
1198         "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
1199         "\n",
1200         "        rubberband.attr('width', width);\n",
1201         "        rubberband.attr('height', height);\n",
1202         "    }\n",
1203         "\n",
1204         "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
1205         "    // upon first draw.\n",
1206         "    this._resize_canvas(600, 600);\n",
1207         "\n",
1208         "    // Disable right mouse context menu.\n",
1209         "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
1210         "        return false;\n",
1211         "    });\n",
1212         "\n",
1213         "    function set_focus () {\n",
1214         "        canvas.focus();\n",
1215         "        canvas_div.focus();\n",
1216         "    }\n",
1217         "\n",
1218         "    window.setTimeout(set_focus, 100);\n",
1219         "}\n",
1220         "\n",
1221         "mpl.figure.prototype._init_toolbar = function() {\n",
1222         "    var fig = this;\n",
1223         "\n",
1224         "    var nav_element = $('<div/>')\n",
1225         "    nav_element.attr('style', 'width: 100%');\n",
1226         "    this.root.append(nav_element);\n",
1227         "\n",
1228         "    // Define a callback function for later on.\n",
1229         "    function toolbar_event(event) {\n",
1230         "        return fig.toolbar_button_onclick(event['data']);\n",
1231         "    }\n",
1232         "    function toolbar_mouse_event(event) {\n",
1233         "        return fig.toolbar_button_onmouseover(event['data']);\n",
1234         "    }\n",
1235         "\n",
1236         "    for(var toolbar_ind in mpl.toolbar_items) {\n",
1237         "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
1238         "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
1239         "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
1240         "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
1241         "\n",
1242         "        if (!name) {\n",
1243         "            // put a spacer in here.\n",
1244         "            continue;\n",
1245         "        }\n",
1246         "        var button = $('<button/>');\n",
1247         "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
1248         "                        'ui-button-icon-only');\n",
1249         "        button.attr('role', 'button');\n",
1250         "        button.attr('aria-disabled', 'false');\n",
1251         "        button.click(method_name, toolbar_event);\n",
1252         "        button.mouseover(tooltip, toolbar_mouse_event);\n",
1253         "\n",
1254         "        var icon_img = $('<span/>');\n",
1255         "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
1256         "        icon_img.addClass(image);\n",
1257         "        icon_img.addClass('ui-corner-all');\n",
1258         "\n",
1259         "        var tooltip_span = $('<span/>');\n",
1260         "        tooltip_span.addClass('ui-button-text');\n",
1261         "        tooltip_span.html(tooltip);\n",
1262         "\n",
1263         "        button.append(icon_img);\n",
1264         "        button.append(tooltip_span);\n",
1265         "\n",
1266         "        nav_element.append(button);\n",
1267         "    }\n",
1268         "\n",
1269         "    var fmt_picker_span = $('<span/>');\n",
1270         "\n",
1271         "    var fmt_picker = $('<select/>');\n",
1272         "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
1273         "    fmt_picker_span.append(fmt_picker);\n",
1274         "    nav_element.append(fmt_picker_span);\n",
1275         "    this.format_dropdown = fmt_picker[0];\n",
1276         "\n",
1277         "    for (var ind in mpl.extensions) {\n",
1278         "        var fmt = mpl.extensions[ind];\n",
1279         "        var option = $(\n",
1280         "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
1281         "        fmt_picker.append(option)\n",
1282         "    }\n",
1283         "\n",
1284         "    // Add hover states to the ui-buttons\n",
1285         "    $( \".ui-button\" ).hover(\n",
1286         "        function() { $(this).addClass(\"ui-state-hover\");},\n",
1287         "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
1288         "    );\n",
1289         "\n",
1290         "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
1291         "    nav_element.append(status_bar);\n",
1292         "    this.message = status_bar[0];\n",
1293         "}\n",
1294         "\n",
1295         "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
1296         "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
1297         "    // which will in turn request a refresh of the image.\n",
1298         "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
1299         "}\n",
1300         "\n",
1301         "mpl.figure.prototype.send_message = function(type, properties) {\n",
1302         "    properties['type'] = type;\n",
1303         "    properties['figure_id'] = this.id;\n",
1304         "    this.ws.send(JSON.stringify(properties));\n",
1305         "}\n",
1306         "\n",
1307         "mpl.figure.prototype.send_draw_message = function() {\n",
1308         "    if (!this.waiting) {\n",
1309         "        this.waiting = true;\n",
1310         "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
1311         "    }\n",
1312         "}\n",
1313         "\n",
1314         "\n",
1315         "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
1316         "    var format_dropdown = fig.format_dropdown;\n",
1317         "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
1318         "    fig.ondownload(fig, format);\n",
1319         "}\n",
1320         "\n",
1321         "\n",
1322         "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
1323         "    var size = msg['size'];\n",
1324         "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
1325         "        fig._resize_canvas(size[0], size[1]);\n",
1326         "        fig.send_message(\"refresh\", {});\n",
1327         "    };\n",
1328         "}\n",
1329         "\n",
1330         "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
1331         "    var x0 = msg['x0'] / mpl.ratio;\n",
1332         "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
1333         "    var x1 = msg['x1'] / mpl.ratio;\n",
1334         "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
1335         "    x0 = Math.floor(x0) + 0.5;\n",
1336         "    y0 = Math.floor(y0) + 0.5;\n",
1337         "    x1 = Math.floor(x1) + 0.5;\n",
1338         "    y1 = Math.floor(y1) + 0.5;\n",
1339         "    var min_x = Math.min(x0, x1);\n",
1340         "    var min_y = Math.min(y0, y1);\n",
1341         "    var width = Math.abs(x1 - x0);\n",
1342         "    var height = Math.abs(y1 - y0);\n",
1343         "\n",
1344         "    fig.rubberband_context.clearRect(\n",
1345         "        0, 0, fig.canvas.width, fig.canvas.height);\n",
1346         "\n",
1347         "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
1348         "}\n",
1349         "\n",
1350         "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
1351         "    // Updates the figure title.\n",
1352         "    fig.header.textContent = msg['label'];\n",
1353         "}\n",
1354         "\n",
1355         "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
1356         "    var cursor = msg['cursor'];\n",
1357         "    switch(cursor)\n",
1358         "    {\n",
1359         "    case 0:\n",
1360         "        cursor = 'pointer';\n",
1361         "        break;\n",
1362         "    case 1:\n",
1363         "        cursor = 'default';\n",
1364         "        break;\n",
1365         "    case 2:\n",
1366         "        cursor = 'crosshair';\n",
1367         "        break;\n",
1368         "    case 3:\n",
1369         "        cursor = 'move';\n",
1370         "        break;\n",
1371         "    }\n",
1372         "    fig.rubberband_canvas.style.cursor = cursor;\n",
1373         "}\n",
1374         "\n",
1375         "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
1376         "    fig.message.textContent = msg['message'];\n",
1377         "}\n",
1378         "\n",
1379         "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
1380         "    // Request the server to send over a new figure.\n",
1381         "    fig.send_draw_message();\n",
1382         "}\n",
1383         "\n",
1384         "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
1385         "    fig.image_mode = msg['mode'];\n",
1386         "}\n",
1387         "\n",
1388         "mpl.figure.prototype.updated_canvas_event = function() {\n",
1389         "    // Called whenever the canvas gets updated.\n",
1390         "    this.send_message(\"ack\", {});\n",
1391         "}\n",
1392         "\n",
1393         "// A function to construct a web socket function for onmessage handling.\n",
1394         "// Called in the figure constructor.\n",
1395         "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
1396         "    return function socket_on_message(evt) {\n",
1397         "        if (evt.data instanceof Blob) {\n",
1398         "            /* FIXME: We get \"Resource interpreted as Image but\n",
1399         "             * transferred with MIME type text/plain:\" errors on\n",
1400         "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
1401         "             * to be part of the websocket stream */\n",
1402         "            evt.data.type = \"image/png\";\n",
1403         "\n",
1404         "            /* Free the memory for the previous frames */\n",
1405         "            if (fig.imageObj.src) {\n",
1406         "                (window.URL || window.webkitURL).revokeObjectURL(\n",
1407         "                    fig.imageObj.src);\n",
1408         "            }\n",
1409         "\n",
1410         "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
1411         "                evt.data);\n",
1412         "            fig.updated_canvas_event();\n",
1413         "            fig.waiting = false;\n",
1414         "            return;\n",
1415         "        }\n",
1416         "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
1417         "            fig.imageObj.src = evt.data;\n",
1418         "            fig.updated_canvas_event();\n",
1419         "            fig.waiting = false;\n",
1420         "            return;\n",
1421         "        }\n",
1422         "\n",
1423         "        var msg = JSON.parse(evt.data);\n",
1424         "        var msg_type = msg['type'];\n",
1425         "\n",
1426         "        // Call the  \"handle_{type}\" callback, which takes\n",
1427         "        // the figure and JSON message as its only arguments.\n",
1428         "        try {\n",
1429         "            var callback = fig[\"handle_\" + msg_type];\n",
1430         "        } catch (e) {\n",
1431         "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
1432         "            return;\n",
1433         "        }\n",
1434         "\n",
1435         "        if (callback) {\n",
1436         "            try {\n",
1437         "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
1438         "                callback(fig, msg);\n",
1439         "            } catch (e) {\n",
1440         "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
1441         "            }\n",
1442         "        }\n",
1443         "    };\n",
1444         "}\n",
1445         "\n",
1446         "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
1447         "mpl.findpos = function(e) {\n",
1448         "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
1449         "    var targ;\n",
1450         "    if (!e)\n",
1451         "        e = window.event;\n",
1452         "    if (e.target)\n",
1453         "        targ = e.target;\n",
1454         "    else if (e.srcElement)\n",
1455         "        targ = e.srcElement;\n",
1456         "    if (targ.nodeType == 3) // defeat Safari bug\n",
1457         "        targ = targ.parentNode;\n",
1458         "\n",
1459         "    // jQuery normalizes the pageX and pageY\n",
1460         "    // pageX,Y are the mouse positions relative to the document\n",
1461         "    // offset() returns the position of the element relative to the document\n",
1462         "    var x = e.pageX - $(targ).offset().left;\n",
1463         "    var y = e.pageY - $(targ).offset().top;\n",
1464         "\n",
1465         "    return {\"x\": x, \"y\": y};\n",
1466         "};\n",
1467         "\n",
1468         "/*\n",
1469         " * return a copy of an object with only non-object keys\n",
1470         " * we need this to avoid circular references\n",
1471         " * http://stackoverflow.com/a/24161582/3208463\n",
1472         " */\n",
1473         "function simpleKeys (original) {\n",
1474         "  return Object.keys(original).reduce(function (obj, key) {\n",
1475         "    if (typeof original[key] !== 'object')\n",
1476         "        obj[key] = original[key]\n",
1477         "    return obj;\n",
1478         "  }, {});\n",
1479         "}\n",
1480         "\n",
1481         "mpl.figure.prototype.mouse_event = function(event, name) {\n",
1482         "    var canvas_pos = mpl.findpos(event)\n",
1483         "\n",
1484         "    if (name === 'button_press')\n",
1485         "    {\n",
1486         "        this.canvas.focus();\n",
1487         "        this.canvas_div.focus();\n",
1488         "    }\n",
1489         "\n",
1490         "    var x = canvas_pos.x * mpl.ratio;\n",
1491         "    var y = canvas_pos.y * mpl.ratio;\n",
1492         "\n",
1493         "    this.send_message(name, {x: x, y: y, button: event.button,\n",
1494         "                             step: event.step,\n",
1495         "                             guiEvent: simpleKeys(event)});\n",
1496         "\n",
1497         "    /* This prevents the web browser from automatically changing to\n",
1498         "     * the text insertion cursor when the button is pressed.  We want\n",
1499         "     * to control all of the cursor setting manually through the\n",
1500         "     * 'cursor' event from matplotlib */\n",
1501         "    event.preventDefault();\n",
1502         "    return false;\n",
1503         "}\n",
1504         "\n",
1505         "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
1506         "    // Handle any extra behaviour associated with a key event\n",
1507         "}\n",
1508         "\n",
1509         "mpl.figure.prototype.key_event = function(event, name) {\n",
1510         "\n",
1511         "    // Prevent repeat events\n",
1512         "    if (name == 'key_press')\n",
1513         "    {\n",
1514         "        if (event.which === this._key)\n",
1515         "            return;\n",
1516         "        else\n",
1517         "            this._key = event.which;\n",
1518         "    }\n",
1519         "    if (name == 'key_release')\n",
1520         "        this._key = null;\n",
1521         "\n",
1522         "    var value = '';\n",
1523         "    if (event.ctrlKey && event.which != 17)\n",
1524         "        value += \"ctrl+\";\n",
1525         "    if (event.altKey && event.which != 18)\n",
1526         "        value += \"alt+\";\n",
1527         "    if (event.shiftKey && event.which != 16)\n",
1528         "        value += \"shift+\";\n",
1529         "\n",
1530         "    value += 'k';\n",
1531         "    value += event.which.toString();\n",
1532         "\n",
1533         "    this._key_event_extra(event, name);\n",
1534         "\n",
1535         "    this.send_message(name, {key: value,\n",
1536         "                             guiEvent: simpleKeys(event)});\n",
1537         "    return false;\n",
1538         "}\n",
1539         "\n",
1540         "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
1541         "    if (name == 'download') {\n",
1542         "        this.handle_save(this, null);\n",
1543         "    } else {\n",
1544         "        this.send_message(\"toolbar_button\", {name: name});\n",
1545         "    }\n",
1546         "};\n",
1547         "\n",
1548         "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
1549         "    this.message.textContent = tooltip;\n",
1550         "};\n",
1551         "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",
1552         "\n",
1553         "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
1554         "\n",
1555         "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
1556         "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
1557         "    // object with the appropriate methods. Currently this is a non binary\n",
1558         "    // socket, so there is still some room for performance tuning.\n",
1559         "    var ws = {};\n",
1560         "\n",
1561         "    ws.close = function() {\n",
1562         "        comm.close()\n",
1563         "    };\n",
1564         "    ws.send = function(m) {\n",
1565         "        //console.log('sending', m);\n",
1566         "        comm.send(m);\n",
1567         "    };\n",
1568         "    // Register the callback with on_msg.\n",
1569         "    comm.on_msg(function(msg) {\n",
1570         "        //console.log('receiving', msg['content']['data'], msg);\n",
1571         "        // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
1572         "        ws.onmessage(msg['content']['data'])\n",
1573         "    });\n",
1574         "    return ws;\n",
1575         "}\n",
1576         "\n",
1577         "mpl.mpl_figure_comm = function(comm, msg) {\n",
1578         "    // This is the function which gets called when the mpl process\n",
1579         "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
1580         "\n",
1581         "    var id = msg.content.data.id;\n",
1582         "    // Get hold of the div created by the display call when the Comm\n",
1583         "    // socket was opened in Python.\n",
1584         "    var element = $(\"#\" + id);\n",
1585         "    var ws_proxy = comm_websocket_adapter(comm)\n",
1586         "\n",
1587         "    function ondownload(figure, format) {\n",
1588         "        window.open(figure.imageObj.src);\n",
1589         "    }\n",
1590         "\n",
1591         "    var fig = new mpl.figure(id, ws_proxy,\n",
1592         "                           ondownload,\n",
1593         "                           element.get(0));\n",
1594         "\n",
1595         "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
1596         "    // web socket which is closed, not our websocket->open comm proxy.\n",
1597         "    ws_proxy.onopen();\n",
1598         "\n",
1599         "    fig.parent_element = element.get(0);\n",
1600         "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
1601         "    if (!fig.cell_info) {\n",
1602         "        console.error(\"Failed to find cell for figure\", id, fig);\n",
1603         "        return;\n",
1604         "    }\n",
1605         "\n",
1606         "    var output_index = fig.cell_info[2]\n",
1607         "    var cell = fig.cell_info[0];\n",
1608         "\n",
1609         "};\n",
1610         "\n",
1611         "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
1612         "    var width = fig.canvas.width/mpl.ratio\n",
1613         "    fig.root.unbind('remove')\n",
1614         "\n",
1615         "    // Update the output cell to use the data from the current canvas.\n",
1616         "    fig.push_to_output();\n",
1617         "    var dataURL = fig.canvas.toDataURL();\n",
1618         "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
1619         "    // the notebook keyboard shortcuts fail.\n",
1620         "    IPython.keyboard_manager.enable()\n",
1621         "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
1622         "    fig.close_ws(fig, msg);\n",
1623         "}\n",
1624         "\n",
1625         "mpl.figure.prototype.close_ws = function(fig, msg){\n",
1626         "    fig.send_message('closing', msg);\n",
1627         "    // fig.ws.close()\n",
1628         "}\n",
1629         "\n",
1630         "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
1631         "    // Turn the data on the canvas into data in the output cell.\n",
1632         "    var width = this.canvas.width/mpl.ratio\n",
1633         "    var dataURL = this.canvas.toDataURL();\n",
1634         "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
1635         "}\n",
1636         "\n",
1637         "mpl.figure.prototype.updated_canvas_event = function() {\n",
1638         "    // Tell IPython that the notebook contents must change.\n",
1639         "    IPython.notebook.set_dirty(true);\n",
1640         "    this.send_message(\"ack\", {});\n",
1641         "    var fig = this;\n",
1642         "    // Wait a second, then push the new image to the DOM so\n",
1643         "    // that it is saved nicely (might be nice to debounce this).\n",
1644         "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
1645         "}\n",
1646         "\n",
1647         "mpl.figure.prototype._init_toolbar = function() {\n",
1648         "    var fig = this;\n",
1649         "\n",
1650         "    var nav_element = $('<div/>')\n",
1651         "    nav_element.attr('style', 'width: 100%');\n",
1652         "    this.root.append(nav_element);\n",
1653         "\n",
1654         "    // Define a callback function for later on.\n",
1655         "    function toolbar_event(event) {\n",
1656         "        return fig.toolbar_button_onclick(event['data']);\n",
1657         "    }\n",
1658         "    function toolbar_mouse_event(event) {\n",
1659         "        return fig.toolbar_button_onmouseover(event['data']);\n",
1660         "    }\n",
1661         "\n",
1662         "    for(var toolbar_ind in mpl.toolbar_items){\n",
1663         "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
1664         "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
1665         "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
1666         "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
1667         "\n",
1668         "        if (!name) { continue; };\n",
1669         "\n",
1670         "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
1671         "        button.click(method_name, toolbar_event);\n",
1672         "        button.mouseover(tooltip, toolbar_mouse_event);\n",
1673         "        nav_element.append(button);\n",
1674         "    }\n",
1675         "\n",
1676         "    // Add the status bar.\n",
1677         "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
1678         "    nav_element.append(status_bar);\n",
1679         "    this.message = status_bar[0];\n",
1680         "\n",
1681         "    // Add the close button to the window.\n",
1682         "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
1683         "    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",
1684         "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
1685         "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
1686         "    buttongrp.append(button);\n",
1687         "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
1688         "    titlebar.prepend(buttongrp);\n",
1689         "}\n",
1690         "\n",
1691         "mpl.figure.prototype._root_extra_style = function(el){\n",
1692         "    var fig = this\n",
1693         "    el.on(\"remove\", function(){\n",
1694         "\tfig.close_ws(fig, {});\n",
1695         "    });\n",
1696         "}\n",
1697         "\n",
1698         "mpl.figure.prototype._canvas_extra_style = function(el){\n",
1699         "    // this is important to make the div 'focusable\n",
1700         "    el.attr('tabindex', 0)\n",
1701         "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
1702         "    // off when our div gets focus\n",
1703         "\n",
1704         "    // location in version 3\n",
1705         "    if (IPython.notebook.keyboard_manager) {\n",
1706         "        IPython.notebook.keyboard_manager.register_events(el);\n",
1707         "    }\n",
1708         "    else {\n",
1709         "        // location in version 2\n",
1710         "        IPython.keyboard_manager.register_events(el);\n",
1711         "    }\n",
1712         "\n",
1713         "}\n",
1714         "\n",
1715         "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
1716         "    var manager = IPython.notebook.keyboard_manager;\n",
1717         "    if (!manager)\n",
1718         "        manager = IPython.keyboard_manager;\n",
1719         "\n",
1720         "    // Check for shift+enter\n",
1721         "    if (event.shiftKey && event.which == 13) {\n",
1722         "        this.canvas_div.blur();\n",
1723         "        // select the cell after this one\n",
1724         "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
1725         "        IPython.notebook.select(index + 1);\n",
1726         "    }\n",
1727         "}\n",
1728         "\n",
1729         "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
1730         "    fig.ondownload(fig, null);\n",
1731         "}\n",
1732         "\n",
1733         "\n",
1734         "mpl.find_output_cell = function(html_output) {\n",
1735         "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
1736         "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
1737         "    // IPython event is triggered only after the cells have been serialised, which for\n",
1738         "    // our purposes (turning an active figure into a static one), is too late.\n",
1739         "    var cells = IPython.notebook.get_cells();\n",
1740         "    var ncells = cells.length;\n",
1741         "    for (var i=0; i<ncells; i++) {\n",
1742         "        var cell = cells[i];\n",
1743         "        if (cell.cell_type === 'code'){\n",
1744         "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
1745         "                var data = cell.output_area.outputs[j];\n",
1746         "                if (data.data) {\n",
1747         "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
1748         "                    data = data.data;\n",
1749         "                }\n",
1750         "                if (data['text/html'] == html_output) {\n",
1751         "                    return [cell, data, j];\n",
1752         "                }\n",
1753         "            }\n",
1754         "        }\n",
1755         "    }\n",
1756         "}\n",
1757         "\n",
1758         "// Register the function which deals with the matplotlib target/channel.\n",
1759         "// The kernel may be null if the page has been refreshed.\n",
1760         "if (IPython.notebook.kernel != null) {\n",
1761         "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
1762         "}\n"
1763        ],
1764        "text/plain": [
1765         "<IPython.core.display.Javascript object>"
1766        ]
1767       },
1768       "metadata": {},
1769       "output_type": "display_data"
1770      },
1771      {
1772       "data": {
1773        "text/html": [
1774         "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAAAXNSR0IArs4c6QAAQABJREFUeAHs0IEAAAAAgKD9qRcphAoDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGA0ZW4AABPhSURBVGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYuB06kAEAAAAY5G99j68QMmDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMPAfCAglAAHVK9XiAAAAAElFTkSuQmCC\" width=\"640\">"
1775        ],
1776        "text/plain": [
1777         "<IPython.core.display.HTML object>"
1778        ]
1779       },
1780       "metadata": {},
1781       "output_type": "display_data"
1782      },
1783      {
1784       "data": {
1785        "text/plain": [
1786         "<matplotlib.axes._subplots.AxesSubplot at 0x7ffa4555d240>"
1787        ]
1788       },
1789       "execution_count": 6,
1790       "metadata": {},
1791       "output_type": "execute_result"
1792      }
1793     ],
1794     "source": [
1795      "df.plot('A','B', kind = 'scatter')"
1796     ]
1797    },
1798    {
1799     "cell_type": "markdown",
1800     "metadata": {},
1801     "source": [
1802      "You can also choose the plot kind by using the `DataFrame.plot.kind` methods instead of providing the `kind` keyword argument.\n",
1803      "\n",
1804      "`kind` :\n",
1805      "- `'line'` : line plot (default)\n",
1806      "- `'bar'` : vertical bar plot\n",
1807      "- `'barh'` : horizontal bar plot\n",
1808      "- `'hist'` : histogram\n",
1809      "- `'box'` : boxplot\n",
1810      "- `'kde'` : Kernel Density Estimation plot\n",
1811      "- `'density'` : same as 'kde'\n",
1812      "- `'area'` : area plot\n",
1813      "- `'pie'` : pie plot\n",
1814      "- `'scatter'` : scatter plot\n",
1815      "- `'hexbin'` : hexbin plot"
1816     ]
1817    },
1818    {
1819     "cell_type": "code",
1820     "execution_count": 7,
1821     "metadata": {
1822      "collapsed": false,
1823      "scrolled": false
1824     },
1825     "outputs": [
1826      {
1827       "data": {
1828        "application/javascript": [
1829         "/* Put everything inside the global mpl namespace */\n",
1830         "window.mpl = {};\n",
1831         "\n",
1832         "\n",
1833         "mpl.get_websocket_type = function() {\n",
1834         "    if (typeof(WebSocket) !== 'undefined') {\n",
1835         "        return WebSocket;\n",
1836         "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
1837         "        return MozWebSocket;\n",
1838         "    } else {\n",
1839         "        alert('Your browser does not have WebSocket support.' +\n",
1840         "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
1841         "              'Firefox 4 and 5 are also supported but you ' +\n",
1842         "              'have to enable WebSockets in about:config.');\n",
1843         "    };\n",
1844         "}\n",
1845         "\n",
1846         "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
1847         "    this.id = figure_id;\n",
1848         "\n",
1849         "    this.ws = websocket;\n",
1850         "\n",
1851         "    this.supports_binary = (this.ws.binaryType != undefined);\n",
1852         "\n",
1853         "    if (!this.supports_binary) {\n",
1854         "        var warnings = document.getElementById(\"mpl-warnings\");\n",
1855         "        if (warnings) {\n",
1856         "            warnings.style.display = 'block';\n",
1857         "            warnings.textContent = (\n",
1858         "                \"This browser does not support binary websocket messages. \" +\n",
1859         "                    \"Performance may be slow.\");\n",
1860         "        }\n",
1861         "    }\n",
1862         "\n",
1863         "    this.imageObj = new Image();\n",
1864         "\n",
1865         "    this.context = undefined;\n",
1866         "    this.message = undefined;\n",
1867         "    this.canvas = undefined;\n",
1868         "    this.rubberband_canvas = undefined;\n",
1869         "    this.rubberband_context = undefined;\n",
1870         "    this.format_dropdown = undefined;\n",
1871         "\n",
1872         "    this.image_mode = 'full';\n",
1873         "\n",
1874         "    this.root = $('<div/>');\n",
1875         "    this._root_extra_style(this.root)\n",
1876         "    this.root.attr('style', 'display: inline-block');\n",
1877         "\n",
1878         "    $(parent_element).append(this.root);\n",
1879         "\n",
1880         "    this._init_header(this);\n",
1881         "    this._init_canvas(this);\n",
1882         "    this._init_toolbar(this);\n",
1883         "\n",
1884         "    var fig = this;\n",
1885         "\n",
1886         "    this.waiting = false;\n",
1887         "\n",
1888         "    this.ws.onopen =  function () {\n",
1889         "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
1890         "            fig.send_message(\"send_image_mode\", {});\n",
1891         "            if (mpl.ratio != 1) {\n",
1892         "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
1893         "            }\n",
1894         "            fig.send_message(\"refresh\", {});\n",
1895         "        }\n",
1896         "\n",
1897         "    this.imageObj.onload = function() {\n",
1898         "            if (fig.image_mode == 'full') {\n",
1899         "                // Full images could contain transparency (where diff images\n",
1900         "                // almost always do), so we need to clear the canvas so that\n",
1901         "                // there is no ghosting.\n",
1902         "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
1903         "            }\n",
1904         "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
1905         "        };\n",
1906         "\n",
1907         "    this.imageObj.onunload = function() {\n",
1908         "        this.ws.close();\n",
1909         "    }\n",
1910         "\n",
1911         "    this.ws.onmessage = this._make_on_message_function(this);\n",
1912         "\n",
1913         "    this.ondownload = ondownload;\n",
1914         "}\n",
1915         "\n",
1916         "mpl.figure.prototype._init_header = function() {\n",
1917         "    var titlebar = $(\n",
1918         "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
1919         "        'ui-helper-clearfix\"/>');\n",
1920         "    var titletext = $(\n",
1921         "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
1922         "        'text-align: center; padding: 3px;\"/>');\n",
1923         "    titlebar.append(titletext)\n",
1924         "    this.root.append(titlebar);\n",
1925         "    this.header = titletext[0];\n",
1926         "}\n",
1927         "\n",
1928         "\n",
1929         "\n",
1930         "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
1931         "\n",
1932         "}\n",
1933         "\n",
1934         "\n",
1935         "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
1936         "\n",
1937         "}\n",
1938         "\n",
1939         "mpl.figure.prototype._init_canvas = function() {\n",
1940         "    var fig = this;\n",
1941         "\n",
1942         "    var canvas_div = $('<div/>');\n",
1943         "\n",
1944         "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
1945         "\n",
1946         "    function canvas_keyboard_event(event) {\n",
1947         "        return fig.key_event(event, event['data']);\n",
1948         "    }\n",
1949         "\n",
1950         "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
1951         "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
1952         "    this.canvas_div = canvas_div\n",
1953         "    this._canvas_extra_style(canvas_div)\n",
1954         "    this.root.append(canvas_div);\n",
1955         "\n",
1956         "    var canvas = $('<canvas/>');\n",
1957         "    canvas.addClass('mpl-canvas');\n",
1958         "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
1959         "\n",
1960         "    this.canvas = canvas[0];\n",
1961         "    this.context = canvas[0].getContext(\"2d\");\n",
1962         "\n",
1963         "    var backingStore = this.context.backingStorePixelRatio ||\n",
1964         "\tthis.context.webkitBackingStorePixelRatio ||\n",
1965         "\tthis.context.mozBackingStorePixelRatio ||\n",
1966         "\tthis.context.msBackingStorePixelRatio ||\n",
1967         "\tthis.context.oBackingStorePixelRatio ||\n",
1968         "\tthis.context.backingStorePixelRatio || 1;\n",
1969         "\n",
1970         "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
1971         "\n",
1972         "    var rubberband = $('<canvas/>');\n",
1973         "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
1974         "\n",
1975         "    var pass_mouse_events = true;\n",
1976         "\n",
1977         "    canvas_div.resizable({\n",
1978         "        start: function(event, ui) {\n",
1979         "            pass_mouse_events = false;\n",
1980         "        },\n",
1981         "        resize: function(event, ui) {\n",
1982         "            fig.request_resize(ui.size.width, ui.size.height);\n",
1983         "        },\n",
1984         "        stop: function(event, ui) {\n",
1985         "            pass_mouse_events = true;\n",
1986         "            fig.request_resize(ui.size.width, ui.size.height);\n",
1987         "        },\n",
1988         "    });\n",
1989         "\n",
1990         "    function mouse_event_fn(event) {\n",
1991         "        if (pass_mouse_events)\n",
1992         "            return fig.mouse_event(event, event['data']);\n",
1993         "    }\n",
1994         "\n",
1995         "    rubberband.mousedown('button_press', mouse_event_fn);\n",
1996         "    rubberband.mouseup('button_release', mouse_event_fn);\n",
1997         "    // Throttle sequential mouse events to 1 every 20ms.\n",
1998         "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
1999         "\n",
2000         "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
2001         "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
2002         "\n",
2003         "    canvas_div.on(\"wheel\", function (event) {\n",
2004         "        event = event.originalEvent;\n",
2005         "        event['data'] = 'scroll'\n",
2006         "        if (event.deltaY < 0) {\n",
2007         "            event.step = 1;\n",
2008         "        } else {\n",
2009         "            event.step = -1;\n",
2010         "        }\n",
2011         "        mouse_event_fn(event);\n",
2012         "    });\n",
2013         "\n",
2014         "    canvas_div.append(canvas);\n",
2015         "    canvas_div.append(rubberband);\n",
2016         "\n",
2017         "    this.rubberband = rubberband;\n",
2018         "    this.rubberband_canvas = rubberband[0];\n",
2019         "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
2020         "    this.rubberband_context.strokeStyle = \"#000000\";\n",
2021         "\n",
2022         "    this._resize_canvas = function(width, height) {\n",
2023         "        // Keep the size of the canvas, canvas container, and rubber band\n",
2024         "        // canvas in synch.\n",
2025         "        canvas_div.css('width', width)\n",
2026         "        canvas_div.css('height', height)\n",
2027         "\n",
2028         "        canvas.attr('width', width * mpl.ratio);\n",
2029         "        canvas.attr('height', height * mpl.ratio);\n",
2030         "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
2031         "\n",
2032         "        rubberband.attr('width', width);\n",
2033         "        rubberband.attr('height', height);\n",
2034         "    }\n",
2035         "\n",
2036         "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
2037         "    // upon first draw.\n",
2038         "    this._resize_canvas(600, 600);\n",
2039         "\n",
2040         "    // Disable right mouse context menu.\n",
2041         "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
2042         "        return false;\n",
2043         "    });\n",
2044         "\n",
2045         "    function set_focus () {\n",
2046         "        canvas.focus();\n",
2047         "        canvas_div.focus();\n",
2048         "    }\n",
2049         "\n",
2050         "    window.setTimeout(set_focus, 100);\n",
2051         "}\n",
2052         "\n",
2053         "mpl.figure.prototype._init_toolbar = function() {\n",
2054         "    var fig = this;\n",
2055         "\n",
2056         "    var nav_element = $('<div/>')\n",
2057         "    nav_element.attr('style', 'width: 100%');\n",
2058         "    this.root.append(nav_element);\n",
2059         "\n",
2060         "    // Define a callback function for later on.\n",
2061         "    function toolbar_event(event) {\n",
2062         "        return fig.toolbar_button_onclick(event['data']);\n",
2063         "    }\n",
2064         "    function toolbar_mouse_event(event) {\n",
2065         "        return fig.toolbar_button_onmouseover(event['data']);\n",
2066         "    }\n",
2067         "\n",
2068         "    for(var toolbar_ind in mpl.toolbar_items) {\n",
2069         "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
2070         "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
2071         "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
2072         "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
2073         "\n",
2074         "        if (!name) {\n",
2075         "            // put a spacer in here.\n",
2076         "            continue;\n",
2077         "        }\n",
2078         "        var button = $('<button/>');\n",
2079         "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
2080         "                        'ui-button-icon-only');\n",
2081         "        button.attr('role', 'button');\n",
2082         "        button.attr('aria-disabled', 'false');\n",
2083         "        button.click(method_name, toolbar_event);\n",
2084         "        button.mouseover(tooltip, toolbar_mouse_event);\n",
2085         "\n",
2086         "        var icon_img = $('<span/>');\n",
2087         "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
2088         "        icon_img.addClass(image);\n",
2089         "        icon_img.addClass('ui-corner-all');\n",
2090         "\n",
2091         "        var tooltip_span = $('<span/>');\n",
2092         "        tooltip_span.addClass('ui-button-text');\n",
2093         "        tooltip_span.html(tooltip);\n",
2094         "\n",
2095         "        button.append(icon_img);\n",
2096         "        button.append(tooltip_span);\n",
2097         "\n",
2098         "        nav_element.append(button);\n",
2099         "    }\n",
2100         "\n",
2101         "    var fmt_picker_span = $('<span/>');\n",
2102         "\n",
2103         "    var fmt_picker = $('<select/>');\n",
2104         "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
2105         "    fmt_picker_span.append(fmt_picker);\n",
2106         "    nav_element.append(fmt_picker_span);\n",
2107         "    this.format_dropdown = fmt_picker[0];\n",
2108         "\n",
2109         "    for (var ind in mpl.extensions) {\n",
2110         "        var fmt = mpl.extensions[ind];\n",
2111         "        var option = $(\n",
2112         "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
2113         "        fmt_picker.append(option)\n",
2114         "    }\n",
2115         "\n",
2116         "    // Add hover states to the ui-buttons\n",
2117         "    $( \".ui-button\" ).hover(\n",
2118         "        function() { $(this).addClass(\"ui-state-hover\");},\n",
2119         "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
2120         "    );\n",
2121         "\n",
2122         "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
2123         "    nav_element.append(status_bar);\n",
2124         "    this.message = status_bar[0];\n",
2125         "}\n",
2126         "\n",
2127         "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
2128         "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
2129         "    // which will in turn request a refresh of the image.\n",
2130         "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
2131         "}\n",
2132         "\n",
2133         "mpl.figure.prototype.send_message = function(type, properties) {\n",
2134         "    properties['type'] = type;\n",
2135         "    properties['figure_id'] = this.id;\n",
2136         "    this.ws.send(JSON.stringify(properties));\n",
2137         "}\n",
2138         "\n",
2139         "mpl.figure.prototype.send_draw_message = function() {\n",
2140         "    if (!this.waiting) {\n",
2141         "        this.waiting = true;\n",
2142         "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
2143         "    }\n",
2144         "}\n",
2145         "\n",
2146         "\n",
2147         "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
2148         "    var format_dropdown = fig.format_dropdown;\n",
2149         "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
2150         "    fig.ondownload(fig, format);\n",
2151         "}\n",
2152         "\n",
2153         "\n",
2154         "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
2155         "    var size = msg['size'];\n",
2156         "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
2157         "        fig._resize_canvas(size[0], size[1]);\n",
2158         "        fig.send_message(\"refresh\", {});\n",
2159         "    };\n",
2160         "}\n",
2161         "\n",
2162         "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
2163         "    var x0 = msg['x0'] / mpl.ratio;\n",
2164         "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
2165         "    var x1 = msg['x1'] / mpl.ratio;\n",
2166         "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
2167         "    x0 = Math.floor(x0) + 0.5;\n",
2168         "    y0 = Math.floor(y0) + 0.5;\n",
2169         "    x1 = Math.floor(x1) + 0.5;\n",
2170         "    y1 = Math.floor(y1) + 0.5;\n",
2171         "    var min_x = Math.min(x0, x1);\n",
2172         "    var min_y = Math.min(y0, y1);\n",
2173         "    var width = Math.abs(x1 - x0);\n",
2174         "    var height = Math.abs(y1 - y0);\n",
2175         "\n",
2176         "    fig.rubberband_context.clearRect(\n",
2177         "        0, 0, fig.canvas.width, fig.canvas.height);\n",
2178         "\n",
2179         "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
2180         "}\n",
2181         "\n",
2182         "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
2183         "    // Updates the figure title.\n",
2184         "    fig.header.textContent = msg['label'];\n",
2185         "}\n",
2186         "\n",
2187         "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
2188         "    var cursor = msg['cursor'];\n",
2189         "    switch(cursor)\n",
2190         "    {\n",
2191         "    case 0:\n",
2192         "        cursor = 'pointer';\n",
2193         "        break;\n",
2194         "    case 1:\n",
2195         "        cursor = 'default';\n",
2196         "        break;\n",
2197         "    case 2:\n",
2198         "        cursor = 'crosshair';\n",
2199         "        break;\n",
2200         "    case 3:\n",
2201         "        cursor = 'move';\n",
2202         "        break;\n",
2203         "    }\n",
2204         "    fig.rubberband_canvas.style.cursor = cursor;\n",
2205         "}\n",
2206         "\n",
2207         "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
2208         "    fig.message.textContent = msg['message'];\n",
2209         "}\n",
2210         "\n",
2211         "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
2212         "    // Request the server to send over a new figure.\n",
2213         "    fig.send_draw_message();\n",
2214         "}\n",
2215         "\n",
2216         "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
2217         "    fig.image_mode = msg['mode'];\n",
2218         "}\n",
2219         "\n",
2220         "mpl.figure.prototype.updated_canvas_event = function() {\n",
2221         "    // Called whenever the canvas gets updated.\n",
2222         "    this.send_message(\"ack\", {});\n",
2223         "}\n",
2224         "\n",
2225         "// A function to construct a web socket function for onmessage handling.\n",
2226         "// Called in the figure constructor.\n",
2227         "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
2228         "    return function socket_on_message(evt) {\n",
2229         "        if (evt.data instanceof Blob) {\n",
2230         "            /* FIXME: We get \"Resource interpreted as Image but\n",
2231         "             * transferred with MIME type text/plain:\" errors on\n",
2232         "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
2233         "             * to be part of the websocket stream */\n",
2234         "            evt.data.type = \"image/png\";\n",
2235         "\n",
2236         "            /* Free the memory for the previous frames */\n",
2237         "            if (fig.imageObj.src) {\n",
2238         "                (window.URL || window.webkitURL).revokeObjectURL(\n",
2239         "                    fig.imageObj.src);\n",
2240         "            }\n",
2241         "\n",
2242         "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
2243         "                evt.data);\n",
2244         "            fig.updated_canvas_event();\n",
2245         "            fig.waiting = false;\n",
2246         "            return;\n",
2247         "        }\n",
2248         "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
2249         "            fig.imageObj.src = evt.data;\n",
2250         "            fig.updated_canvas_event();\n",
2251         "            fig.waiting = false;\n",
2252         "            return;\n",
2253         "        }\n",
2254         "\n",
2255         "        var msg = JSON.parse(evt.data);\n",
2256         "        var msg_type = msg['type'];\n",
2257         "\n",
2258         "        // Call the  \"handle_{type}\" callback, which takes\n",
2259         "        // the figure and JSON message as its only arguments.\n",
2260         "        try {\n",
2261         "            var callback = fig[\"handle_\" + msg_type];\n",
2262         "        } catch (e) {\n",
2263         "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
2264         "            return;\n",
2265         "        }\n",
2266         "\n",
2267         "        if (callback) {\n",
2268         "            try {\n",
2269         "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
2270         "                callback(fig, msg);\n",
2271         "            } catch (e) {\n",
2272         "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
2273         "            }\n",
2274         "        }\n",
2275         "    };\n",
2276         "}\n",
2277         "\n",
2278         "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
2279         "mpl.findpos = function(e) {\n",
2280         "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
2281         "    var targ;\n",
2282         "    if (!e)\n",
2283         "        e = window.event;\n",
2284         "    if (e.target)\n",
2285         "        targ = e.target;\n",
2286         "    else if (e.srcElement)\n",
2287         "        targ = e.srcElement;\n",
2288         "    if (targ.nodeType == 3) // defeat Safari bug\n",
2289         "        targ = targ.parentNode;\n",
2290         "\n",
2291         "    // jQuery normalizes the pageX and pageY\n",
2292         "    // pageX,Y are the mouse positions relative to the document\n",
2293         "    // offset() returns the position of the element relative to the document\n",
2294         "    var x = e.pageX - $(targ).offset().left;\n",
2295         "    var y = e.pageY - $(targ).offset().top;\n",
2296         "\n",
2297         "    return {\"x\": x, \"y\": y};\n",
2298         "};\n",
2299         "\n",
2300         "/*\n",
2301         " * return a copy of an object with only non-object keys\n",
2302         " * we need this to avoid circular references\n",
2303         " * http://stackoverflow.com/a/24161582/3208463\n",
2304         " */\n",
2305         "function simpleKeys (original) {\n",
2306         "  return Object.keys(original).reduce(function (obj, key) {\n",
2307         "    if (typeof original[key] !== 'object')\n",
2308         "        obj[key] = original[key]\n",
2309         "    return obj;\n",
2310         "  }, {});\n",
2311         "}\n",
2312         "\n",
2313         "mpl.figure.prototype.mouse_event = function(event, name) {\n",
2314         "    var canvas_pos = mpl.findpos(event)\n",
2315         "\n",
2316         "    if (name === 'button_press')\n",
2317         "    {\n",
2318         "        this.canvas.focus();\n",
2319         "        this.canvas_div.focus();\n",
2320         "    }\n",
2321         "\n",
2322         "    var x = canvas_pos.x * mpl.ratio;\n",
2323         "    var y = canvas_pos.y * mpl.ratio;\n",
2324         "\n",
2325         "    this.send_message(name, {x: x, y: y, button: event.button,\n",
2326         "                             step: event.step,\n",
2327         "                             guiEvent: simpleKeys(event)});\n",
2328         "\n",
2329         "    /* This prevents the web browser from automatically changing to\n",
2330         "     * the text insertion cursor when the button is pressed.  We want\n",
2331         "     * to control all of the cursor setting manually through the\n",
2332         "     * 'cursor' event from matplotlib */\n",
2333         "    event.preventDefault();\n",
2334         "    return false;\n",
2335         "}\n",
2336         "\n",
2337         "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
2338         "    // Handle any extra behaviour associated with a key event\n",
2339         "}\n",
2340         "\n",
2341         "mpl.figure.prototype.key_event = function(event, name) {\n",
2342         "\n",
2343         "    // Prevent repeat events\n",
2344         "    if (name == 'key_press')\n",
2345         "    {\n",
2346         "        if (event.which === this._key)\n",
2347         "            return;\n",
2348         "        else\n",
2349         "            this._key = event.which;\n",
2350         "    }\n",
2351         "    if (name == 'key_release')\n",
2352         "        this._key = null;\n",
2353         "\n",
2354         "    var value = '';\n",
2355         "    if (event.ctrlKey && event.which != 17)\n",
2356         "        value += \"ctrl+\";\n",
2357         "    if (event.altKey && event.which != 18)\n",
2358         "        value += \"alt+\";\n",
2359         "    if (event.shiftKey && event.which != 16)\n",
2360         "        value += \"shift+\";\n",
2361         "\n",
2362         "    value += 'k';\n",
2363         "    value += event.which.toString();\n",
2364         "\n",
2365         "    this._key_event_extra(event, name);\n",
2366         "\n",
2367         "    this.send_message(name, {key: value,\n",
2368         "                             guiEvent: simpleKeys(event)});\n",
2369         "    return false;\n",
2370         "}\n",
2371         "\n",
2372         "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
2373         "    if (name == 'download') {\n",
2374         "        this.handle_save(this, null);\n",
2375         "    } else {\n",
2376         "        this.send_message(\"toolbar_button\", {name: name});\n",
2377         "    }\n",
2378         "};\n",
2379         "\n",
2380         "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
2381         "    this.message.textContent = tooltip;\n",
2382         "};\n",
2383         "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",
2384         "\n",
2385         "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
2386         "\n",
2387         "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
2388         "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
2389         "    // object with the appropriate methods. Currently this is a non binary\n",
2390         "    // socket, so there is still some room for performance tuning.\n",
2391         "    var ws = {};\n",
2392         "\n",
2393         "    ws.close = function() {\n",
2394         "        comm.close()\n",
2395         "    };\n",
2396         "    ws.send = function(m) {\n",
2397         "        //console.log('sending', m);\n",
2398         "        comm.send(m);\n",
2399         "    };\n",
2400         "    // Register the callback with on_msg.\n",
2401         "    comm.on_msg(function(msg) {\n",
2402         "        //console.log('receiving', msg['content']['data'], msg);\n",
2403         "        // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
2404         "        ws.onmessage(msg['content']['data'])\n",
2405         "    });\n",
2406         "    return ws;\n",
2407         "}\n",
2408         "\n",
2409         "mpl.mpl_figure_comm = function(comm, msg) {\n",
2410         "    // This is the function which gets called when the mpl process\n",
2411         "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
2412         "\n",
2413         "    var id = msg.content.data.id;\n",
2414         "    // Get hold of the div created by the display call when the Comm\n",
2415         "    // socket was opened in Python.\n",
2416         "    var element = $(\"#\" + id);\n",
2417         "    var ws_proxy = comm_websocket_adapter(comm)\n",
2418         "\n",
2419         "    function ondownload(figure, format) {\n",
2420         "        window.open(figure.imageObj.src);\n",
2421         "    }\n",
2422         "\n",
2423         "    var fig = new mpl.figure(id, ws_proxy,\n",
2424         "                           ondownload,\n",
2425         "                           element.get(0));\n",
2426         "\n",
2427         "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
2428         "    // web socket which is closed, not our websocket->open comm proxy.\n",
2429         "    ws_proxy.onopen();\n",
2430         "\n",
2431         "    fig.parent_element = element.get(0);\n",
2432         "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
2433         "    if (!fig.cell_info) {\n",
2434         "        console.error(\"Failed to find cell for figure\", id, fig);\n",
2435         "        return;\n",
2436         "    }\n",
2437         "\n",
2438         "    var output_index = fig.cell_info[2]\n",
2439         "    var cell = fig.cell_info[0];\n",
2440         "\n",
2441         "};\n",
2442         "\n",
2443         "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
2444         "    var width = fig.canvas.width/mpl.ratio\n",
2445         "    fig.root.unbind('remove')\n",
2446         "\n",
2447         "    // Update the output cell to use the data from the current canvas.\n",
2448         "    fig.push_to_output();\n",
2449         "    var dataURL = fig.canvas.toDataURL();\n",
2450         "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
2451         "    // the notebook keyboard shortcuts fail.\n",
2452         "    IPython.keyboard_manager.enable()\n",
2453         "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
2454         "    fig.close_ws(fig, msg);\n",
2455         "}\n",
2456         "\n",
2457         "mpl.figure.prototype.close_ws = function(fig, msg){\n",
2458         "    fig.send_message('closing', msg);\n",
2459         "    // fig.ws.close()\n",
2460         "}\n",
2461         "\n",
2462         "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
2463         "    // Turn the data on the canvas into data in the output cell.\n",
2464         "    var width = this.canvas.width/mpl.ratio\n",
2465         "    var dataURL = this.canvas.toDataURL();\n",
2466         "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
2467         "}\n",
2468         "\n",
2469         "mpl.figure.prototype.updated_canvas_event = function() {\n",
2470         "    // Tell IPython that the notebook contents must change.\n",
2471         "    IPython.notebook.set_dirty(true);\n",
2472         "    this.send_message(\"ack\", {});\n",
2473         "    var fig = this;\n",
2474         "    // Wait a second, then push the new image to the DOM so\n",
2475         "    // that it is saved nicely (might be nice to debounce this).\n",
2476         "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
2477         "}\n",
2478         "\n",
2479         "mpl.figure.prototype._init_toolbar = function() {\n",
2480         "    var fig = this;\n",
2481         "\n",
2482         "    var nav_element = $('<div/>')\n",
2483         "    nav_element.attr('style', 'width: 100%');\n",
2484         "    this.root.append(nav_element);\n",
2485         "\n",
2486         "    // Define a callback function for later on.\n",
2487         "    function toolbar_event(event) {\n",
2488         "        return fig.toolbar_button_onclick(event['data']);\n",
2489         "    }\n",
2490         "    function toolbar_mouse_event(event) {\n",
2491         "        return fig.toolbar_button_onmouseover(event['data']);\n",
2492         "    }\n",
2493         "\n",
2494         "    for(var toolbar_ind in mpl.toolbar_items){\n",
2495         "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
2496         "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
2497         "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
2498         "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
2499         "\n",
2500         "        if (!name) { continue; };\n",
2501         "\n",
2502         "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
2503         "        button.click(method_name, toolbar_event);\n",
2504         "        button.mouseover(tooltip, toolbar_mouse_event);\n",
2505         "        nav_element.append(button);\n",
2506         "    }\n",
2507         "\n",
2508         "    // Add the status bar.\n",
2509         "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
2510         "    nav_element.append(status_bar);\n",
2511         "    this.message = status_bar[0];\n",
2512         "\n",
2513         "    // Add the close button to the window.\n",
2514         "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
2515         "    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",
2516         "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
2517         "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
2518         "    buttongrp.append(button);\n",
2519         "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
2520         "    titlebar.prepend(buttongrp);\n",
2521         "}\n",
2522         "\n",
2523         "mpl.figure.prototype._root_extra_style = function(el){\n",
2524         "    var fig = this\n",
2525         "    el.on(\"remove\", function(){\n",
2526         "\tfig.close_ws(fig, {});\n",
2527         "    });\n",
2528         "}\n",
2529         "\n",
2530         "mpl.figure.prototype._canvas_extra_style = function(el){\n",
2531         "    // this is important to make the div 'focusable\n",
2532         "    el.attr('tabindex', 0)\n",
2533         "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
2534         "    // off when our div gets focus\n",
2535         "\n",
2536         "    // location in version 3\n",
2537         "    if (IPython.notebook.keyboard_manager) {\n",
2538         "        IPython.notebook.keyboard_manager.register_events(el);\n",
2539         "    }\n",
2540         "    else {\n",
2541         "        // location in version 2\n",
2542         "        IPython.keyboard_manager.register_events(el);\n",
2543         "    }\n",
2544         "\n",
2545         "}\n",
2546         "\n",
2547         "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
2548         "    var manager = IPython.notebook.keyboard_manager;\n",
2549         "    if (!manager)\n",
2550         "        manager = IPython.keyboard_manager;\n",
2551         "\n",
2552         "    // Check for shift+enter\n",
2553         "    if (event.shiftKey && event.which == 13) {\n",
2554         "        this.canvas_div.blur();\n",
2555         "        // select the cell after this one\n",
2556         "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
2557         "        IPython.notebook.select(index + 1);\n",
2558         "    }\n",
2559         "}\n",
2560         "\n",
2561         "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
2562         "    fig.ondownload(fig, null);\n",
2563         "}\n",
2564         "\n",
2565         "\n",
2566         "mpl.find_output_cell = function(html_output) {\n",
2567         "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
2568         "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
2569         "    // IPython event is triggered only after the cells have been serialised, which for\n",
2570         "    // our purposes (turning an active figure into a static one), is too late.\n",
2571         "    var cells = IPython.notebook.get_cells();\n",
2572         "    var ncells = cells.length;\n",
2573         "    for (var i=0; i<ncells; i++) {\n",
2574         "        var cell = cells[i];\n",
2575         "        if (cell.cell_type === 'code'){\n",
2576         "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
2577         "                var data = cell.output_area.outputs[j];\n",
2578         "                if (data.data) {\n",
2579         "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
2580         "                    data = data.data;\n",
2581         "                }\n",
2582         "                if (data['text/html'] == html_output) {\n",
2583         "                    return [cell, data, j];\n",
2584         "                }\n",
2585         "            }\n",
2586         "        }\n",
2587         "    }\n",
2588         "}\n",
2589         "\n",
2590         "// Register the function which deals with the matplotlib target/channel.\n",
2591         "// The kernel may be null if the page has been refreshed.\n",
2592         "if (IPython.notebook.kernel != null) {\n",
2593         "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
2594         "}\n"
2595        ],
2596        "text/plain": [
2597         "<IPython.core.display.Javascript object>"
2598        ]
2599       },
2600       "metadata": {},
2601       "output_type": "display_data"
2602      },
2603      {
2604       "data": {
2605        "text/html": [
2606         "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAAAXNSR0IArs4c6QAAQABJREFUeAHs0IEAAAAAgKD9qRcphAoDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGA0ZW4AABPhSURBVGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYuB06kAEAAAAY5G99j68QMmDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMPAfCAglAAHVK9XiAAAAAElFTkSuQmCC\" width=\"640\">"
2607        ],
2608        "text/plain": [
2609         "<IPython.core.display.HTML object>"
2610        ]
2611       },
2612       "metadata": {},
2613       "output_type": "display_data"
2614      },
2615      {
2616       "data": {
2617        "text/plain": [
2618         "<matplotlib.axes._subplots.AxesSubplot at 0x7ffa4539a6d8>"
2619        ]
2620       },
2621       "execution_count": 7,
2622       "metadata": {},
2623       "output_type": "execute_result"
2624      }
2625     ],
2626     "source": [
2627      "# create a scatter plot of columns 'A' and 'C', with changing color (c) and size (s) based on column 'B'\n",
2628      "df.plot.scatter('A', 'C', c='B', s=df['B'], colormap='viridis')"
2629     ]
2630    },
2631    {
2632     "cell_type": "code",
2633     "execution_count": 8,
2634     "metadata": {
2635      "collapsed": false
2636     },
2637     "outputs": [
2638      {
2639       "data": {
2640        "application/javascript": [
2641         "/* Put everything inside the global mpl namespace */\n",
2642         "window.mpl = {};\n",
2643         "\n",
2644         "\n",
2645         "mpl.get_websocket_type = function() {\n",
2646         "    if (typeof(WebSocket) !== 'undefined') {\n",
2647         "        return WebSocket;\n",
2648         "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
2649         "        return MozWebSocket;\n",
2650         "    } else {\n",
2651         "        alert('Your browser does not have WebSocket support.' +\n",
2652         "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
2653         "              'Firefox 4 and 5 are also supported but you ' +\n",
2654         "              'have to enable WebSockets in about:config.');\n",
2655         "    };\n",
2656         "}\n",
2657         "\n",
2658         "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
2659         "    this.id = figure_id;\n",
2660         "\n",
2661         "    this.ws = websocket;\n",
2662         "\n",
2663         "    this.supports_binary = (this.ws.binaryType != undefined);\n",
2664         "\n",
2665         "    if (!this.supports_binary) {\n",
2666         "        var warnings = document.getElementById(\"mpl-warnings\");\n",
2667         "        if (warnings) {\n",
2668         "            warnings.style.display = 'block';\n",
2669         "            warnings.textContent = (\n",
2670         "                \"This browser does not support binary websocket messages. \" +\n",
2671         "                    \"Performance may be slow.\");\n",
2672         "        }\n",
2673         "    }\n",
2674         "\n",
2675         "    this.imageObj = new Image();\n",
2676         "\n",
2677         "    this.context = undefined;\n",
2678         "    this.message = undefined;\n",
2679         "    this.canvas = undefined;\n",
2680         "    this.rubberband_canvas = undefined;\n",
2681         "    this.rubberband_context = undefined;\n",
2682         "    this.format_dropdown = undefined;\n",
2683         "\n",
2684         "    this.image_mode = 'full';\n",
2685         "\n",
2686         "    this.root = $('<div/>');\n",
2687         "    this._root_extra_style(this.root)\n",
2688         "    this.root.attr('style', 'display: inline-block');\n",
2689         "\n",
2690         "    $(parent_element).append(this.root);\n",
2691         "\n",
2692         "    this._init_header(this);\n",
2693         "    this._init_canvas(this);\n",
2694         "    this._init_toolbar(this);\n",
2695         "\n",
2696         "    var fig = this;\n",
2697         "\n",
2698         "    this.waiting = false;\n",
2699         "\n",
2700         "    this.ws.onopen =  function () {\n",
2701         "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
2702         "            fig.send_message(\"send_image_mode\", {});\n",
2703         "            if (mpl.ratio != 1) {\n",
2704         "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
2705         "            }\n",
2706         "            fig.send_message(\"refresh\", {});\n",
2707         "        }\n",
2708         "\n",
2709         "    this.imageObj.onload = function() {\n",
2710         "            if (fig.image_mode == 'full') {\n",
2711         "                // Full images could contain transparency (where diff images\n",
2712         "                // almost always do), so we need to clear the canvas so that\n",
2713         "                // there is no ghosting.\n",
2714         "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
2715         "            }\n",
2716         "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
2717         "        };\n",
2718         "\n",
2719         "    this.imageObj.onunload = function() {\n",
2720         "        this.ws.close();\n",
2721         "    }\n",
2722         "\n",
2723         "    this.ws.onmessage = this._make_on_message_function(this);\n",
2724         "\n",
2725         "    this.ondownload = ondownload;\n",
2726         "}\n",
2727         "\n",
2728         "mpl.figure.prototype._init_header = function() {\n",
2729         "    var titlebar = $(\n",
2730         "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
2731         "        'ui-helper-clearfix\"/>');\n",
2732         "    var titletext = $(\n",
2733         "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
2734         "        'text-align: center; padding: 3px;\"/>');\n",
2735         "    titlebar.append(titletext)\n",
2736         "    this.root.append(titlebar);\n",
2737         "    this.header = titletext[0];\n",
2738         "}\n",
2739         "\n",
2740         "\n",
2741         "\n",
2742         "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
2743         "\n",
2744         "}\n",
2745         "\n",
2746         "\n",
2747         "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
2748         "\n",
2749         "}\n",
2750         "\n",
2751         "mpl.figure.prototype._init_canvas = function() {\n",
2752         "    var fig = this;\n",
2753         "\n",
2754         "    var canvas_div = $('<div/>');\n",
2755         "\n",
2756         "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
2757         "\n",
2758         "    function canvas_keyboard_event(event) {\n",
2759         "        return fig.key_event(event, event['data']);\n",
2760         "    }\n",
2761         "\n",
2762         "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
2763         "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
2764         "    this.canvas_div = canvas_div\n",
2765         "    this._canvas_extra_style(canvas_div)\n",
2766         "    this.root.append(canvas_div);\n",
2767         "\n",
2768         "    var canvas = $('<canvas/>');\n",
2769         "    canvas.addClass('mpl-canvas');\n",
2770         "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
2771         "\n",
2772         "    this.canvas = canvas[0];\n",
2773         "    this.context = canvas[0].getContext(\"2d\");\n",
2774         "\n",
2775         "    var backingStore = this.context.backingStorePixelRatio ||\n",
2776         "\tthis.context.webkitBackingStorePixelRatio ||\n",
2777         "\tthis.context.mozBackingStorePixelRatio ||\n",
2778         "\tthis.context.msBackingStorePixelRatio ||\n",
2779         "\tthis.context.oBackingStorePixelRatio ||\n",
2780         "\tthis.context.backingStorePixelRatio || 1;\n",
2781         "\n",
2782         "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
2783         "\n",
2784         "    var rubberband = $('<canvas/>');\n",
2785         "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
2786         "\n",
2787         "    var pass_mouse_events = true;\n",
2788         "\n",
2789         "    canvas_div.resizable({\n",
2790         "        start: function(event, ui) {\n",
2791         "            pass_mouse_events = false;\n",
2792         "        },\n",
2793         "        resize: function(event, ui) {\n",
2794         "            fig.request_resize(ui.size.width, ui.size.height);\n",
2795         "        },\n",
2796         "        stop: function(event, ui) {\n",
2797         "            pass_mouse_events = true;\n",
2798         "            fig.request_resize(ui.size.width, ui.size.height);\n",
2799         "        },\n",
2800         "    });\n",
2801         "\n",
2802         "    function mouse_event_fn(event) {\n",
2803         "        if (pass_mouse_events)\n",
2804         "            return fig.mouse_event(event, event['data']);\n",
2805         "    }\n",
2806         "\n",
2807         "    rubberband.mousedown('button_press', mouse_event_fn);\n",
2808         "    rubberband.mouseup('button_release', mouse_event_fn);\n",
2809         "    // Throttle sequential mouse events to 1 every 20ms.\n",
2810         "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
2811         "\n",
2812         "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
2813         "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
2814         "\n",
2815         "    canvas_div.on(\"wheel\", function (event) {\n",
2816         "        event = event.originalEvent;\n",
2817         "        event['data'] = 'scroll'\n",
2818         "        if (event.deltaY < 0) {\n",
2819         "            event.step = 1;\n",
2820         "        } else {\n",
2821         "            event.step = -1;\n",
2822         "        }\n",
2823         "        mouse_event_fn(event);\n",
2824         "    });\n",
2825         "\n",
2826         "    canvas_div.append(canvas);\n",
2827         "    canvas_div.append(rubberband);\n",
2828         "\n",
2829         "    this.rubberband = rubberband;\n",
2830         "    this.rubberband_canvas = rubberband[0];\n",
2831         "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
2832         "    this.rubberband_context.strokeStyle = \"#000000\";\n",
2833         "\n",
2834         "    this._resize_canvas = function(width, height) {\n",
2835         "        // Keep the size of the canvas, canvas container, and rubber band\n",
2836         "        // canvas in synch.\n",
2837         "        canvas_div.css('width', width)\n",
2838         "        canvas_div.css('height', height)\n",
2839         "\n",
2840         "        canvas.attr('width', width * mpl.ratio);\n",
2841         "        canvas.attr('height', height * mpl.ratio);\n",
2842         "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
2843         "\n",
2844         "        rubberband.attr('width', width);\n",
2845         "        rubberband.attr('height', height);\n",
2846         "    }\n",
2847         "\n",
2848         "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
2849         "    // upon first draw.\n",
2850         "    this._resize_canvas(600, 600);\n",
2851         "\n",
2852         "    // Disable right mouse context menu.\n",
2853         "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
2854         "        return false;\n",
2855         "    });\n",
2856         "\n",
2857         "    function set_focus () {\n",
2858         "        canvas.focus();\n",
2859         "        canvas_div.focus();\n",
2860         "    }\n",
2861         "\n",
2862         "    window.setTimeout(set_focus, 100);\n",
2863         "}\n",
2864         "\n",
2865         "mpl.figure.prototype._init_toolbar = function() {\n",
2866         "    var fig = this;\n",
2867         "\n",
2868         "    var nav_element = $('<div/>')\n",
2869         "    nav_element.attr('style', 'width: 100%');\n",
2870         "    this.root.append(nav_element);\n",
2871         "\n",
2872         "    // Define a callback function for later on.\n",
2873         "    function toolbar_event(event) {\n",
2874         "        return fig.toolbar_button_onclick(event['data']);\n",
2875         "    }\n",
2876         "    function toolbar_mouse_event(event) {\n",
2877         "        return fig.toolbar_button_onmouseover(event['data']);\n",
2878         "    }\n",
2879         "\n",
2880         "    for(var toolbar_ind in mpl.toolbar_items) {\n",
2881         "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
2882         "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
2883         "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
2884         "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
2885         "\n",
2886         "        if (!name) {\n",
2887         "            // put a spacer in here.\n",
2888         "            continue;\n",
2889         "        }\n",
2890         "        var button = $('<button/>');\n",
2891         "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
2892         "                        'ui-button-icon-only');\n",
2893         "        button.attr('role', 'button');\n",
2894         "        button.attr('aria-disabled', 'false');\n",
2895         "        button.click(method_name, toolbar_event);\n",
2896         "        button.mouseover(tooltip, toolbar_mouse_event);\n",
2897         "\n",
2898         "        var icon_img = $('<span/>');\n",
2899         "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
2900         "        icon_img.addClass(image);\n",
2901         "        icon_img.addClass('ui-corner-all');\n",
2902         "\n",
2903         "        var tooltip_span = $('<span/>');\n",
2904         "        tooltip_span.addClass('ui-button-text');\n",
2905         "        tooltip_span.html(tooltip);\n",
2906         "\n",
2907         "        button.append(icon_img);\n",
2908         "        button.append(tooltip_span);\n",
2909         "\n",
2910         "        nav_element.append(button);\n",
2911         "    }\n",
2912         "\n",
2913         "    var fmt_picker_span = $('<span/>');\n",
2914         "\n",
2915         "    var fmt_picker = $('<select/>');\n",
2916         "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
2917         "    fmt_picker_span.append(fmt_picker);\n",
2918         "    nav_element.append(fmt_picker_span);\n",
2919         "    this.format_dropdown = fmt_picker[0];\n",
2920         "\n",
2921         "    for (var ind in mpl.extensions) {\n",
2922         "        var fmt = mpl.extensions[ind];\n",
2923         "        var option = $(\n",
2924         "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
2925         "        fmt_picker.append(option)\n",
2926         "    }\n",
2927         "\n",
2928         "    // Add hover states to the ui-buttons\n",
2929         "    $( \".ui-button\" ).hover(\n",
2930         "        function() { $(this).addClass(\"ui-state-hover\");},\n",
2931         "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
2932         "    );\n",
2933         "\n",
2934         "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
2935         "    nav_element.append(status_bar);\n",
2936         "    this.message = status_bar[0];\n",
2937         "}\n",
2938         "\n",
2939         "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
2940         "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
2941         "    // which will in turn request a refresh of the image.\n",
2942         "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
2943         "}\n",
2944         "\n",
2945         "mpl.figure.prototype.send_message = function(type, properties) {\n",
2946         "    properties['type'] = type;\n",
2947         "    properties['figure_id'] = this.id;\n",
2948         "    this.ws.send(JSON.stringify(properties));\n",
2949         "}\n",
2950         "\n",
2951         "mpl.figure.prototype.send_draw_message = function() {\n",
2952         "    if (!this.waiting) {\n",
2953         "        this.waiting = true;\n",
2954         "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
2955         "    }\n",
2956         "}\n",
2957         "\n",
2958         "\n",
2959         "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
2960         "    var format_dropdown = fig.format_dropdown;\n",
2961         "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
2962         "    fig.ondownload(fig, format);\n",
2963         "}\n",
2964         "\n",
2965         "\n",
2966         "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
2967         "    var size = msg['size'];\n",
2968         "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
2969         "        fig._resize_canvas(size[0], size[1]);\n",
2970         "        fig.send_message(\"refresh\", {});\n",
2971         "    };\n",
2972         "}\n",
2973         "\n",
2974         "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
2975         "    var x0 = msg['x0'] / mpl.ratio;\n",
2976         "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
2977         "    var x1 = msg['x1'] / mpl.ratio;\n",
2978         "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
2979         "    x0 = Math.floor(x0) + 0.5;\n",
2980         "    y0 = Math.floor(y0) + 0.5;\n",
2981         "    x1 = Math.floor(x1) + 0.5;\n",
2982         "    y1 = Math.floor(y1) + 0.5;\n",
2983         "    var min_x = Math.min(x0, x1);\n",
2984         "    var min_y = Math.min(y0, y1);\n",
2985         "    var width = Math.abs(x1 - x0);\n",
2986         "    var height = Math.abs(y1 - y0);\n",
2987         "\n",
2988         "    fig.rubberband_context.clearRect(\n",
2989         "        0, 0, fig.canvas.width, fig.canvas.height);\n",
2990         "\n",
2991         "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
2992         "}\n",
2993         "\n",
2994         "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
2995         "    // Updates the figure title.\n",
2996         "    fig.header.textContent = msg['label'];\n",
2997         "}\n",
2998         "\n",
2999         "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
3000         "    var cursor = msg['cursor'];\n",
3001         "    switch(cursor)\n",
3002         "    {\n",
3003         "    case 0:\n",
3004         "        cursor = 'pointer';\n",
3005         "        break;\n",
3006         "    case 1:\n",
3007         "        cursor = 'default';\n",
3008         "        break;\n",
3009         "    case 2:\n",
3010         "        cursor = 'crosshair';\n",
3011         "        break;\n",
3012         "    case 3:\n",
3013         "        cursor = 'move';\n",
3014         "        break;\n",
3015         "    }\n",
3016         "    fig.rubberband_canvas.style.cursor = cursor;\n",
3017         "}\n",
3018         "\n",
3019         "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
3020         "    fig.message.textContent = msg['message'];\n",
3021         "}\n",
3022         "\n",
3023         "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
3024         "    // Request the server to send over a new figure.\n",
3025         "    fig.send_draw_message();\n",
3026         "}\n",
3027         "\n",
3028         "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
3029         "    fig.image_mode = msg['mode'];\n",
3030         "}\n",
3031         "\n",
3032         "mpl.figure.prototype.updated_canvas_event = function() {\n",
3033         "    // Called whenever the canvas gets updated.\n",
3034         "    this.send_message(\"ack\", {});\n",
3035         "}\n",
3036         "\n",
3037         "// A function to construct a web socket function for onmessage handling.\n",
3038         "// Called in the figure constructor.\n",
3039         "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
3040         "    return function socket_on_message(evt) {\n",
3041         "        if (evt.data instanceof Blob) {\n",
3042         "            /* FIXME: We get \"Resource interpreted as Image but\n",
3043         "             * transferred with MIME type text/plain:\" errors on\n",
3044         "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
3045         "             * to be part of the websocket stream */\n",
3046         "            evt.data.type = \"image/png\";\n",
3047         "\n",
3048         "            /* Free the memory for the previous frames */\n",
3049         "            if (fig.imageObj.src) {\n",
3050         "                (window.URL || window.webkitURL).revokeObjectURL(\n",
3051         "                    fig.imageObj.src);\n",
3052         "            }\n",
3053         "\n",
3054         "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
3055         "                evt.data);\n",
3056         "            fig.updated_canvas_event();\n",
3057         "            fig.waiting = false;\n",
3058         "            return;\n",
3059         "        }\n",
3060         "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
3061         "            fig.imageObj.src = evt.data;\n",
3062         "            fig.updated_canvas_event();\n",
3063         "            fig.waiting = false;\n",
3064         "            return;\n",
3065         "        }\n",
3066         "\n",
3067         "        var msg = JSON.parse(evt.data);\n",
3068         "        var msg_type = msg['type'];\n",
3069         "\n",
3070         "        // Call the  \"handle_{type}\" callback, which takes\n",
3071         "        // the figure and JSON message as its only arguments.\n",
3072         "        try {\n",
3073         "            var callback = fig[\"handle_\" + msg_type];\n",
3074         "        } catch (e) {\n",
3075         "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
3076         "            return;\n",
3077         "        }\n",
3078         "\n",
3079         "        if (callback) {\n",
3080         "            try {\n",
3081         "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
3082         "                callback(fig, msg);\n",
3083         "            } catch (e) {\n",
3084         "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
3085         "            }\n",
3086         "        }\n",
3087         "    };\n",
3088         "}\n",
3089         "\n",
3090         "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
3091         "mpl.findpos = function(e) {\n",
3092         "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
3093         "    var targ;\n",
3094         "    if (!e)\n",
3095         "        e = window.event;\n",
3096         "    if (e.target)\n",
3097         "        targ = e.target;\n",
3098         "    else if (e.srcElement)\n",
3099         "        targ = e.srcElement;\n",
3100         "    if (targ.nodeType == 3) // defeat Safari bug\n",
3101         "        targ = targ.parentNode;\n",
3102         "\n",
3103         "    // jQuery normalizes the pageX and pageY\n",
3104         "    // pageX,Y are the mouse positions relative to the document\n",
3105         "    // offset() returns the position of the element relative to the document\n",
3106         "    var x = e.pageX - $(targ).offset().left;\n",
3107         "    var y = e.pageY - $(targ).offset().top;\n",
3108         "\n",
3109         "    return {\"x\": x, \"y\": y};\n",
3110         "};\n",
3111         "\n",
3112         "/*\n",
3113         " * return a copy of an object with only non-object keys\n",
3114         " * we need this to avoid circular references\n",
3115         " * http://stackoverflow.com/a/24161582/3208463\n",
3116         " */\n",
3117         "function simpleKeys (original) {\n",
3118         "  return Object.keys(original).reduce(function (obj, key) {\n",
3119         "    if (typeof original[key] !== 'object')\n",
3120         "        obj[key] = original[key]\n",
3121         "    return obj;\n",
3122         "  }, {});\n",
3123         "}\n",
3124         "\n",
3125         "mpl.figure.prototype.mouse_event = function(event, name) {\n",
3126         "    var canvas_pos = mpl.findpos(event)\n",
3127         "\n",
3128         "    if (name === 'button_press')\n",
3129         "    {\n",
3130         "        this.canvas.focus();\n",
3131         "        this.canvas_div.focus();\n",
3132         "    }\n",
3133         "\n",
3134         "    var x = canvas_pos.x * mpl.ratio;\n",
3135         "    var y = canvas_pos.y * mpl.ratio;\n",
3136         "\n",
3137         "    this.send_message(name, {x: x, y: y, button: event.button,\n",
3138         "                             step: event.step,\n",
3139         "                             guiEvent: simpleKeys(event)});\n",
3140         "\n",
3141         "    /* This prevents the web browser from automatically changing to\n",
3142         "     * the text insertion cursor when the button is pressed.  We want\n",
3143         "     * to control all of the cursor setting manually through the\n",
3144         "     * 'cursor' event from matplotlib */\n",
3145         "    event.preventDefault();\n",
3146         "    return false;\n",
3147         "}\n",
3148         "\n",
3149         "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
3150         "    // Handle any extra behaviour associated with a key event\n",
3151         "}\n",
3152         "\n",
3153         "mpl.figure.prototype.key_event = function(event, name) {\n",
3154         "\n",
3155         "    // Prevent repeat events\n",
3156         "    if (name == 'key_press')\n",
3157         "    {\n",
3158         "        if (event.which === this._key)\n",
3159         "            return;\n",
3160         "        else\n",
3161         "            this._key = event.which;\n",
3162         "    }\n",
3163         "    if (name == 'key_release')\n",
3164         "        this._key = null;\n",
3165         "\n",
3166         "    var value = '';\n",
3167         "    if (event.ctrlKey && event.which != 17)\n",
3168         "        value += \"ctrl+\";\n",
3169         "    if (event.altKey && event.which != 18)\n",
3170         "        value += \"alt+\";\n",
3171         "    if (event.shiftKey && event.which != 16)\n",
3172         "        value += \"shift+\";\n",
3173         "\n",
3174         "    value += 'k';\n",
3175         "    value += event.which.toString();\n",
3176         "\n",
3177         "    this._key_event_extra(event, name);\n",
3178         "\n",
3179         "    this.send_message(name, {key: value,\n",
3180         "                             guiEvent: simpleKeys(event)});\n",
3181         "    return false;\n",
3182         "}\n",
3183         "\n",
3184         "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
3185         "    if (name == 'download') {\n",
3186         "        this.handle_save(this, null);\n",
3187         "    } else {\n",
3188         "        this.send_message(\"toolbar_button\", {name: name});\n",
3189         "    }\n",
3190         "};\n",
3191         "\n",
3192         "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
3193         "    this.message.textContent = tooltip;\n",
3194         "};\n",
3195         "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",
3196         "\n",
3197         "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
3198         "\n",
3199         "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
3200         "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
3201         "    // object with the appropriate methods. Currently this is a non binary\n",
3202         "    // socket, so there is still some room for performance tuning.\n",
3203         "    var ws = {};\n",
3204         "\n",
3205         "    ws.close = function() {\n",
3206         "        comm.close()\n",
3207         "    };\n",
3208         "    ws.send = function(m) {\n",
3209         "        //console.log('sending', m);\n",
3210         "        comm.send(m);\n",
3211         "    };\n",
3212         "    // Register the callback with on_msg.\n",
3213         "    comm.on_msg(function(msg) {\n",
3214         "        //console.log('receiving', msg['content']['data'], msg);\n",
3215         "        // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
3216         "        ws.onmessage(msg['content']['data'])\n",
3217         "    });\n",
3218         "    return ws;\n",
3219         "}\n",
3220         "\n",
3221         "mpl.mpl_figure_comm = function(comm, msg) {\n",
3222         "    // This is the function which gets called when the mpl process\n",
3223         "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
3224         "\n",
3225         "    var id = msg.content.data.id;\n",
3226         "    // Get hold of the div created by the display call when the Comm\n",
3227         "    // socket was opened in Python.\n",
3228         "    var element = $(\"#\" + id);\n",
3229         "    var ws_proxy = comm_websocket_adapter(comm)\n",
3230         "\n",
3231         "    function ondownload(figure, format) {\n",
3232         "        window.open(figure.imageObj.src);\n",
3233         "    }\n",
3234         "\n",
3235         "    var fig = new mpl.figure(id, ws_proxy,\n",
3236         "                           ondownload,\n",
3237         "                           element.get(0));\n",
3238         "\n",
3239         "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
3240         "    // web socket which is closed, not our websocket->open comm proxy.\n",
3241         "    ws_proxy.onopen();\n",
3242         "\n",
3243         "    fig.parent_element = element.get(0);\n",
3244         "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
3245         "    if (!fig.cell_info) {\n",
3246         "        console.error(\"Failed to find cell for figure\", id, fig);\n",
3247         "        return;\n",
3248         "    }\n",
3249         "\n",
3250         "    var output_index = fig.cell_info[2]\n",
3251         "    var cell = fig.cell_info[0];\n",
3252         "\n",
3253         "};\n",
3254         "\n",
3255         "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
3256         "    var width = fig.canvas.width/mpl.ratio\n",
3257         "    fig.root.unbind('remove')\n",
3258         "\n",
3259         "    // Update the output cell to use the data from the current canvas.\n",
3260         "    fig.push_to_output();\n",
3261         "    var dataURL = fig.canvas.toDataURL();\n",
3262         "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
3263         "    // the notebook keyboard shortcuts fail.\n",
3264         "    IPython.keyboard_manager.enable()\n",
3265         "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
3266         "    fig.close_ws(fig, msg);\n",
3267         "}\n",
3268         "\n",
3269         "mpl.figure.prototype.close_ws = function(fig, msg){\n",
3270         "    fig.send_message('closing', msg);\n",
3271         "    // fig.ws.close()\n",
3272         "}\n",
3273         "\n",
3274         "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
3275         "    // Turn the data on the canvas into data in the output cell.\n",
3276         "    var width = this.canvas.width/mpl.ratio\n",
3277         "    var dataURL = this.canvas.toDataURL();\n",
3278         "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
3279         "}\n",
3280         "\n",
3281         "mpl.figure.prototype.updated_canvas_event = function() {\n",
3282         "    // Tell IPython that the notebook contents must change.\n",
3283         "    IPython.notebook.set_dirty(true);\n",
3284         "    this.send_message(\"ack\", {});\n",
3285         "    var fig = this;\n",
3286         "    // Wait a second, then push the new image to the DOM so\n",
3287         "    // that it is saved nicely (might be nice to debounce this).\n",
3288         "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
3289         "}\n",
3290         "\n",
3291         "mpl.figure.prototype._init_toolbar = function() {\n",
3292         "    var fig = this;\n",
3293         "\n",
3294         "    var nav_element = $('<div/>')\n",
3295         "    nav_element.attr('style', 'width: 100%');\n",
3296         "    this.root.append(nav_element);\n",
3297         "\n",
3298         "    // Define a callback function for later on.\n",
3299         "    function toolbar_event(event) {\n",
3300         "        return fig.toolbar_button_onclick(event['data']);\n",
3301         "    }\n",
3302         "    function toolbar_mouse_event(event) {\n",
3303         "        return fig.toolbar_button_onmouseover(event['data']);\n",
3304         "    }\n",
3305         "\n",
3306         "    for(var toolbar_ind in mpl.toolbar_items){\n",
3307         "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
3308         "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
3309         "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
3310         "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
3311         "\n",
3312         "        if (!name) { continue; };\n",
3313         "\n",
3314         "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
3315         "        button.click(method_name, toolbar_event);\n",
3316         "        button.mouseover(tooltip, toolbar_mouse_event);\n",
3317         "        nav_element.append(button);\n",
3318         "    }\n",
3319         "\n",
3320         "    // Add the status bar.\n",
3321         "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
3322         "    nav_element.append(status_bar);\n",
3323         "    this.message = status_bar[0];\n",
3324         "\n",
3325         "    // Add the close button to the window.\n",
3326         "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
3327         "    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",
3328         "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
3329         "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
3330         "    buttongrp.append(button);\n",
3331         "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
3332         "    titlebar.prepend(buttongrp);\n",
3333         "}\n",
3334         "\n",
3335         "mpl.figure.prototype._root_extra_style = function(el){\n",
3336         "    var fig = this\n",
3337         "    el.on(\"remove\", function(){\n",
3338         "\tfig.close_ws(fig, {});\n",
3339         "    });\n",
3340         "}\n",
3341         "\n",
3342         "mpl.figure.prototype._canvas_extra_style = function(el){\n",
3343         "    // this is important to make the div 'focusable\n",
3344         "    el.attr('tabindex', 0)\n",
3345         "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
3346         "    // off when our div gets focus\n",
3347         "\n",
3348         "    // location in version 3\n",
3349         "    if (IPython.notebook.keyboard_manager) {\n",
3350         "        IPython.notebook.keyboard_manager.register_events(el);\n",
3351         "    }\n",
3352         "    else {\n",
3353         "        // location in version 2\n",
3354         "        IPython.keyboard_manager.register_events(el);\n",
3355         "    }\n",
3356         "\n",
3357         "}\n",
3358         "\n",
3359         "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
3360         "    var manager = IPython.notebook.keyboard_manager;\n",
3361         "    if (!manager)\n",
3362         "        manager = IPython.keyboard_manager;\n",
3363         "\n",
3364         "    // Check for shift+enter\n",
3365         "    if (event.shiftKey && event.which == 13) {\n",
3366         "        this.canvas_div.blur();\n",
3367         "        // select the cell after this one\n",
3368         "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
3369         "        IPython.notebook.select(index + 1);\n",
3370         "    }\n",
3371         "}\n",
3372         "\n",
3373         "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
3374         "    fig.ondownload(fig, null);\n",
3375         "}\n",
3376         "\n",
3377         "\n",
3378         "mpl.find_output_cell = function(html_output) {\n",
3379         "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
3380         "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
3381         "    // IPython event is triggered only after the cells have been serialised, which for\n",
3382         "    // our purposes (turning an active figure into a static one), is too late.\n",
3383         "    var cells = IPython.notebook.get_cells();\n",
3384         "    var ncells = cells.length;\n",
3385         "    for (var i=0; i<ncells; i++) {\n",
3386         "        var cell = cells[i];\n",
3387         "        if (cell.cell_type === 'code'){\n",
3388         "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
3389         "                var data = cell.output_area.outputs[j];\n",
3390         "                if (data.data) {\n",
3391         "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
3392         "                    data = data.data;\n",
3393         "                }\n",
3394         "                if (data['text/html'] == html_output) {\n",
3395         "                    return [cell, data, j];\n",
3396         "                }\n",
3397         "            }\n",
3398         "        }\n",
3399         "    }\n",
3400         "}\n",
3401         "\n",
3402         "// Register the function which deals with the matplotlib target/channel.\n",
3403         "// The kernel may be null if the page has been refreshed.\n",
3404         "if (IPython.notebook.kernel != null) {\n",
3405         "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
3406         "}\n"
3407        ],
3408        "text/plain": [
3409         "<IPython.core.display.Javascript object>"
3410        ]
3411       },
3412       "metadata": {},
3413       "output_type": "display_data"
3414      },
3415      {
3416       "data": {
3417        "text/html": [
3418         "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAAAXNSR0IArs4c6QAAQABJREFUeAHs0IEAAAAAgKD9qRcphAoDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGA0ZW4AABPhSURBVGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYuB06kAEAAAAY5G99j68QMmDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMPAfCAglAAHVK9XiAAAAAElFTkSuQmCC\" width=\"640\">"
3419        ],
3420        "text/plain": [
3421         "<IPython.core.display.HTML object>"
3422        ]
3423       },
3424       "metadata": {},
3425       "output_type": "display_data"
3426      }
3427     ],
3428     "source": [
3429      "ax = df.plot.scatter('A', 'C', c='B', s=df['B'], colormap='viridis')\n",
3430      "ax.set_aspect('equal') # Set equal scaling for X and Y axis, i.e, distance between ticks should cover the same number of data points."
3431     ]
3432    },
3433    {
3434     "cell_type": "code",
3435     "execution_count": 9,
3436     "metadata": {
3437      "collapsed": false,
3438      "scrolled": false
3439     },
3440     "outputs": [
3441      {
3442       "data": {
3443        "application/javascript": [
3444         "/* Put everything inside the global mpl namespace */\n",
3445         "window.mpl = {};\n",
3446         "\n",
3447         "\n",
3448         "mpl.get_websocket_type = function() {\n",
3449         "    if (typeof(WebSocket) !== 'undefined') {\n",
3450         "        return WebSocket;\n",
3451         "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
3452         "        return MozWebSocket;\n",
3453         "    } else {\n",
3454         "        alert('Your browser does not have WebSocket support.' +\n",
3455         "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
3456         "              'Firefox 4 and 5 are also supported but you ' +\n",
3457         "              'have to enable WebSockets in about:config.');\n",
3458         "    };\n",
3459         "}\n",
3460         "\n",
3461         "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
3462         "    this.id = figure_id;\n",
3463         "\n",
3464         "    this.ws = websocket;\n",
3465         "\n",
3466         "    this.supports_binary = (this.ws.binaryType != undefined);\n",
3467         "\n",
3468         "    if (!this.supports_binary) {\n",
3469         "        var warnings = document.getElementById(\"mpl-warnings\");\n",
3470         "        if (warnings) {\n",
3471         "            warnings.style.display = 'block';\n",
3472         "            warnings.textContent = (\n",
3473         "                \"This browser does not support binary websocket messages. \" +\n",
3474         "                    \"Performance may be slow.\");\n",
3475         "        }\n",
3476         "    }\n",
3477         "\n",
3478         "    this.imageObj = new Image();\n",
3479         "\n",
3480         "    this.context = undefined;\n",
3481         "    this.message = undefined;\n",
3482         "    this.canvas = undefined;\n",
3483         "    this.rubberband_canvas = undefined;\n",
3484         "    this.rubberband_context = undefined;\n",
3485         "    this.format_dropdown = undefined;\n",
3486         "\n",
3487         "    this.image_mode = 'full';\n",
3488         "\n",
3489         "    this.root = $('<div/>');\n",
3490         "    this._root_extra_style(this.root)\n",
3491         "    this.root.attr('style', 'display: inline-block');\n",
3492         "\n",
3493         "    $(parent_element).append(this.root);\n",
3494         "\n",
3495         "    this._init_header(this);\n",
3496         "    this._init_canvas(this);\n",
3497         "    this._init_toolbar(this);\n",
3498         "\n",
3499         "    var fig = this;\n",
3500         "\n",
3501         "    this.waiting = false;\n",
3502         "\n",
3503         "    this.ws.onopen =  function () {\n",
3504         "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
3505         "            fig.send_message(\"send_image_mode\", {});\n",
3506         "            if (mpl.ratio != 1) {\n",
3507         "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
3508         "            }\n",
3509         "            fig.send_message(\"refresh\", {});\n",
3510         "        }\n",
3511         "\n",
3512         "    this.imageObj.onload = function() {\n",
3513         "            if (fig.image_mode == 'full') {\n",
3514         "                // Full images could contain transparency (where diff images\n",
3515         "                // almost always do), so we need to clear the canvas so that\n",
3516         "                // there is no ghosting.\n",
3517         "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
3518         "            }\n",
3519         "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
3520         "        };\n",
3521         "\n",
3522         "    this.imageObj.onunload = function() {\n",
3523         "        this.ws.close();\n",
3524         "    }\n",
3525         "\n",
3526         "    this.ws.onmessage = this._make_on_message_function(this);\n",
3527         "\n",
3528         "    this.ondownload = ondownload;\n",
3529         "}\n",
3530         "\n",
3531         "mpl.figure.prototype._init_header = function() {\n",
3532         "    var titlebar = $(\n",
3533         "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
3534         "        'ui-helper-clearfix\"/>');\n",
3535         "    var titletext = $(\n",
3536         "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
3537         "        'text-align: center; padding: 3px;\"/>');\n",
3538         "    titlebar.append(titletext)\n",
3539         "    this.root.append(titlebar);\n",
3540         "    this.header = titletext[0];\n",
3541         "}\n",
3542         "\n",
3543         "\n",
3544         "\n",
3545         "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
3546         "\n",
3547         "}\n",
3548         "\n",
3549         "\n",
3550         "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
3551         "\n",
3552         "}\n",
3553         "\n",
3554         "mpl.figure.prototype._init_canvas = function() {\n",
3555         "    var fig = this;\n",
3556         "\n",
3557         "    var canvas_div = $('<div/>');\n",
3558         "\n",
3559         "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
3560         "\n",
3561         "    function canvas_keyboard_event(event) {\n",
3562         "        return fig.key_event(event, event['data']);\n",
3563         "    }\n",
3564         "\n",
3565         "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
3566         "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
3567         "    this.canvas_div = canvas_div\n",
3568         "    this._canvas_extra_style(canvas_div)\n",
3569         "    this.root.append(canvas_div);\n",
3570         "\n",
3571         "    var canvas = $('<canvas/>');\n",
3572         "    canvas.addClass('mpl-canvas');\n",
3573         "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
3574         "\n",
3575         "    this.canvas = canvas[0];\n",
3576         "    this.context = canvas[0].getContext(\"2d\");\n",
3577         "\n",
3578         "    var backingStore = this.context.backingStorePixelRatio ||\n",
3579         "\tthis.context.webkitBackingStorePixelRatio ||\n",
3580         "\tthis.context.mozBackingStorePixelRatio ||\n",
3581         "\tthis.context.msBackingStorePixelRatio ||\n",
3582         "\tthis.context.oBackingStorePixelRatio ||\n",
3583         "\tthis.context.backingStorePixelRatio || 1;\n",
3584         "\n",
3585         "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
3586         "\n",
3587         "    var rubberband = $('<canvas/>');\n",
3588         "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
3589         "\n",
3590         "    var pass_mouse_events = true;\n",
3591         "\n",
3592         "    canvas_div.resizable({\n",
3593         "        start: function(event, ui) {\n",
3594         "            pass_mouse_events = false;\n",
3595         "        },\n",
3596         "        resize: function(event, ui) {\n",
3597         "            fig.request_resize(ui.size.width, ui.size.height);\n",
3598         "        },\n",
3599         "        stop: function(event, ui) {\n",
3600         "            pass_mouse_events = true;\n",
3601         "            fig.request_resize(ui.size.width, ui.size.height);\n",
3602         "        },\n",
3603         "    });\n",
3604         "\n",
3605         "    function mouse_event_fn(event) {\n",
3606         "        if (pass_mouse_events)\n",
3607         "            return fig.mouse_event(event, event['data']);\n",
3608         "    }\n",
3609         "\n",
3610         "    rubberband.mousedown('button_press', mouse_event_fn);\n",
3611         "    rubberband.mouseup('button_release', mouse_event_fn);\n",
3612         "    // Throttle sequential mouse events to 1 every 20ms.\n",
3613         "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
3614         "\n",
3615         "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
3616         "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
3617         "\n",
3618         "    canvas_div.on(\"wheel\", function (event) {\n",
3619         "        event = event.originalEvent;\n",
3620         "        event['data'] = 'scroll'\n",
3621         "        if (event.deltaY < 0) {\n",
3622         "            event.step = 1;\n",
3623         "        } else {\n",
3624         "            event.step = -1;\n",
3625         "        }\n",
3626         "        mouse_event_fn(event);\n",
3627         "    });\n",
3628         "\n",
3629         "    canvas_div.append(canvas);\n",
3630         "    canvas_div.append(rubberband);\n",
3631         "\n",
3632         "    this.rubberband = rubberband;\n",
3633         "    this.rubberband_canvas = rubberband[0];\n",
3634         "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
3635         "    this.rubberband_context.strokeStyle = \"#000000\";\n",
3636         "\n",
3637         "    this._resize_canvas = function(width, height) {\n",
3638         "        // Keep the size of the canvas, canvas container, and rubber band\n",
3639         "        // canvas in synch.\n",
3640         "        canvas_div.css('width', width)\n",
3641         "        canvas_div.css('height', height)\n",
3642         "\n",
3643         "        canvas.attr('width', width * mpl.ratio);\n",
3644         "        canvas.attr('height', height * mpl.ratio);\n",
3645         "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
3646         "\n",
3647         "        rubberband.attr('width', width);\n",
3648         "        rubberband.attr('height', height);\n",
3649         "    }\n",
3650         "\n",
3651         "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
3652         "    // upon first draw.\n",
3653         "    this._resize_canvas(600, 600);\n",
3654         "\n",
3655         "    // Disable right mouse context menu.\n",
3656         "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
3657         "        return false;\n",
3658         "    });\n",
3659         "\n",
3660         "    function set_focus () {\n",
3661         "        canvas.focus();\n",
3662         "        canvas_div.focus();\n",
3663         "    }\n",
3664         "\n",
3665         "    window.setTimeout(set_focus, 100);\n",
3666         "}\n",
3667         "\n",
3668         "mpl.figure.prototype._init_toolbar = function() {\n",
3669         "    var fig = this;\n",
3670         "\n",
3671         "    var nav_element = $('<div/>')\n",
3672         "    nav_element.attr('style', 'width: 100%');\n",
3673         "    this.root.append(nav_element);\n",
3674         "\n",
3675         "    // Define a callback function for later on.\n",
3676         "    function toolbar_event(event) {\n",
3677         "        return fig.toolbar_button_onclick(event['data']);\n",
3678         "    }\n",
3679         "    function toolbar_mouse_event(event) {\n",
3680         "        return fig.toolbar_button_onmouseover(event['data']);\n",
3681         "    }\n",
3682         "\n",
3683         "    for(var toolbar_ind in mpl.toolbar_items) {\n",
3684         "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
3685         "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
3686         "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
3687         "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
3688         "\n",
3689         "        if (!name) {\n",
3690         "            // put a spacer in here.\n",
3691         "            continue;\n",
3692         "        }\n",
3693         "        var button = $('<button/>');\n",
3694         "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
3695         "                        'ui-button-icon-only');\n",
3696         "        button.attr('role', 'button');\n",
3697         "        button.attr('aria-disabled', 'false');\n",
3698         "        button.click(method_name, toolbar_event);\n",
3699         "        button.mouseover(tooltip, toolbar_mouse_event);\n",
3700         "\n",
3701         "        var icon_img = $('<span/>');\n",
3702         "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
3703         "        icon_img.addClass(image);\n",
3704         "        icon_img.addClass('ui-corner-all');\n",
3705         "\n",
3706         "        var tooltip_span = $('<span/>');\n",
3707         "        tooltip_span.addClass('ui-button-text');\n",
3708         "        tooltip_span.html(tooltip);\n",
3709         "\n",
3710         "        button.append(icon_img);\n",
3711         "        button.append(tooltip_span);\n",
3712         "\n",
3713         "        nav_element.append(button);\n",
3714         "    }\n",
3715         "\n",
3716         "    var fmt_picker_span = $('<span/>');\n",
3717         "\n",
3718         "    var fmt_picker = $('<select/>');\n",
3719         "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
3720         "    fmt_picker_span.append(fmt_picker);\n",
3721         "    nav_element.append(fmt_picker_span);\n",
3722         "    this.format_dropdown = fmt_picker[0];\n",
3723         "\n",
3724         "    for (var ind in mpl.extensions) {\n",
3725         "        var fmt = mpl.extensions[ind];\n",
3726         "        var option = $(\n",
3727         "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
3728         "        fmt_picker.append(option)\n",
3729         "    }\n",
3730         "\n",
3731         "    // Add hover states to the ui-buttons\n",
3732         "    $( \".ui-button\" ).hover(\n",
3733         "        function() { $(this).addClass(\"ui-state-hover\");},\n",
3734         "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
3735         "    );\n",
3736         "\n",
3737         "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
3738         "    nav_element.append(status_bar);\n",
3739         "    this.message = status_bar[0];\n",
3740         "}\n",
3741         "\n",
3742         "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
3743         "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
3744         "    // which will in turn request a refresh of the image.\n",
3745         "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
3746         "}\n",
3747         "\n",
3748         "mpl.figure.prototype.send_message = function(type, properties) {\n",
3749         "    properties['type'] = type;\n",
3750         "    properties['figure_id'] = this.id;\n",
3751         "    this.ws.send(JSON.stringify(properties));\n",
3752         "}\n",
3753         "\n",
3754         "mpl.figure.prototype.send_draw_message = function() {\n",
3755         "    if (!this.waiting) {\n",
3756         "        this.waiting = true;\n",
3757         "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
3758         "    }\n",
3759         "}\n",
3760         "\n",
3761         "\n",
3762         "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
3763         "    var format_dropdown = fig.format_dropdown;\n",
3764         "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
3765         "    fig.ondownload(fig, format);\n",
3766         "}\n",
3767         "\n",
3768         "\n",
3769         "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
3770         "    var size = msg['size'];\n",
3771         "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
3772         "        fig._resize_canvas(size[0], size[1]);\n",
3773         "        fig.send_message(\"refresh\", {});\n",
3774         "    };\n",
3775         "}\n",
3776         "\n",
3777         "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
3778         "    var x0 = msg['x0'] / mpl.ratio;\n",
3779         "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
3780         "    var x1 = msg['x1'] / mpl.ratio;\n",
3781         "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
3782         "    x0 = Math.floor(x0) + 0.5;\n",
3783         "    y0 = Math.floor(y0) + 0.5;\n",
3784         "    x1 = Math.floor(x1) + 0.5;\n",
3785         "    y1 = Math.floor(y1) + 0.5;\n",
3786         "    var min_x = Math.min(x0, x1);\n",
3787         "    var min_y = Math.min(y0, y1);\n",
3788         "    var width = Math.abs(x1 - x0);\n",
3789         "    var height = Math.abs(y1 - y0);\n",
3790         "\n",
3791         "    fig.rubberband_context.clearRect(\n",
3792         "        0, 0, fig.canvas.width, fig.canvas.height);\n",
3793         "\n",
3794         "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
3795         "}\n",
3796         "\n",
3797         "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
3798         "    // Updates the figure title.\n",
3799         "    fig.header.textContent = msg['label'];\n",
3800         "}\n",
3801         "\n",
3802         "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
3803         "    var cursor = msg['cursor'];\n",
3804         "    switch(cursor)\n",
3805         "    {\n",
3806         "    case 0:\n",
3807         "        cursor = 'pointer';\n",
3808         "        break;\n",
3809         "    case 1:\n",
3810         "        cursor = 'default';\n",
3811         "        break;\n",
3812         "    case 2:\n",
3813         "        cursor = 'crosshair';\n",
3814         "        break;\n",
3815         "    case 3:\n",
3816         "        cursor = 'move';\n",
3817         "        break;\n",
3818         "    }\n",
3819         "    fig.rubberband_canvas.style.cursor = cursor;\n",
3820         "}\n",
3821         "\n",
3822         "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
3823         "    fig.message.textContent = msg['message'];\n",
3824         "}\n",
3825         "\n",
3826         "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
3827         "    // Request the server to send over a new figure.\n",
3828         "    fig.send_draw_message();\n",
3829         "}\n",
3830         "\n",
3831         "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
3832         "    fig.image_mode = msg['mode'];\n",
3833         "}\n",
3834         "\n",
3835         "mpl.figure.prototype.updated_canvas_event = function() {\n",
3836         "    // Called whenever the canvas gets updated.\n",
3837         "    this.send_message(\"ack\", {});\n",
3838         "}\n",
3839         "\n",
3840         "// A function to construct a web socket function for onmessage handling.\n",
3841         "// Called in the figure constructor.\n",
3842         "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
3843         "    return function socket_on_message(evt) {\n",
3844         "        if (evt.data instanceof Blob) {\n",
3845         "            /* FIXME: We get \"Resource interpreted as Image but\n",
3846         "             * transferred with MIME type text/plain:\" errors on\n",
3847         "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
3848         "             * to be part of the websocket stream */\n",
3849         "            evt.data.type = \"image/png\";\n",
3850         "\n",
3851         "            /* Free the memory for the previous frames */\n",
3852         "            if (fig.imageObj.src) {\n",
3853         "                (window.URL || window.webkitURL).revokeObjectURL(\n",
3854         "                    fig.imageObj.src);\n",
3855         "            }\n",
3856         "\n",
3857         "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
3858         "                evt.data);\n",
3859         "            fig.updated_canvas_event();\n",
3860         "            fig.waiting = false;\n",
3861         "            return;\n",
3862         "        }\n",
3863         "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
3864         "            fig.imageObj.src = evt.data;\n",
3865         "            fig.updated_canvas_event();\n",
3866         "            fig.waiting = false;\n",
3867         "            return;\n",
3868         "        }\n",
3869         "\n",
3870         "        var msg = JSON.parse(evt.data);\n",
3871         "        var msg_type = msg['type'];\n",
3872         "\n",
3873         "        // Call the  \"handle_{type}\" callback, which takes\n",
3874         "        // the figure and JSON message as its only arguments.\n",
3875         "        try {\n",
3876         "            var callback = fig[\"handle_\" + msg_type];\n",
3877         "        } catch (e) {\n",
3878         "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
3879         "            return;\n",
3880         "        }\n",
3881         "\n",
3882         "        if (callback) {\n",
3883         "            try {\n",
3884         "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
3885         "                callback(fig, msg);\n",
3886         "            } catch (e) {\n",
3887         "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
3888         "            }\n",
3889         "        }\n",
3890         "    };\n",
3891         "}\n",
3892         "\n",
3893         "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
3894         "mpl.findpos = function(e) {\n",
3895         "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
3896         "    var targ;\n",
3897         "    if (!e)\n",
3898         "        e = window.event;\n",
3899         "    if (e.target)\n",
3900         "        targ = e.target;\n",
3901         "    else if (e.srcElement)\n",
3902         "        targ = e.srcElement;\n",
3903         "    if (targ.nodeType == 3) // defeat Safari bug\n",
3904         "        targ = targ.parentNode;\n",
3905         "\n",
3906         "    // jQuery normalizes the pageX and pageY\n",
3907         "    // pageX,Y are the mouse positions relative to the document\n",
3908         "    // offset() returns the position of the element relative to the document\n",
3909         "    var x = e.pageX - $(targ).offset().left;\n",
3910         "    var y = e.pageY - $(targ).offset().top;\n",
3911         "\n",
3912         "    return {\"x\": x, \"y\": y};\n",
3913         "};\n",
3914         "\n",
3915         "/*\n",
3916         " * return a copy of an object with only non-object keys\n",
3917         " * we need this to avoid circular references\n",
3918         " * http://stackoverflow.com/a/24161582/3208463\n",
3919         " */\n",
3920         "function simpleKeys (original) {\n",
3921         "  return Object.keys(original).reduce(function (obj, key) {\n",
3922         "    if (typeof original[key] !== 'object')\n",
3923         "        obj[key] = original[key]\n",
3924         "    return obj;\n",
3925         "  }, {});\n",
3926         "}\n",
3927         "\n",
3928         "mpl.figure.prototype.mouse_event = function(event, name) {\n",
3929         "    var canvas_pos = mpl.findpos(event)\n",
3930         "\n",
3931         "    if (name === 'button_press')\n",
3932         "    {\n",
3933         "        this.canvas.focus();\n",
3934         "        this.canvas_div.focus();\n",
3935         "    }\n",
3936         "\n",
3937         "    var x = canvas_pos.x * mpl.ratio;\n",
3938         "    var y = canvas_pos.y * mpl.ratio;\n",
3939         "\n",
3940         "    this.send_message(name, {x: x, y: y, button: event.button,\n",
3941         "                             step: event.step,\n",
3942         "                             guiEvent: simpleKeys(event)});\n",
3943         "\n",
3944         "    /* This prevents the web browser from automatically changing to\n",
3945         "     * the text insertion cursor when the button is pressed.  We want\n",
3946         "     * to control all of the cursor setting manually through the\n",
3947         "     * 'cursor' event from matplotlib */\n",
3948         "    event.preventDefault();\n",
3949         "    return false;\n",
3950         "}\n",
3951         "\n",
3952         "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
3953         "    // Handle any extra behaviour associated with a key event\n",
3954         "}\n",
3955         "\n",
3956         "mpl.figure.prototype.key_event = function(event, name) {\n",
3957         "\n",
3958         "    // Prevent repeat events\n",
3959         "    if (name == 'key_press')\n",
3960         "    {\n",
3961         "        if (event.which === this._key)\n",
3962         "            return;\n",
3963         "        else\n",
3964         "            this._key = event.which;\n",
3965         "    }\n",
3966         "    if (name == 'key_release')\n",
3967         "        this._key = null;\n",
3968         "\n",
3969         "    var value = '';\n",
3970         "    if (event.ctrlKey && event.which != 17)\n",
3971         "        value += \"ctrl+\";\n",
3972         "    if (event.altKey && event.which != 18)\n",
3973         "        value += \"alt+\";\n",
3974         "    if (event.shiftKey && event.which != 16)\n",
3975         "        value += \"shift+\";\n",
3976         "\n",
3977         "    value += 'k';\n",
3978         "    value += event.which.toString();\n",
3979         "\n",
3980         "    this._key_event_extra(event, name);\n",
3981         "\n",
3982         "    this.send_message(name, {key: value,\n",
3983         "                             guiEvent: simpleKeys(event)});\n",
3984         "    return false;\n",
3985         "}\n",
3986         "\n",
3987         "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
3988         "    if (name == 'download') {\n",
3989         "        this.handle_save(this, null);\n",
3990         "    } else {\n",
3991         "        this.send_message(\"toolbar_button\", {name: name});\n",
3992         "    }\n",
3993         "};\n",
3994         "\n",
3995         "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
3996         "    this.message.textContent = tooltip;\n",
3997         "};\n",
3998         "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",
3999         "\n",
4000         "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
4001         "\n",
4002         "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
4003         "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
4004         "    // object with the appropriate methods. Currently this is a non binary\n",
4005         "    // socket, so there is still some room for performance tuning.\n",
4006         "    var ws = {};\n",
4007         "\n",
4008         "    ws.close = function() {\n",
4009         "        comm.close()\n",
4010         "    };\n",
4011         "    ws.send = function(m) {\n",
4012         "        //console.log('sending', m);\n",
4013         "        comm.send(m);\n",
4014         "    };\n",
4015         "    // Register the callback with on_msg.\n",
4016         "    comm.on_msg(function(msg) {\n",
4017         "        //console.log('receiving', msg['content']['data'], msg);\n",
4018         "        // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
4019         "        ws.onmessage(msg['content']['data'])\n",
4020         "    });\n",
4021         "    return ws;\n",
4022         "}\n",
4023         "\n",
4024         "mpl.mpl_figure_comm = function(comm, msg) {\n",
4025         "    // This is the function which gets called when the mpl process\n",
4026         "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
4027         "\n",
4028         "    var id = msg.content.data.id;\n",
4029         "    // Get hold of the div created by the display call when the Comm\n",
4030         "    // socket was opened in Python.\n",
4031         "    var element = $(\"#\" + id);\n",
4032         "    var ws_proxy = comm_websocket_adapter(comm)\n",
4033         "\n",
4034         "    function ondownload(figure, format) {\n",
4035         "        window.open(figure.imageObj.src);\n",
4036         "    }\n",
4037         "\n",
4038         "    var fig = new mpl.figure(id, ws_proxy,\n",
4039         "                           ondownload,\n",
4040         "                           element.get(0));\n",
4041         "\n",
4042         "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
4043         "    // web socket which is closed, not our websocket->open comm proxy.\n",
4044         "    ws_proxy.onopen();\n",
4045         "\n",
4046         "    fig.parent_element = element.get(0);\n",
4047         "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
4048         "    if (!fig.cell_info) {\n",
4049         "        console.error(\"Failed to find cell for figure\", id, fig);\n",
4050         "        return;\n",
4051         "    }\n",
4052         "\n",
4053         "    var output_index = fig.cell_info[2]\n",
4054         "    var cell = fig.cell_info[0];\n",
4055         "\n",
4056         "};\n",
4057         "\n",
4058         "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
4059         "    var width = fig.canvas.width/mpl.ratio\n",
4060         "    fig.root.unbind('remove')\n",
4061         "\n",
4062         "    // Update the output cell to use the data from the current canvas.\n",
4063         "    fig.push_to_output();\n",
4064         "    var dataURL = fig.canvas.toDataURL();\n",
4065         "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
4066         "    // the notebook keyboard shortcuts fail.\n",
4067         "    IPython.keyboard_manager.enable()\n",
4068         "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
4069         "    fig.close_ws(fig, msg);\n",
4070         "}\n",
4071         "\n",
4072         "mpl.figure.prototype.close_ws = function(fig, msg){\n",
4073         "    fig.send_message('closing', msg);\n",
4074         "    // fig.ws.close()\n",
4075         "}\n",
4076         "\n",
4077         "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
4078         "    // Turn the data on the canvas into data in the output cell.\n",
4079         "    var width = this.canvas.width/mpl.ratio\n",
4080         "    var dataURL = this.canvas.toDataURL();\n",
4081         "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
4082         "}\n",
4083         "\n",
4084         "mpl.figure.prototype.updated_canvas_event = function() {\n",
4085         "    // Tell IPython that the notebook contents must change.\n",
4086         "    IPython.notebook.set_dirty(true);\n",
4087         "    this.send_message(\"ack\", {});\n",
4088         "    var fig = this;\n",
4089         "    // Wait a second, then push the new image to the DOM so\n",
4090         "    // that it is saved nicely (might be nice to debounce this).\n",
4091         "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
4092         "}\n",
4093         "\n",
4094         "mpl.figure.prototype._init_toolbar = function() {\n",
4095         "    var fig = this;\n",
4096         "\n",
4097         "    var nav_element = $('<div/>')\n",
4098         "    nav_element.attr('style', 'width: 100%');\n",
4099         "    this.root.append(nav_element);\n",
4100         "\n",
4101         "    // Define a callback function for later on.\n",
4102         "    function toolbar_event(event) {\n",
4103         "        return fig.toolbar_button_onclick(event['data']);\n",
4104         "    }\n",
4105         "    function toolbar_mouse_event(event) {\n",
4106         "        return fig.toolbar_button_onmouseover(event['data']);\n",
4107         "    }\n",
4108         "\n",
4109         "    for(var toolbar_ind in mpl.toolbar_items){\n",
4110         "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
4111         "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
4112         "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
4113         "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
4114         "\n",
4115         "        if (!name) { continue; };\n",
4116         "\n",
4117         "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
4118         "        button.click(method_name, toolbar_event);\n",
4119         "        button.mouseover(tooltip, toolbar_mouse_event);\n",
4120         "        nav_element.append(button);\n",
4121         "    }\n",
4122         "\n",
4123         "    // Add the status bar.\n",
4124         "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
4125         "    nav_element.append(status_bar);\n",
4126         "    this.message = status_bar[0];\n",
4127         "\n",
4128         "    // Add the close button to the window.\n",
4129         "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
4130         "    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",
4131         "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
4132         "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
4133         "    buttongrp.append(button);\n",
4134         "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
4135         "    titlebar.prepend(buttongrp);\n",
4136         "}\n",
4137         "\n",
4138         "mpl.figure.prototype._root_extra_style = function(el){\n",
4139         "    var fig = this\n",
4140         "    el.on(\"remove\", function(){\n",
4141         "\tfig.close_ws(fig, {});\n",
4142         "    });\n",
4143         "}\n",
4144         "\n",
4145         "mpl.figure.prototype._canvas_extra_style = function(el){\n",
4146         "    // this is important to make the div 'focusable\n",
4147         "    el.attr('tabindex', 0)\n",
4148         "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
4149         "    // off when our div gets focus\n",
4150         "\n",
4151         "    // location in version 3\n",
4152         "    if (IPython.notebook.keyboard_manager) {\n",
4153         "        IPython.notebook.keyboard_manager.register_events(el);\n",
4154         "    }\n",
4155         "    else {\n",
4156         "        // location in version 2\n",
4157         "        IPython.keyboard_manager.register_events(el);\n",
4158         "    }\n",
4159         "\n",
4160         "}\n",
4161         "\n",
4162         "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
4163         "    var manager = IPython.notebook.keyboard_manager;\n",
4164         "    if (!manager)\n",
4165         "        manager = IPython.keyboard_manager;\n",
4166         "\n",
4167         "    // Check for shift+enter\n",
4168         "    if (event.shiftKey && event.which == 13) {\n",
4169         "        this.canvas_div.blur();\n",
4170         "        // select the cell after this one\n",
4171         "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
4172         "        IPython.notebook.select(index + 1);\n",
4173         "    }\n",
4174         "}\n",
4175         "\n",
4176         "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
4177         "    fig.ondownload(fig, null);\n",
4178         "}\n",
4179         "\n",
4180         "\n",
4181         "mpl.find_output_cell = function(html_output) {\n",
4182         "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
4183         "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
4184         "    // IPython event is triggered only after the cells have been serialised, which for\n",
4185         "    // our purposes (turning an active figure into a static one), is too late.\n",
4186         "    var cells = IPython.notebook.get_cells();\n",
4187         "    var ncells = cells.length;\n",
4188         "    for (var i=0; i<ncells; i++) {\n",
4189         "        var cell = cells[i];\n",
4190         "        if (cell.cell_type === 'code'){\n",
4191         "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
4192         "                var data = cell.output_area.outputs[j];\n",
4193         "                if (data.data) {\n",
4194         "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
4195         "                    data = data.data;\n",
4196         "                }\n",
4197         "                if (data['text/html'] == html_output) {\n",
4198         "                    return [cell, data, j];\n",
4199         "                }\n",
4200         "            }\n",
4201         "        }\n",
4202         "    }\n",
4203         "}\n",
4204         "\n",
4205         "// Register the function which deals with the matplotlib target/channel.\n",
4206         "// The kernel may be null if the page has been refreshed.\n",
4207         "if (IPython.notebook.kernel != null) {\n",
4208         "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
4209         "}\n"
4210        ],
4211        "text/plain": [
4212         "<IPython.core.display.Javascript object>"
4213        ]
4214       },
4215       "metadata": {},
4216       "output_type": "display_data"
4217      },
4218      {
4219       "data": {
4220        "text/html": [
4221         "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAPACAYAAABq3NR5AAAAAXNSR0IArs4c6QAAQABJREFUeAHs0IEAAAAAgKD9qRcphAoDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBg