Skip to content

Instantly share code, notes, and snippets.

@ev-br
Created May 13, 2015 18:26
Show Gist options
  • Select an option

  • Save ev-br/6753c191042727be16d6 to your computer and use it in GitHub Desktop.

Select an option

Save ev-br/6753c191042727be16d6 to your computer and use it in GitHub Desktop.
sample m_eff runs
{
"metadata": {
"name": "",
"signature": "sha256:b08b733e2899ee6d89a19249b8782f46fd81b172f4320f7febbf4ab1e43b9e6f"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import matplotlib\n",
"matplotlib.use('nbagg')\n",
"\n",
"import matplotlib.pyplot as plt"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import os\n",
"from itertools import product\n",
"\n",
"from mcba.models.impurity import Par, SingleImpurity\n",
"from mcba.walker import Walker\n",
"from mcba.helpers import copydict\n",
"from mcba.walker_factory import WalkerFactory\n",
"\n",
"import postproc as pp"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"##### Run MC ----- FIXME: doesn't quite work from the notebook"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"mc_dict = {\"num_sweeps\" : np.Inf,\n",
" \"steps_per_sweep\" : 100,\n",
" \"therm_sweeps\" : 0,\n",
" \"checkp_sweeps\" : 100,\n",
" \"printout_sweeps\" : 100,\n",
" \"seed\" : 42,\n",
" \"verbose_logg\" : True,\n",
" \"threshold\" : 0.995, \n",
" \"store_roots\" : False,\n",
" }\n",
"\n",
"base_path = \"../data/g3\"\n",
"\n",
"V=1.5\n",
"N = 135\n",
"mqs = [8] #[8, 9, 11, 12, 14, 15 ] #[0, 1, 2, 3, 4, 5]\n",
"\n",
"tasks = []\n",
"for mq in mqs:\n",
" par = Par(N=N, L=3*N, V=V, m_q = mq)\n",
" db_fname = os.path.join(base_path, \"N{0}V0.5mq{1}.sqlite\".format(par.N, par.m_q))\n",
" dct = {\"model\": SingleImpurity(par), \n",
" \"db_fname\": db_fname}\n",
" tasks.append( copydict(mc_dict, dct))\n",
"\n",
"factory = WalkerFactory(tasks, 6, freq=1, verbose=True)\n",
"factory.start()\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"@ 2015-05-13 18:58:32.133406: starting ../data/g3/N135V0.5mq8.sqlite\n",
"\tw/ threshold = 0.995\n",
"running: \n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "pyerr",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-37-a64c4e90c3a3>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 23\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 24\u001b[0m \u001b[0mfactory\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mWalkerFactory\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtasks\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m6\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfreq\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 25\u001b[1;33m \u001b[0mfactory\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstart\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/home/br/sweethome/1Dimpur/code/mcba/walker_factory.pyc\u001b[0m in \u001b[0;36mstart\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 181\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_start_process\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# start a new one\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 182\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfreq\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 183\u001b[1;33m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfreq\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# no need for throttling a CPU\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 184\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 185\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"### Plot \\gamma = 3 data\n",
"base_path = \"../data/g3\"\n",
"filez = [f for f in pp.list_dbs(base_path, lambda x: x.endswith('sqlite'))]\n",
"\n",
"data = pp.filter_pred(filez, lambda par, arr: True)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fig, ax = plt.subplots()\n",
"mparam = {45: {'alpha': 1, 'color':'g', 'ms':12},\n",
" 135: {'alpha': 0.8, 'color':'m', 'ms':10}}\n",
"\n",
"for N in np.unique(data['N']):\n",
" d = data[data['N'] == N]\n",
" d = np.sort(d, order='q')\n",
" \n",
" ax.plot(d['q'], d['P1'], 'o--',\n",
" lw=3, label='N = %s' % N, **mparam[N])\n",
"\n",
"ax.set_title(r'$\\gamma = %s$' % data['gamma'][0], fontsize=16)\n",
"ax.set_xlabel(r'$q / k_F$', fontsize=16)\n",
"ax.set_ylabel(r'$p_\\infty / k_F$', fontsize=16)\n",
"ax.grid(True)\n",
"ax.legend(loc='upper left')\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox \u2265 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.focus_on_mousover = false;\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this.root.attr('style', 'display: inline-block');\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" fig.waiting = false;\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
" canvas_div.resizable({ resize: mpl.debounce_resize(\n",
" function(event, ui) { fig.request_resize(ui.size.width, ui.size.height); }\n",
" , 50)});\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both;');\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0;\")\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
" function mouse_event_fn(event) {\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keydown('key_release', canvas_keyboard_event);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width);\n",
" canvas.attr('height', height);\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'];\n",
" var y0 = fig.canvas.height - msg['y0'];\n",
" var x1 = msg['x1'];\n",
" var y1 = fig.canvas.height - msg['y1'];\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (this.focus_on_mouseover && name === 'motion_notify')\n",
" {\n",
" this.canvas.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x;\n",
" var y = canvas_pos.y;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
" /* Don't fire events just when a modifier is changed. Modifiers are\n",
" sent along with other keys. */\n",
" if (event.keyCode >= 16 && event.keyCode <= 20) {\n",
" return;\n",
" }\n",
"\n",
" value = '';\n",
" if (event.ctrlKey) {\n",
" value += \"ctrl+\";\n",
" }\n",
" if (event.altKey) {\n",
" value += \"alt+\";\n",
" }\n",
" value += String.fromCharCode(event.keyCode).toLowerCase();\n",
"\n",
" this.send_message(name, {key: value});\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" var format_dropdown = this.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" this.ondownload(this, format);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"\n",
"mpl.debounce_event = function(func, time){\n",
" var timer;\n",
" return function(event){\n",
" clearTimeout(timer);\n",
" timer = setTimeout(function(){ func(event); }, time);\n",
" };\n",
"}\n",
"\n",
"mpl.debounce_resize = function(func, time){\n",
" var timer;\n",
" return function(event, ui){\n",
" clearTimeout(timer);\n",
" timer = setTimeout(function(){ func(event, ui); }, time);\n",
" };\n",
"}\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" function() { },\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
" // Disable right mouse context menu.\n",
" $(fig.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\">');\n",
" fig.send_message('closing', {});\n",
" fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-danger\" href=\"#\" title=\"Close figure\"><i class=\"fa fa-times icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Close figure', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type == 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (cell.output_area.outputs[j]['text/html'] == html_output) {\n",
" var output = cell.output_area.outputs[j];\n",
" return [cell, output, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"metadata": {},
"output_type": "display_data",
"text": [
"<IPython.core.display.Javascript at 0xb4c8ad0>"
]
},
{
"html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzde1xUdf4/8BcaaZm1lilIuZqpKaVulhT1bWUv2q61tu261PZrS3dzu7mBtkV2wRstWQoKyYhmuqXRqpmagmaFZpGStZZltWWRGpWaNxJ0mHn9/hgYZ2BA8ADnMzOv5+NxHtvMHIa3vsR9eeaczwFEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREwtVFAAoAXN3A/a8B8BmAZwFMA/AMgEIAFzTHcCIiIiLSdIbCU+JmAnDDU+waYjCA3QAOAvgewHMAujX9eCIiIiLSXH6KxhXAnwP4S/ONIyIiIiLNrRsaXwBva7ZpRERERMLMWQD+Dc/Hq+8DiPV5rROAe5vhe3ZD4wvg4wCmA0iF52Pk3zbDXCIiIiIhLxLA2/BcVDEawCwA2wGcUvX6PwF0aIbv2w2NL4DLAERUPW4P4BsA8U0+mYiIiEiI+xuA62s893cAwwGcCmBSgK95HkB+A7cpdXzfbmhcAWwP4Mwaz/2n6nuIiIiISCMMDvDcKQCeAHATgL7N9H27oXEFMJD58HxsLSIiIiJNYBqAx5rx/buh4QWwPYAvATxV4/mXAOxt2rFEREREwlcuPOcEBjIfwMoGbhPreI9uaHgBbAfP+X5/r/H8NgB5Dfh6EREREWmA+QA6NuP7XwBPAUwI8NpvAOwB8Cuf5/4FoKfP40EA9kF3AhERERFpMk800/sOgueo3acAXAC+BrAY/ku6/AbAfgDX+jzXBkAagNkAMuBZBubCZppRRCTspMDzUcuPAJYD6FzHfh0APA3gfwCOAPgcwCMAWvnsMxief+H7bj80x9Ai0qQ6wFO0REQkDIwEcBjADQD6A3gDnputBxIL4EV4/oXeHcB1AL4D8KjPPoPhKX1R8Cwm2wnN+5GSiDSNPwK4y+4hRESkZbwHYLLP4+7wFLj+Dfz6FABbfB4Prvr61k0xnIi0mCwAl9g9hIiINL82ACpR+4TsHaj7SsCaHgew1ufxYHgK4JcAdsKzin9vS1OKSEuYbvcAIiLSMrrAU9Ziazy/CcDDDfj6CwAcAPAnn+d6wfOxcj8AV8NTAPcCONfqsCIiIiJinZUC2AnAJ/DcQ7Q+p8Bzsci4Gs9HAIiB5zZP2rRp06ZNm7bg2WJw/B7dEoTq+wj4jnq+7hwAHwD4dwO/z0vwnF/kKwYAtWnTpk2bNm1BucVAgtoWBL4IpF8d+3eA58KRpfBf/qUurQF8htpHAM8EwJ07d/LgwYPabN6uuOIK22fQpixM3JSHOZuyMGPbuXNndQE8sxFdQwx0O4BDOL4MzOs4vgxMDDwf815e9fhMAJsBvAPgfHiWeomC//l99wEYBqAHgAEAFsKzcn9Uje97JgAePHiQYr/bbrvN7hGkirIwi/Iwh7Iww8GDB1UAQ4jvQtAvw3N+H+C5b6cLx+/bORieo4Mu+C/0vMPnvf4Jzzl/5QC+BbACwMUBvqcKoEGSk5PtHkGqKAuzKA9zKAszqACKVSqABikoKLB7BKmiLMyiPMyhLMygAihWqQAapKioyO4RpIqyMIvyMIeyMIMKoFilAmgQh8Nh9whSRVmYRXmYQ1mYQQVQrKq3ALrdbtuvdNLWcpvb7W7hv8JERORkqACKVfUWQJ8/YNrCYKvrz4GIiJhFBVCsalAB1DqBob1VryelAigiEhxUAMWqBhVAFYPQppxrS0lJsXsE8aE8zKEszKACKFapAIpyDqC0tNTuEcSH8jCHsjCDCqBYpQIoyllEJMioAIpVKoCinEVEgowKoFhluQA6nU5m5GQwITGB8SPimZCYwIycDDqdTst/wJvjvZ999llGRETw7LPPrvXr+vLLLxkREcG5c+daHf2k7N+/n1FRUYyIiOC6dev8Xqueu+b2s5/9zPL3VQGsTXc7MIvyMIeyMIMKoFh10gXQ5XIxKzeLsUNjGTkqkpgA7xY5KpKxQ2OZlZtFl8vV6D/YzfnevkVqwoQJfq9VF8Bnnnmm0e/bFEaPHs3o6Gi2atWKr732mt9r1XMvXbqUmzZt8m7btm2z/H1VAGvLy8uzewTxoTzMoSzMoAIoVp1UAXS5XLzqd1ex7ci2fuWs5tZ2ZFtePfzqRhW15nxv8niRGjJkCM866yz+8MMP3tfsLIAbN25ku3btOG/ePEZERNRZAL/44osm/94qgCIiwUUFUKw6qQKYlZt1woLmW9Sy52Q3+A91c743ebxIrV+/nm3btuX48eO9r9lVAI8dO8bY2FhOmTKFhYWF9RbAzz//vMm/vwqgiEhwUQEUqxpdAJ1OJ2OHxjaooFVvsdfGNui8veZ872q+RSopKYnt27fnnj17SDauADqdzhNulZWVDZppypQp7N27N48dO8Y33nij3gIYFRXF1q1bMzo6mnfddRf379/f4F97XVQAaysvL7d7BPGhPMyhLMygAihWNboAZuRk1Dov70Rb5KhITs2eGvB7lDvLue27bdz23TY+OPXBk3rvjJyMBv/Q+H6U+t1337Fdu3YcN24cyYYXwOr9TrR17979hPP873//42mnneYtfHUVwDVr1nDChAnMz89nYWEhp0yZwvbt27N///6sqKho8K8/EBXA2pKTk+0eQXwoD3MoCzOoAIpVjS6ACYkJjSpo1dugGwcF/B7bvtt2fL+4xr8vJoAJiQkN/qGpeS7dAw88wNNPP52lpaUNLoDHjh3jli1bTrg15AKNX/3qV7z55pu9j+sqgIEsX76cERERnDdv3gn3rY8KYG06ymEW5WEOZWEGFUCxqtEFMH5E/EmVtAE3DAj4PfwK4BUnVwDjR8Q3+IemZgHct28fzzzzTI4ZM4ZfffVVi34E/OKLL7Jdu3b8+OOPuX//fu7fv58rV65kREQEly9ffsJC5na7ecYZZ/DOO+9s8K8/EBVAEZHgogIoVoX9EUCSfPTRR9m2bVu++eabLfoR8IQJE+r9+nPPPbfer3e73WzXrh3vuuuuBv/6A1EBFBEJLiqAYlVYnwNY7cCBA+zQoQOHDh3aoh8Bf/XVV1y/fr3flpmZyYiICE6fPp1vv/12vV//0ksvMSIigvPnz2/wrz8QFcDatNaZWZSHOZSFGVQAxaqwvQq45np6kydP9h55s2shaLLucwCHDBnCqVOncuXKlVy7di1TU1N5xhln8LLLLrN81xUVwNp0twOzKA9zKAszqACKVWG5DmCrVq1qFcDDhw+zY8eObNWqle0FMNCdQJKSktinTx+2b9+ep556Knv27MkHH3yQZWVllr+nCqCISHBRARSrwu5OIFKbCqCISHBRARSrLN0LOHtOdr33682ek33S9wJurveW2lQAaystLbV7BPGhPMyhLMygAihWnXQBrOZ0OpmRk8GExATGj4hnQmICM3IyLJ+X1tzvLcepANaWkpJi9wjiQ3mYQ1mYQQVQrLJcACX4KWcRkeCiAihWqQCKchYRCTIqgGKVCqAoZxGRIKMCKFapAIpyDsDhcNg9gvhQHuZQFmZQARSrVABFOQdQVFRk9wjiQ3mYQ1mYQQVQrFIBFOUsIhJkVADFKhVAUc4iIkFGBVCsUgEU5RzA9u3b7R5BfCgPcygLM6gAilVhVwCfffZZRkRE8Oyzz6716/ryyy8ZERHBuXPnttg8b775Jm+77TbGxsaydevW7NatW8D9nnvuOcbHx/Pcc89lmzZt2K1bN/71r3/l119/7bffG2+8wYiIiFpbhw4d6pwhFHO2Kj093e4RxIfyMIeyMIMKoFjVJAWwpKSE6UnpTE1MZXpSOktKSprsD3lTv3d1AYyIiOCECRP8XqsugM8884yl79EYEydOZI8ePXjTTTfxkksuYffu3QPuN2PGDKampnLFihXcsGEDc3Nzef755/P888/n4cOHvftVF8Ds7Gxu2rTJu23ZsqXOGVQARUSCiwqgWGWpAJaVlTFtTBonx01m4YBCFg8sZuGAQk6Km8S0MWksKys76T/czfXe1QVwyJAhPOuss/jDDz94X7OjALrdbu9/33LLLXUeAQxkzZo1jIiI4EsvveR9rroAvvbaaw1+HxVAEZHgogIoVp10ASwrK+PY4WNZ0K+AxQOLa20F/Qo4dvjYkypqzfne1QVw/fr1bNu2LcePH+99zY4C6KuxBfDdd99lREQEV6xY4X2uugCuW7euwe+jAigiElxUAMWqky6AaWPS6ixovkUtbUxao/9gN+d7VxfAzz//nElJSWzfvj337NlDsnEF0Ol0nnCrrKxs1GwNKYCVlZWsqKjghx9+yJ///OeMjY3l0aNHva9XF8DOnTuzdevWPOecc3jLLbdw586ddb6nCmBtOs/JLMrDHMrCDCqAYtVJFcCSkhJOjptcq5Rt7r+Zmy/23yb0n8BPN3xKV4Ur4PdwVbh45PMj3u3TDZ9y4oCJnq/vv7neEjgpblKjzwmsLoBffPEFv/vuO7Zr147jxo0j2fACWL3fiba6zuerS0MK4FlnneV9/wEDBnD37t1+r7///vv85z//yVdeeYUbNmxgZmYmO3XqxPPOO89bdGtSAaxNVzqaRXmYQ1mYQQVQrDqpApielO49L893e7vr21x/+nq/Lf+0fCZ3SuaRz48E/B5HPj/i9x7JnZKZf1o+15++nm93fbveAlg4oJDpSY3716hvASTJBx54gKeffjpLS0sbXACPHTvGLVu2nHDbtm1bo2ZrSAHcunUr33nnHc6bN489e/ZkbGwsDxw4UO/XvPfeezzllFP42GOPBXxdBVBEJLioAIpVJ1UAUxNTAxayQAVw/enreW+HextcAO/tcK/3605UAIsHFjP1ptRG/dDULID79u3jmWeeyTFjxvCrr74y/iNgXzt27GCrVq0a9JFMbGwsr7322oCvqQCKiAQXFUCxKuyPAJLko48+yrZt2/LNN9+0/SPgxn5Nx44deccdd5xwv4suuoi/+c1vAr6mAlib7ndqFuVhDmVhBhVAsSqszwGsduDAAXbo0IFDhw61/SPgxhTAbdu2MSIi4oRHAIuLi9m6deta6x5WUwGszeFw2D2C+FAe5lAWZlABFKvC9ipg3wJIkpMnT/YeuWvJZWD27NnDxYsXc/Hixfy///s/durUiUuWLOHixYv58ccfe/e7+uqrmZmZydWrV3PdunWcPn06Y2Ji2LVrV+7bt8+73y233MLU1FQuW7aMr732Gp988kmec8457N69u9+ah75UAEVEgosKoFgVlusAtmrVqlYBPHz4MDt27MhWrVq1aAH0vXVbq1at2KpVK+9/T5w40bvfuHHjeMkll/DMM8/kGWecwdjYWD7wwAO1ruz917/+xX79+vGss85iZGQkf/rTn/Kuu+7i999/X+cMKoAiIsFFBVCsapI7gUyKm9RsdwJpjvcWfyqAIiLBRQVQrGraewHf1Iz3Am6G9xYPFcDaUlJS7B5BfCgPcygLM6gAilVNUgAluCnn2kpLS+0eQXwoD3MoCzOoAIpVKoCinEUkpDidTmbkZDAhMYHxI+KZkJjAjJwMOp1Ou0drMiqAYpUKoChnEQkJLpeLWblZjB0ay8hRkcQEeLfIUZGMHRrLrNwsulyBlyULJiqAYpUKoCjnAAoKCuweQXwoD3OYmoXL5eJVv7uKbUe29ZS+JDAqLoq9Y3szKi6KSPIUwbYj2/Lq4VcHfQlUARSrVABFOQeQl5dn9wjiQ3mYw9QssnKzPOVvPBg1KIrDYoYxs3MmHdEOZnbO5LCYYYwaFEWM95TA7DnZdo9siQqgWKUCKMpZRIKa0+lk7NBYYjzYo3cPTu00lY5oR61taqepvKD3BcR4MPba2KA+J1AFUKxSARTlLCJBLSMng5GjIhk1KKrO8udbAqMGRTFyVCQzcjLsHv2kqQCKVQ0qgDt37uTBgwe1hei2c+dOFcAaysvL7R5BfCgPc5iYRUJiApEEDosZ5i16s6Nm11kCh8UMI5LAhMQEu0c/aSqAYlWDCqC28NhUAI9LTk62ewTxoTzMYWIW8SPiGRUX5T3nr3p79txnAxbAzM6ZjIqLYvyIeLtHP2kqgGJVvQXQ7XbbfnQqnLbvvvvO1u/vdrtb+K8wc5l4lCOcKQ9zmJhFQmICe8f2rlX05nSew7md5wYsgb1ie+kIoIS1egugiIiIyY4cO8KMnAx26dul1hHA6hIY6Ahgl75ddA6ghDUVQBERCUovfPgCOz/RmZvf38xe1/TyOwewvm1YzDD2uqaXrgKWsKYCaBBT19cKR8rCLMrDHCZkcfjoYd7+8u3scH8HJg9MZka/DE6fMZ0xfWIadBVwTJ8YrQMoYU8F0CCmrrAfjpSFWZSHOezOYss3W9hzZk9e9v8u4/Ru073Fbtndy3jFb69gz649610HsGfXnrxy2JW6E4iEPRVAEREJCvPfn8/2D7fnyGtGHj/HL2YO1/Zdyw+u/4BHDxzltOxp7Nu1L6/reJ3fnUCu63gd+3bty2nZ04K+/JEqgGKdCqCIiASFTV9t4sS+E73l7/mfPs+3BrzFHak7WFlW6d3P6XTysSmP8bJelzH+/Hhe1usyPjblsaA+568mFUCxSgXQIKWlpXaPIFWUhVmUhznszmJO6hw6uji4otcKvpfwHve9us/WeeyiAihWqQAaJCUlxe4RpIqyMIvyMIfdWVRWVvKt29/ip3d9yqPfHrV1FjupAIpVKoAiImKUHT/sYKWrss7XK8sq6XaF98L1KoBilQqgiIgYwe12c95789j54c58+omn7R7HaCqAoSUFwDcAfgSwHEDnOvbrAOBpAP8DcATA5wAeAdCqxn7DAHwMoBzAuwDiAryXCqCIiNhuf/l+Ji5OZP/b+/Op7k/R0cXBjas22j2WsVQAQ8dIAIcB3ACgP4A3ABTWsW8sgBcBXAugO4DrAHwH4FGffS4CcBTAQ1X/PQPAPgBn13gvFUCDOBwOu0eQKsrCLMrDHM2RxVtfv8WeT/TkLb+4xW/dvqVXLqXzcOhcuduUVABDx3sAJvs87g7ADU8ZbIgUAFt8Hk8H8GaNfb4CcF+N51QADVJUVGT3CFJFWZhFeZijqbMo+F8Be9zdg5MumuQtfnNj5nJd7Dp+/sDndB5UAQxEBTA0tAFQCSChxvM7AIxu4Hs8DmCtz+ONACbW2GcegEU1nlMBFBER2/x49Ec+fuXj3vK3sNtCvnPVO9z7yl663eF9oUd9VABDQxd4jvbF1nh+E4CHG/D1FwA4AOBPPs99CuCeGvtNBbCuxnMqgCIi0mxKSkqYnpTO1MRUpiels6SkpNY+W9/dyqd/+jRX9l7J7aO2s2JXhQ2TBhcVwNBgpQB2AvAJgFk1nlcBDELbt2+3ewSpoizMojzM0dAsysrKmDYmjZPjJrNwQCGLBxazcEAhJ8VNYtqYNJaVlfnt/2Xel/zmmW/ortRRv4ZQAQwN9X0EfEc9X3cOgA8A/DvAa28CmFTjuWcBLKzx3JkAOGTIECYnJzM5OZkrVqxgcnIyy8vLvX/Q8vLy/G4AXlpaWmsxUIfD4XduyPbt25menu63T3p6ut9fHkVFRbVOKE5JSfFbab6goIB5eXnex+Xl5SE739133230fKb//jXlfNVfa+p81cJlvt///vdGz2f6719Tzvfwww+fcL69e/dy7PCxLOhXwLTuaZx54Uxu6LeBG/tvZH6/fP7p3D9x7PCx3hIYTr9/VuYrKCjg6NGjefnll/Oee+5RAQwRWxD4IpB+dezfAZ4LR5ai9vIvADANgS8C+UeN53QEUEREmlTamDQW9Ctg8cBiFg8s5uqLVnNBxwVc0X4FN/9sM4sHFnvK4Zg0u0cNWjoCGDpuB3AIx5eBeR3Hl4GJgedj3surHp8JYDOAdwCcDyCqajvX5/16A6iA5+rgPgAyAeyFpzj6UgEUEZEmU1JSwslxk1k8sJhFPytiXvc8vnjmi8yPzGd+ZD5Xd1ztLYaT4iYFPCdQTkwFMLT4LgT9Mjzn9wFANwAuANdUPR4Mz9FBV9X/Vm87arxf9ULQFfAsBD0owPdUARQRkSaTnpTOwgGFfP3i17kgegGXn7bcW/7yI/O5rs06buq7yXtOYHpS+onfVGpRARSrVAANUvOcErGPsjCL8jDHibJITUzlWwPe4nNnP8dVp67yFr+CyAK+fvrrLLqgyHsEsHhgMVNvSm2ZwUOMCqBYpQJoEF3paA5lYRblYY4TZVF9BHB1p9Xe8rf21LXc0GEDN1+y2a/86QjgyVMBFKtUAEVEpMlUnwO4+dLNfOWMV/ha29f4VsxbLL602K/86RxAa1QAxSoVQBERaVLVVwFv7reZ7/R6p1bx01XA1qkAilUqgAbR/U7NoSzMojzM4ZtF8e5iPv/+87X2KSsr864DWFf5810HUBpPBVCsUgE0SM1FQ8U+ysIsysMcDoeDLreLUzdOZfcx3Zl6cSrf2/herf2q7wQyKW5Sg+4EIo2jAihWqQCKiEiDfXPoG/56wa+Z8IcEZp+XTUe0g9MHTOeh/YcC7u+9F/BNdd8LWBpPBVCsUgEUEZEGWfXZKnad2JV3XnknHdEOz9bFwRW9VnDXnF12jxdWVADFKhVAERE5oaOVR3lNyjV8vOfj3vI377x5LOxXyN2O3XRXuu0eMayoAIpVKoAGqXkDcrGPsjCL8jBD0WtFHNJ+CB3RDr54wYt899fv8mCx/v/DDiqAYpUKoEFKS0vtHkGqKAuzKA9zZI7LZEGfAn5272c8tu+Y3eOELRVAsUoFUEREGsztdnPfq/vodukjXzupAIpVKoAiIuK1sWQjb1tyG53HnHaPIvVQARSrVAANUlBQYPcIUkVZmEV5NL9KVyUnFk7kOf88h/f/7H7OfWBuwP2UhRlUAMUqFUCD5OXl2T2CVFEWZlEezavkQAn/b97/sd/t/Tit+zQ6oh3Micnh+6++X2tfZWEGFUCxSgVQRCSMLfloCc9JO4cjhozwLu8yu8tsvtL7FX4y+hO7x5M6qACKVSqAIiJhLGlhEh/q95C3/D17/rNc3289dzy6g5VllXaPJ3VQARSrVAANUl5ebvcIUkVZmEV5NJ+yw2V8cuCTdEQ7uLjHYhbHF3PPij10uwNf5asszKACKFapABokOTnZ7hGkirIwi/JoXv8t/i8LflbAbYnbeGTHkXr3VRZmUAEUq1QADaJ/WZtDWZhFeVhX6ar/49zD/z1MV4XrhO+jLMygAihWqQCKiIS4V794lb1m9uJnX39m9yjSRFQAxSoVQBGREHWs8hgffPVBnjb+NI68ZiSnXTGNFUcq7B5LmoAKoFilAmgQra9lDmVhFuXReJ/v+5yX517O8+89nxMvmui9ynfp2KWW3ldZmEEFUKxSATSIVtg3h7Iwi/JonCUfLeEZaWdw8B8HM/u8bO/afqsvWs33f/k+j+0/dtLvrSzMoAIoVqkAioiEmHX/W8fRV432HvVb0HUBN/TbwE/+9gmPfnvU7vGkCagAilUqgCIiISj7H54jf0svXMrNAzdzV84uuisDr+0nwUcFUKxSATRIaWmp3SNIFWVhFuXReEePHuVrf3qN/x36Xx7c1HR/xysLM6gAilUqgAZJSUmxewSpoizMojwC2/Nj3XfsIMmj3x3lsb0nf75fIMrCDCqAYpUKoIhIEFr56Up2nNqRs9fOtnsUsYEKoFilAigiEkTKneUcs3oMWz3WitcPu57ZXbP5/lvv2z2WtDAVQLFKBVBEJEh8/P3H7JfTjx3u78Bxl47zXuWbd3UeK3+s/1ZvElpUAMUqFUCDOBwOu0eQKsrCLMqDfG3Hazxtymm8eOTFfKr7U3REO5jbJZcFfQr47hXv8uA7LfP3uLIwgwqgWKUCaJCioiK7R5AqysIsyoM8WHGQt/z5Fu9Rv393/Tc39t/ID2/4kD9+8mOLzaEszKACKFapAIqIBIm31r3FWefN4rKey7j50s3c8cgOVpbpo99wpAIoVqkAioi0MKfTyYycDCYkJjB+RDwTEhOYkZNBp9N5wq/9MPdDbrlqC/csr38JGAltKoBilQqgQbZv3273CFJFWZglVPJwuVzMys1i7NBYRo6KJCbAu0WOimTs0FhOzJzIXQd21fkebrebFbsqWnBqf6GSRbBTARSrVAANkp6ebvcIUkVZmCUU8nC5XLzqd1ex7ci2fsWv1nYr2P3S7jxaYeY9e0Mhi1CgAihWqQCKiLSArNws//KXBEbFRbF3bG9GxUURSSBSwStvvpIzz53J8b8Zb/fIYjAVQLFKBVBEpJk5nU7GDo31FL/xYNSgKA6LGcbMzpl0RDuY2TmT13e5ngldEjij8wzPEi9n5PKHTT/YPboYSgVQrFIBFBFpZhk5GZ5z/saDPXr34NROU73LuTiiHZx37jyuaLuCi05ZxBvb3MgZnWdw9jmzueDWBXaPLoZSARSrVAANonNrzKEszBLseSQkJhATPEf+apa/+R3nc3XkauZH5jM/Mp+LTlnEP7b/I/vd3o8JiQl2j15LsGcRKlQAxSoVQIPo6jpzKAuzBHse8SPiiSRwWMwwv/LniHZwdvRsLm+73FsAl522jL+L/h2RBMaPiLd79FqCPYtQoQIoVqkAiog0s4TEBEbFRXnP+au5ze00l6tOXcW8s/K85wRGxUUZeQRQzKACKFapAIqINLPJmZN5UfeLApa/6i03Ktfv8UXdL2JGTobdo4uhVADFKhVAg+gem+ZQFmYJ5jze+PINRj0RxQvPuZDZHbPrLYHVW2bnTMb+NLZBdwZpacGcRShRARSrVAAN4nA47B5BqigLswRjHpWuSk4snMjWqa35yxt/yUlnTeLoU0dzdvTsExbA68Vqo2AAACAASURBVDtez8npk+3+JQQUjFmEIhVAsUoFUESkiZUeLuUvFvyCP7n/J7zv8vu8xe7Pp/yZs0+vvwA+2eFJXtr9UrpcLrt/GWIwFUCxSgVQRKQJudwuXjLrEl76l0s5rds0z5W+XWZz1UWruOFnG/inmD9x5hkzOfsc/yI4+5zZnHnGTN4w4AYeOnTI7l+GGE4FUKxSARQRaWJrNqzhrJhZdEQ7+Oz5z3J9v/XcOmwrD717iGVlZZxyzxTe1e0uzv3JXD7f4XnO/clc3tXtLk65ZwrLysrsHl+CgAqgWKUCaJCUlBS7R5AqysIswZjH00lP88ULXuQ7l77DHY/uoPOw/wUdJSUlTE9KZ+pNqUxPSmdJSYlNkzZOMGYRilQAxSoVQIOUlpbaPYJUURZmCcY8nEed/PSeT7lvzT67R2lSwZhFKFIBFKtUAEVETsKxymN8fuvzdLvdde5T32siVqgAilUqgCIijVRyoITxc+M5+I+DuXDKQrvHkTCkAihWqQAapKCgwO4RpIqyMItJeSz/ZDnPf/R83ht3Lx3RDs46bxa3vLnF7rFajElZhDMVQLFKBdAgeXl5do8gVZSFWUzI42jlUSYXJLP/bf35VPenvMu3zD9/Pt8e/jbdleHxca8JWYgKoFinAigi0gCPrHqEtybc6rd23+Iei/ne0Pd4cJP+DpWWpQIoVqkAiog0wL79+zi1/1Q6oh3M7ZLLgj4F/CLlCzoPmHe/Xgl9KoBilQqgQcrLy+0eQaooC7OYkkfR60Wc330+N8Zv5N5Ve8PyKl9Tsgh3KoBilQqgQZKTk+0eQaooC7M0Zx7eBZkTG7Yg857Ve1ixu6LZ5jGdfjbMoAIoVqkAGkT/sjaHsjBLc+RRVlbGtDFpnBw3mYUDClk8sJiFAwqZdEkSx48ar1uy1UE/G2ZQARSrVABFJOyUlZVx7PCxLOhXwOKBxSweWMzNl27mS91f4tJ2S/n86c8z+XfJKoFiLBVAsUoFUETCTtqYNL/yt7H/RuZ1zuMrp77C/Mh85kfmc1HHRUwbk2b3qCIBqQCKVSqABtH6WuZQFmZpyjxKSko4OW6yt/yt6bOGi89c7C1+1dtrZ7zGiZdPPOE5geFGPxtmUAEUq1QADaIV9s2hLMzSlHmkJ6UfP+fv4kIub7vcr/itOXUN13daz80DNrNwQCHTk9Kb7HuHAv1smEEFUKxSARSRsJKamOo9+lc8sJirzlnlLX9r267l2z3e9ns99aZUu0cWqUUFUKxSARSRsOJ7BLB4YDE3/WwTV7VbxdfOeo2bL9nsV/50BFBMpQIoVqkAGqS0tNTuEaSKsjBLU+ZR8xzA4oHF3Nx/M4svLfZ7rnhgMSfFTdI5gDXoZ8MMKoChJQXANwB+BLAcQOd69n0EwGYAFQDeDPD6YADuGtsPAfZTATRISkqK3SNIFWVhFqt5bP12K1e/s9r7uOZVwIG2gn4Fugo4AP1smEEFMHSMBHAYwA0A+gN4A0BhPfunArgXwAIAGwK8Phie0hcFoFPV1jHAfiqAIhKy3G43Z78zmzdfezOzumfx0w8+JRl4HcCa5W/s8LFaB1CMpQIYOt4DMNnncXd4Clz/E3zdBNR/BLD1Cb5eBVBEQtLBioMclTuKD/Z/kI5oBx3RDk4fNJ1Hyo6QPH4nkElxk/zuBDIpbhLTxqSp/InRVABDQxsAlQASajy/A8DoE3ztBNRfAL8EsBPAMgC9A+ynAigiIee9b97jb/7xG07vNt1b/hzRDr508Us88N8Dfvt67wV8U8PuBSxiAhXA0NAFnrIWW+P5TQAePsHXTkDgAtgLno+V+wG4Gp4CuBfAuTX2UwE0iMPhsHsEqaIszNKYPI5WHuUtibf4Fb+5MXO5btg6HvnySDNOGR70s2EGFcDQ0BwFsKZTAHwOYFyN51UADVJUVGT3CFJFWZilsXmsWbKGOV1y6Ih2cGG3hfzg4Q9YWV7ZTNOFF/1smEEFMDTU9xHwHSf42gloWAEEgJcAZNV47kwAHDJkCJOTk5mcnMwVK1YwOTmZ5eXl3j9oeXl5fqu/l5aW1roSzOFw+P3FsH37dqan+6+flZ6ezu3bt3sfFxUV1frXZEpKit8yAwUFBX63HiovL9d8mk/zab4TzvfPm/7JO7vcye+Wf2fkfKb//mk+8+YrKCjg6NGjefnll/Oee+5RAQwRWxD4IpB+J/i6CWhYAWwN4DPoCKCIhAl3pZvlX5efeEeRIKQjgKHjdgCHcHwZmNdxfBmYGACfALjcZ/+uAAYAcMBzBXH/qsfV7gMwDECPqucXAtgHz7IwvlQADeL7r0exl7IwS6A89h3Zx8w1mXS5XDZMFL70s2EGFcDQ4rsQ9MvwrN0HAN0AuABc47PvfBxf4Nnl87/V/gnPOX/lAL4FsALAxQG+pwqgQWp+pCD2URZmqZnH21+/zcH/GMwnL3iSzz/+vE1ThSf9bJhBBVCsUgEUkaDhcrv4xPonOPy64d6LPGadN4tbCrfYPZpIi1IBFKtUAEUkKHxf9j1/n/N7Jg9M9lviZVH3Rdz+hD6WlPCiAihWqQCKSFC4P+d+Tu0x9Xj56+LgiotX8NvF39Ltdts9nkiLUgEUq1QADaJza8yhLMySnp7OvXv2ctrF0+iIdnDeefNYOKSQP37yo92jhR39bJhBBVCsUgE0iK6uM4eyMEt1HkWFRVzUcxE/TP6QzsNOm6cKT/rZMIMKoFilAigiQeXI50f0ka+EPRVAsUoFUESMUemqZPr6dH7z7Td2jyJiNBVA+/weQBw89/ENZiqABtE9Ns2hLFre7kO7OfTpobw37l5OS5jGSufxe/cqD3MoCzOoANpnBzx37fiN3YNYpAJokJr3jRT7KIuWtebzNbws6TL+q+e/vFf5zh031/u68jCHsjCDCqB9Jp94l6CgAigitnG6nBz/6ngO+f0QzoqZ5S1/z57/LDf8egMrj1Se+E1EwpAKoH0erPrfDvDcdu1ZAHcg+IJQARQR2xRsL+DdV9ztt7Dzixe8yG33bqPzgK7yFamLCqB9Hqrx+DkAbQG0tmEWK1QARcRWGbdl0BHt4Owus7k6djW/mf8N3S5d5StSHxVA+5QCmAXgZgDn4fgRwWqXt/hEJ0cF0CApKSl2jyBVlEXLKSsro+NqB9/8xZs89P6hgPsoD3MoCzOoANrnJQCPAXgVwCEA+wEsAnAXgEsApNs3WqOoABqktLTU7hGkirJoWRXfVPDYD8fqfF15mENZmEEF0D4Dff67NYDLACQDWArP0UGXHUOdBBVAEWl2y7Yv47L3ltk9hkjIUAE0V47dAzSQCqCINJujlUd53+r7OPiPg5nZI5OffvCp3SOJhAQVQHMNsnuABlIBNEhBQYHdI0gVZWHdFz98wSuzruQdV93hvcJ32qBpPHrkaKPfS3mYQ1mYQQWwZa2F55y/aqcAmADgGlumaRoqgAbJy8uzewSpoiysWfzRYvYZ24eTLprkLX+5XXK5pu8a7n9zf6PfT3mYQ1mYQQWwZRUCmBPg+V8AGNeyozQZFUARaVKHKg5xyKghzDovy1v+FnRdwLcGv8WDm/R3jUhTUAFsWQ8CaOfzeBCA3wLoDcBhy0TWqQCKSJNbu3Qtc7rk0BHt4NILl/Kjv33Eo3sa/9GviASmAth8ogGcXuO5tvCUwNYAfg/ACeB7AHsB/KNFp2s6KoAGKS8vt3sEqaIsrJszbg7Xxq7lrlm76K60trCz8jCHsjCDCmDzeQ9ABYA3AIyHZ5kXwHPrtyQABQAG2DNak1IBNEhycrLdI0gVZWGdu9LNwx8cbpL3Uh7mUBZmUAFsPncAeB/Ao/Cc+1cOz5G+FwHMA/CWbZM1LRVAg+hf1uZQFie2fc92PpL/CF0uV7N/L+VhDmVhBhXA5nMagL/WePwrAI8DeAeej3/3AVgGzxHBC1t6wCaiAigitTidTmbkZDAhMYHxI+KZkJjAjJwMOp1OkuSC/y7gBeMuYGrfVC58fKHN04qEHxVA+7QHcB2ADABbAXxt7zgnTQVQRLxcLhezcrMYOzSWkaMiiQnwbpGjItlnSB/G3RvHuJvjOPP8mXREOzjrvFn874b/2j26SFhRATRHK7sHOEkqgAbR+lrmCMcsXC4Xr/rdVWw7sq2n9CWBUXFR7B3bm1FxUUQSGPlIJG/tfysdpzm8S7ws67mMn6V81qyzhWMeplIWZlABFKtUAA2iFfbNEY5ZZOVmecrfeDBqUBSHxQxjZudMOqIdzOycyeFRw3n92ddzRucZdJzt4OwOs/lq7Kv8evrXdB1r3vMAwzEPUykLM6gANp9FAB4BcIHdgzQzFUARodPpZOzQWGI82KN3D07tNNV7hK96mx01mwtOXcAb29zoKYEdHNyzbo/do4uEJRXA5tMKQAI8d/7IB3APgHNsnah5qACKCDNyMhg5KpJRg6IClr/qbd6587jwlIW87pzrGJUYxYycDLtHFwlLKoAtow2AP8CzBMxLAG6G56rgUKACaJDS0lK7R5Aq4ZZFQmICkQQOixlWZ/mr3p7t+CyHdRlGJIEJiQktMl+45WEyZWEGFcCW9xN41gh8BcC/AVyL4L0ABFABNEpKSordI0iVcMsifkQ8o+KivOf8zY6aXW8JzOycyai4KMaPiG+R+cItD5MpCzOoANrrfHhuDfcqgJnw3Bs42KgAiggTEhPYO7Y3Z0fN5uIzFnPZ6ctOeCSwV2yvFjsCKCL+VADN0Q/AEwBeBzABwbMwtAqgSJhzuV28/p/Xs+cFPZnXJo/5kfnMj8znC2e9UO8RwC59u+gcQBGbqACaJwLAYAC5APLsHaVBVABFwtj3Zd/z2n9fy1/e8EtOaTOFY04Z4y2Ar5z6Sp0fBQ+LGcZe1/Ty3hlERFqWCqBYpQJoEIfDYfcIUiVcsljywRLeG3evp9j9xMGb29zMRacs4rLTlnFO5zkBy9/UTlMZ0yeG2XOyW2zOcMkjGCgLM6gAilUqgAYpKiqyewSpEk5ZTBs5jY5oB5857xnObj+bV3W4qs6lYKZ2msqeXXvyymFX0uVq3sWffYVTHqZTFmZQARSrVABFwtzhw4f53ODn+O7Qd3mg+ACnZU9j3659eV3H6/zuBHJdx+vYt2tfTsue1qLlT0RqUwEUq1QARYQVuyroPHD8fD6n08nHpjzGy3pdxvjz43lZr8v42JTHdM6fiCFUAMUqFUCDbN++3e4RpEooZXG08ijHFozlkteX2D3KSQulPIKdsjCDCqBYpQJokPT0dLtHkCqhksUXP3zB+Kx4/mXwX5jdLZufbv3U7pFOSqjkEQqUhRlUAMUqFUCREPXithfZJ7kPJ1400XsRx4wrZ9B1VOfviQQ7FUBzXAtgFICRAP6C4Lk9nAqgSIg5cuwI/77i7/zljb/k0zFPe8vfgq4LuPGqjfzxkx/tHlFELFIBNMMfAMT6PL4AnruCBAMVQJEQU3q4lHcOvdNv+ZYlFy7htpHbWFFaYfd4ItIEVADN8I8Az/2nxac4OSqABtG5NeYI9izWvryWs7rMYm5MLtdevJa7Z++mu9Jt91gnLdjzCCXKwgwqgGZ4FMApPo+7A3jTplkaSwXQILq6zhyhkMULD73Aol8X8dC7h+wexbJQyCNUKAszqACaIQpABoC2AH4OYDeA62ydqOFUAEWCmNtd91E9d6Xbb20/EQkdKoDmOA/AewCOABhh8yyNoQIoEoTcbjezNmUx+Ylk3ZVDJAypAJohAkAegC0A/gpgOoDWtk7UcCqABtE9Ns1hUhYlJSVMT0pnamIq05PS+cGnH3DEghH8y+C/0BHt4MIpC+0esdmZlEe4UxZmUAE0w53wXPTRpupxdwCP2DdOo6gAGsThcNg9glQxIYuysjKmjUnj5LjJLBxQyOKBxVzddzX/FP0nDu8wnDM6z6Aj2sFZ58/irvd32T1uszIhD/FQFmZQATTDCzhe/qo9aMcgJ0EFUMRAZWVlHDt8LAv6FbB4YDGLBxZzZe+VXNRhEVdHruaiUxbxxjY3claXWXw97nUeeOuA3SOLSAtSATRDFmov/DzOjkFOggqgiIHSxqT5lb/igcV8udPLzI/M9255kXlMuiiJFd9obT+RcKMCaIYYAJMBXAmgL4DRAK62daKGUwEUMUxJSQknx032K3/FA4v5Tv93+MpprzA/Mp/r2q7j213f5qRBk1hSUmL3yCLSwlQAzREBoA+AgfBfE9B0KoAGSUlJsXsEqWJnFulJ6d5z/mpuhb0K+Ub7N7ipzybP4wGFTE8K/YV59bNhDmVhBhXAlnUqgPsBrILnvL/RAM6wdSLrVAANUlpaavcIUsXOLB5NfDRg+fNul/o/Tr0p1bZZW4p+NsyhLMygAtiy5gEogOeK3+0A3AB2AfiVnUNZpAIoYpAVn6zgVf2v4qt9Xq2/BFYfEQyTI4Ai4k8FsGWl13jcBcBYAN8AiGv5cZqECqCIAY5WHuW4FeP4/xL+Hx8/93He3f7uWkf6Am2T4nQOoEg4UgFsWY/V8Xw3AAtbcI6mpAJokIKCArtHkCotmcXn+z7ntZOvZWrfVDqiHXREO3jz6TdzcefF9Za/gn4FTBuT1mJz2kk/G+ZQFmZQAWxZFwNIqeO1usqh6VQADZKXl2f3CFKlpbJYsm0Jr73pWmadl+Utf7ldcrlswDLee+W9tZaC8S1/Y4ePZVlZWYvMaTf9bJhDWZhBBbBlTQTghOcj30XwXATSC8BVACbU2Ld7i0528lQARWy0+KXF3uLniHZwQdcFLEosYsWuCu+dQCbFTfJeFVw4oJCT4iYxbUxa2JQ/EalNBbBl5cKzzt8fAGQCeBeeQugG8DKABwD8HJ4rg1+yacbGUgEUsdn026fTEe3g0guXckfmDrqcLr/XvfcCvslzL2Cd8yciKoAt6x8A/gYgyue5MwD8GsAkAK8DKAPgAlDZ4tOdHBVAg5SXl9s9glRpySwOHz7MNbeu4cFN+jmsi342zKEszKAC2PIuAHBLPa9HArgCwCctM45lKoAGSU5OtnsEqdLUWVQ4dbs2K/SzYQ5lYQYVQHMl2j1AA6kAGkT/sjZHU2ax5Zst/O2Y33LZ7GVN9p7hRj8b5lAWZlABFKtUAEWaidvt5swNM3nLkFvoiHYwu1s2P9v6md1jiUgIUAEUq1QARZrBviP7eOuMW/lo7KP+V/kmLKh1kYeISGOpAIpVKoAG0fpa5rCSxZbdWzh85HDOPH+mX/lb1m8Zv1/5fRNOGT70s2EOZWEGFcDQkgLPGoM/AlgOoHM9+z4CYDOACgBv1rHPMAAfAyiHZ8maQLerUwE0iFbYN4eVLHaV7uL03tO9xe+Z857hGze8wfISnTt1svSzYQ5lYQYVwNAxEsBhADcA6A/gDQCF9eyfCuBeAAsAbAjw+kUAjgJ4qOq/ZwDYB+DsGvupAIo0gzUvrWFOlxy+0P0Ffpz+MV3H9LGviDQdFcDQ8R6AyT6Pu8OzwHT/E3zdBAQ+Ajg9wPNfAbivxnMqgCLNpHB6IX/Y+IPdY4hICFIBDA1t4Fk4OqHG8zvgud1cfSYgcAHcCM+t63zNg+cWdr5UAA1SWlpq9whSpSFZOF1OHj56uAWmEf1smENZmEEFMDR0gedoX2yN5zcBePgEXzsBgQvgpwDuqfHcVADrajynAmiQlJQUu0eQKifK4usDX/Omh27iE396gi6XPt5tbvrZMIeyMIMKYGhQARQJIss/WM5bh93qvchjYdpCu0cSkTCjAhga6vsI+I4TfO0EBC6Ab8Jzf2JfzwJYWOO5MwFwyJAhTE5OZnJyMlesWMHk5GS/1d7z8vL8rvwqLS2t9a9Ah8PBoqIi7+Pt27czPT3db5/09HRu377d+7ioqIgOh8Nvn5SUFL+PGAoKCvyWHSgvL9d8ms+W+SqcFRyXO46DzhnErKgsbwG889w7+fJzL9s+H2n275/m03yaz9p8BQUFHD16NC+//HLec889KoAhYgsCXwTS7wRfNwGBC+C0AM9/BeAfNZ7TEUCRBthfvp9/vvfPzOya6be2X95Fedy5ZCfdbrfdI4pIGNERwNBxO4BDOL4MzOs4vgxMDIBPAFzus39XAAMAOOC5grh/1eNqveFZIzAFQB8AmQD2AuhQ4/uqABqk5r8WxT41s3C73XziD094i19ul1y+cu0rPLLjiE0Thhf9bJhDWZhBBTC0+C4E/TKATlXPdwPgAnCNz77z4TlC6K56rfp/fVUvBF0Bz0LQgwJ8TxVAg/h+xCD2CpTF3r17+dQlT3FB1wV8N/Vduip08UdL0c+GOZSFGVQAxSoVQJFG+Oitj/jda9/ZPYaIhDkVQLFKBVDEh9vt5s79O+0eQ0SkXiqAYpUKoEF8ryCTlnew4iDHPD6Gj/d/nIVrC+0eR3zoZ8McysIMKoBilQqgQWouKyAtZ3PJZv7tD39jTpccOqIdHHbBMFY6K+0eS6roZ8McysIMKoBilQqghDW3282s5Vl8aMBDfsu7zI2Zyw+XfGj3eCIiAakAilUqgBLW7p9wPzN+muFX/v594b/5yYJPtLafiBhLBVCsUgGUsLZk3pLj5a+Lg//5+X94+NPDdo8lIlIvFUCxSgXQIDq3xh7Tb5vOZ857hm+Me4OV5Z7z/pSFWZSHOZSFGVQAxSoVQIPo6jp7HD58mF+u/dLvOWVhFuVhDmVhBhVAsUoFUMLCR19+ZPcIIiJNRgVQrFIBlJB2rPIY055OY/qF6Xx51st2jyMi0iRUAMUqFUCD6B6bTevLvV/yvlvv46wus+iIdjC7WzY/++CzBn2tsjCL8jCHsjCDCqBYpQJoEIfDYfcIQcHpdDIjJ4MJiQmMHxHPhMQEZuRk0Ol0evdZtn4Zx1823m95l9ldZnPVQ6sa9D2UhVmUhzmUhRlUAMUqFUAJGi6Xi1m5WYwdGsvIUZHEBHi3yFGRjB0ay6zcLM7991xO6zbNr/w90+0ZFucUa20/EQkJKoBilQqgBAWXy8WrfncV245s61f8am5tR7blz4f8nBm9ji/uPP+K+dzzwR67fwkiIk1GBVCsUgGUoJCVm3XC8udbAh+++2HmxuTy5bteZuWPuqeviIQWFUCxSgXQICkpKXaPYCSn08nYobENKn/VW+y1sfz6va9P+nsqC7MoD3MoCzOoAIpVKoAGKS0ttXsEI2XkZNQ65w8TwNMeOo3tUtoFLICRoyKZkZNx0t9TWZhFeZhDWZhBBVCsUgEU4yUkJtQqeD3u7MG0Xmm8+4q7idTARwETEhPsHl1EpFmoAIpVKoBivPgR8d5S1+qxVvzN737DWTGzvBd5JPyxdkHEBDB+RLzdo4uINAsVQLFKBdAgBQUFdo9gpOojgD+5/ydMHpjst7yLI9pR51FAK0cAlYVZlIc5lIUZVADFKhVAg+Tl5dk9gpEycjJ47s3n8qnuT/kVv6djnuaQG4Yw4rGIJj8HUFmYRXmYQ1mYQQVQrFIBFOM5nU72HdKXI68Z6S1/U3pPYbe7utV7FbDvnUFEREKJCqBYpQIoQSErN4tn/b+zOLn3ZP71//7Ktg/VvSZg25FtmT0n2+6RRUSajQqgWKUCaJDy8nK7RzBW9Z1AzvnzOXVe9Vtd/q4efjVdLpel76cszKI8zKEszKACKFapABokOTnZ7hFs9/nOz/nmq28GfM3lcjF7Tna99wLOnpNtufyRysI0ysMcysIMKoBilQqgQcL9X9ZLXl7Cf/X9F2deOJO7duyqcz+n08mMnAwmJCYwfkQ8ExITmJGT0aTn/IV7FqZRHuZQFmZQARSrVADFdmUVZXw86XE+HfO09yKP6QnTWenUPXxFRAJRARSrVADFVlu3b2Xqz1Nrre03Z+gclu0rs3s8EREjqQCKVSqABgm39bWOVBzhv/r9y6/4zT5vNldMXEF3pdvW2cItC9MpD3MoCzOoAIpVKoAGCccV9pfOW+otf7MumcVPNnxi90gkwzMLkykPcygLM6gAilUqgGK76X+Zzmf+9AyP/HDE7lFERIKCCqBYpQIotnM5XXS77f3IV0QkmKgAilUqgAYpLS21e4Rmsfu73Vzw5AK7x2iUUM0iWCkPcygLM6gAilUqgAZJSUmxe4Qmt2btGqZfnE5HtIMv57xs9zgNFopZBDPlYQ5lYQYVQLFKBVAsKykpYXpSOlMTU5melM6SkhIedR5lxvgMZp+X7b3II7tbNv/34f/sHldEJOipAIpVKoBy0srKypg2Jo2T4yazcEAhiwcWs3BAIR8e8DBvOO8Gzug8w2+Jl6d/8TS//+p7u8cWEQl6KoBilQqgnJSysjKOHT6WBf0KWDyw2G9b2WElF52yiDe2uZEzOs/g7JjZzEvJo8tp/R69IiKiAijWqQAaxOFw2D1Cg6WNSQtY/ooHFvPtS97mqjaruOiURUzskMj3175v97iNFkxZhAPlYQ5lYQYVQLFKBdAgRUVFdo/QICUlJZwcNzlg+aveXuvxGleftZqpl6aypKTE7pEbLViyCBfKwxzKwgwqgGKVCqA0WnpSuvecvxNthQMKmZ6UbvfIIiIhRQVQrFIBlEZLTUzlOwPe4apzV/Gdfu+csASm3pRq98giIiFFBVCsUgE0yPbt2+0eoUHu++N9/E/b/zA/Mp+rzloVkkcAgyWLcKE8zKEszKACKFapABokPd3solTpqmTupFxOjprMMaeMYX5kPvMj87k2Zm2dBXBS3KSgPAfQ9CzCjfIwh7IwgwqgWKUCKA2ye9dupl+b7l3T7+bTb+aiUxZx1Rmr+Hbs2wHLX0G/AqaNSbN7dBGRkKMCKFapAEqDLMxa6Leo84yoGfzjBX9kwSWBl4Ip6FfAscPHsqyszO7RRURCjgqgWKUCKA3icrk49fdT6Yh2cOZFM/nmije9dwKZFDfJ704gk+ImMW1MmsqfiEgzUQEUq1QADWL6uTV79uzhzL/M5Pe7/W/n5r0X8E3H7wUcRWfD4gAAGhtJREFU7EzPItwoD3MoCzOoAIpVKoAG0dV15lAWZlEe5lAWZlABFKtUAMWr7FAZM/+SyVcXvWr3KCIiUg8VQLFKBVBIkls3beVTlz7lOcfvwpnctWOX3SOJiEgdVADFKhVAg9hxj02Xy8VF6Yv4dNen/a7ynT5seovPYhLd79QsysMcysIMKoBilQqgQRwOR4t+v33f7mPG9Rl+xc8R7eCTVz7JT7d92qKzmKals5D6KQ9zKAszqACKVSqAYeyz7Z9xxgUz/Mpf9t3ZrKiosHs0ERGphwqgWKUCGOaWzl1KR7SDGb0yWLC4wO5xRESkAVQAxSoVQOGzjz/LnV/ttHsMERFpIBVAsUoF0CApKSmW38O7KHOi/6LMLqfL8nuHk6bIQpqO8jCHsjCDCqBYpQJokNLS0pP+2urbsk2Om+x3W7aJl03kzX1v5rQR05pw0tBnJQtpesrDHMrCDCqAYpUKYAgoKyvj2OFjWdCvgMUDi73bxj4buer0VVx0yiLe2OZG5s3Is3tUERFpAiqAYpUKYAhIG5NWq/ytO38dV5+6mvmR+cyPzOeiUxZxxE9G8Mcff7R7XBERsUgFUKxSATRIQUHjr8ItKSnh5LjJ3uK3+Webufonx4tf9bby9JVMuTjFe06g1O9kspDmozzMoSzMoAIoVqkAGiQvr/Ef0aYnpXvP+aveVp650q/8vdLxFW762SYWDihkelJ6M0week4mC2k+ysMcysIMKoBilQpgkEtNTPUrf8UDi/n2JW9zVZtVfKXNK1zbfa3fa6k3pdo9soiIWKQCKFapAAa5QEcAiwcW842eb3DjxRv9ntMRQBGR0KACKFapABqkvLy8UftXHK2odQ5gfdukuEk6B7CBGpuFNC/lYQ5lYQYVQLFKBdAgycnJDdrP5XbR8ZSDUy+dyn3f7Qt4FXDNraBfAdPGpDXzryB0NDQLaRnKwxzKwgwqgGKVCqBBGvIv629/+JaPJT5GR7SDjmgHM4dl8tDBQwHXAfQtf2OHj2VZWVkL/CpCg45ymEV5mENZmEEFMLSkAPgGwI8AlgPoXM++ZwB4FsBBAHsBTAfQ2uf1wQDcNbYfAryPCmAQefXtVzlx4ERv+XNEO+jo4mBxfrH3TiCT4ib53QlkUtwkpo1JU/kTEQkhKoChYySAwwBuANAfwBsACuvZfwGAjwBcDiABwG4AE31eHwxP6YsC0Klq6xjgfVQAg0RGVgand5vuV/5m9ZjFDYs2+O3nvRfwTf73AhYRkdChAhg63gMw2edxd3gKXP8A+54NwAnglz7PjQSwB0BE1ePBVV/fGvVTATRIfetrPZf+nP+Rv3gHSz/VPTmbi9Y6M4vyMIeyMIMKYGhoA6ASniN5vnYAGB1g/19V7e9b7n4KT+HrWfV4cNXjLwHsBLAMQO8A76UCaJD6Vth3uVx84vdPcHaX2Xxx9IusLK9swcnCj+52YBblYQ5lYQYVwNDQBZ6yFlvj+U0AHg6w/5/hOe/P1+lV73FV1eNe8BwV7AfgangK4F4A59b4OhXAILJ3314Wv1Bs9xgiImIzFcDQ0BwFsKZTAHwOYFyN51UADbP3x712jyAiIoZTAQwN9X0EfEeA/RvyEXAgLwHIqvHcmQA4ZMgQJicnMzk5mStWrGBycrLfpf55eXl+h/1LS0uZkpLi94fR4XCwqKjI+3j79u1MT/e/60R6ejq3b9/ufVxUVESHw+G3T0pKCktLj5/bVlBQ4HfOSXl5eUjOl5OTw3+k/4P3Xn0vX138qnHzmf7719TzVc9o6nzVwmW+J554wuj5TP/9a8r5tm7davR8pv/+WZmvoKCAo0eP5uWXX8577rlHBTBEbEHgi0D6Bdi3rotAvsfxi0Bqag3gM+gIoJEOVhzk32f8ndecfQ0d0Q7OvHAmd32xy+6xwlrN/wMQeykPcygLM+gIYOi4HcAhHF8G5nUcXwYmBsAn8Cz5Um0+gG04vgzMLgATfF6/D8AwAD0ADACwEMA+eJaF8aUCaLNNOzfxD3/9A7POy/K7ynfZX5bZPZqIiBhKBTC0+C4E/TI8a/cBQDcALgDX+OzbDp4SeAieYjcdQCuf1/8Jzzl/5QC+BbACwMUBvqcKoI0WFS/iyMEj/Yrf3Ji5XPvntTy275jd44mIiKFUAMUqFcBm4HQ6mZGTwYTEBMaPiGdCYgIzcjLodDr99vvkw084s/tMb/lb2G0hP5r+Ed2VbpsmFxGRYKACKFapADYhl8vFrNwsxg6NZeSoSGICvFvkqEjGDo1lVm4WXS6X92uWzFtCRxcHl126jNPvn27j9OKr5snbYi/lYQ5lYQYVQLFKBbCJuFwuXvW7q9h2ZFtP6UsCo+Ki2Du2N6PioogkTxFsO7Itrx5+tV8J3DpvKyu+qfC7ykzspSzMojzMoSzMoAIoVqkANpGs3CxP+RsPRg2K4rCYYczsnElHtIOZnTM5LGYYowZFEeM9JTB7TrbdI4uISJBSARSrVACbgNPpZOzQWGI82KN3D07tNNXvwo75Hecz78w8Tu00lRf0voAYD8ZeG1vrnEAREZGGUAEUq1QAm0BGTgYjR0UyalBUrfL3wlkvcHXkauZH5vO5s5/j1E5TGTUoipGjIpmRk+H3Pr6LiIq9lIVZlIc5lIUZVADFKhXAJpCQmEAkgcNihnmL35zOc/jS6S8xPzLfu62KXMU5nedwWMwwIglMSEzwe5+aK8uLfZSFWZSHOZSFGVQAxSoVwCYQPyKeUXFR3nP+FpyzgK+c+opf+VsduZrPd3jee05gVFwU40fE2z26iIgEIRVAsUoFsAkkJCawd2xv79G/pe2W+pW/lW1Wct658/w+Gu4V26vWEUAREZGGUAEUq1QAm0BGTga79O3iPQKYG5XLlW1WMj8yn0vaLWFuVK5f+cvsnMkufbvUOgdQRESkIVQAxSoVwCbgdDrZ65pefucAzu843/uRb81tWMww9rqmV62rgHVujTmUhVmUhzmUhRlUAMUqFcCTdPjoYX6y5xPv46zcLMb0ial1FXDNbWqnqYzpExNwHUBdXWcOZWEW5WEOZWEGFUCxSgXwJGz9dit/9cCvOGXQFO4t3UvScyeQK357BXt27VlnCZzaaSp7du3JK4dd6XcnEBERkcZQARSrVAAbwe120/GOgzdefyNndZlFR7SDGddleMucy+XitOxp7Nu1L6/reJ3fnUCu63gd+3bty2nZ01T+RETEEhVAsUoFsIEOVhzkKMcoPjDgAb+jes//9HnuXrvbb1+n08nHpjzGy3pdxvjz43lZr8v42JTHTnjnD91j0xzKwizKwxzKwgwqgGKVCmADOF1O3jjmRmb8NMOv/C3rs4y7n9tNt8v9/9u7/+Co6zuP4y8lCFWPFqxQfuhZzhZ/VIxHITN31Ul/iJ4wQxsHBf+4oXPjDXe9KNCppEdpcgnpLVSBAFcXLSJ0CDBqCwywKWFKPLSKCOc53uHZyhngjNcDFBpACZv3/fHdJLvLEjf7/W6+n2yej5nvmP3mm28+w2s/+OK73x+B/J5oNBrIfuAfWbiFPNxBFm6gAMIvCmCW1i5d21n8fj7657b7nt125u0zYQ8LANAPUQDhFwUwS/F43JZ8Z4ltuGGDvfnjN+3C2QthDwkA0E9RAOEXBbAHPjr5kR3fczzsYQAA+jkKIPyiACZpb2+3l99+ObTfX1FREdrvRiqycAt5uIMs3EABhF8UwITjZ47b7IWz7fEvPm67N+4OZQwtLS2h/F5cjCzcQh7uIAs3UADhFwXQzPa+s9dmT5ndeZHHihtX2NHDR8MeFgAAGVEA4Ve/LoDx9rgt3bjUKm+tTLm9y5oxa+yVOu51BQBwEwUQfvWLAtjc3GyRORGrfLDSInMi1tzcbGZmi5YsspVjVqaUv/Xj1tvhFw5be3sw9/briYaGhl7/nciMLNxCHu4gCzdQAOFXQRfA1tZWqy2vtZqSGmsqbrL9E/ZbU3GTVZdUW215rR08cNCWj/Ue17Z61Gp77t7n7ExzePf227RpU2i/G6nIwi3k4Q6ycAMFEH4VbAFsbW21edPmWcP4Bts/Yf9FS8P4Bps3bZ5teHKDrbluje2t2Wvx8zyjFwDgPgog/CrYAlhbXnvJ8pdcAmvLa+3k706GPVwAALJGAYRfBVkAm5ubraakprPo7blpj+0r3pexBFaXVHeeExi2c+fOhT0EJJCFW8jDHWThBgog/CrIAhiZE+k852/76O2244odtnPYzowFsKm4ySJzImEP2czM5s6dG/YQkEAWbiEPd5CFGyiA8KsgC2Dlg5X229t/a1s/t9ViA2OdS+P1jRlLYOWMyrCHbGb8y9olZOEW8nAHWbiBAgi/CrIAzr5/tm0avCml/MUGxmzXiF1OHwEEACAbFED4VXAFsHFPo1WOrLTyovKu8jcoZi+OfdH5cwABAMgGBRB+FVwBbGtrs8jdEZt55UyrL6q32NUxe/Urr3Z7FbAruL+WO8jCLeThDrJwAwUQfhVcATQzO3rkqC0et9hmjJ1hDbd1fx/A1tbWsIfbiTvsu4Ms3EIe7iALN1AA4VdBFkAzszMnz3Q+CaS6pDrjk0BcKn8AAGSLAgi/+mwBfOfYO3Zg34Gstu18FvCM1GcBAwDQF1EA4VefLIDP73zeam6rseW3LLcTH5wIeziBaWlpCXsISCALt5CHO8jCDRRA+NWnCuDZ82etZmGNrbhuhUVHRi06MmrLpyy3eLwwnuFbUVER9hCQQBZuIQ93kIUbKIDwq88UwENHDtn8++Z3Fr+O5ZlvPGNnT54Ne3gAAPQaCiD86hMF8NTZU1Z1R1VK8Xtq9FO29bGtFj9fGEf/AADIFgUQfvWJAmhm9uxPn+0qf+Oesre2vxX2kAAACAUFEH71mQIYj8dt8f2Lbe3ktXb62Omwh5MX0Wg07CEggSzcQh7uIAs3UADhV58pgGZmn5z5xOJthfuR7yuvvBL2EJBAFm4hD3eQhRsogPDLqQJ4+uPTtmXLlrCHAQCA0yiA8MuZAvjGu2/YY3c/ZtGRUdu9eXfYwwEAwFkUQPjVqwWw84kcD3Y9kaO9vd3WPLfGFt28qPMij5U3rrRj7x7rlTG55NChQ2EPAQlk4RbycAdZuIECCL96pQB2PJO3pqQm5Zm8lRMrbWrxVHti1BMpt3h5+pan7d2X3s3rmFwUiUTCHgISyMIt5OEOsnADBRB+5b0Atra22rxp86xhfIPtn7A/Zdn6+a1WX1RvZYPKrG5EnUVHRm39lPV2puVM3sYDAEBfRwGEX3kvgLXltRnL3/4J++2lW1+yHVfssPqienvoqodsV/Uua7/QnrexAABQCCiA8CuvBbC5udlqSmoylr+OpfGGRosNjtmCmxdYc3NzXsYBAEAhoQDCr7wWwMicSOc5f90tr93xmjUVN1lkTv8+t4Rza9xBFm4hD3eQhRsogPArrwWw8sFK2z9hv/167K9tX/G+Ty2ClTMq8zKOvoKr69xBFm4hD3eQhRsogPArrwWw6u+rbOOwjbZz4E7bOWxnt+WPI4AAAGSHAgi/8lYA9x7Ya48UP2LlReUWGxiz2MCYNV7feMkCWF1SzTmAAABkgQIIvwIvgPH2uK1atcqeGOvd22/mlTOtvqjeYlfEbM/1ezKWv4bxDVZbXhvYGPoqnrHpDrJwC3m4gyzcQAGEX4EXwI31G1Nu6lw3os7KPltm27+0/ZLlb960edba2hrYGPqqaDQa9hCQQBZuIQ93kIUbKIDwK/AC2NbWZpG7IxYdGbXVo1bbhr/eYB9+8KHVltdadUl1ypNAqkuqrba8lvIHAEAPUADhV17OATzSfMRW3LHC9q7Za+3tXTd27nwW8IyuZwEDAICeoQDCr7xdBBI/Hw98nwAAgAII/3IugI2NjbZv9748vK37r4qKirCHgASycAt5uIMs3EABhF89LoDnL5y3uoV1tmrMKqu7pc5OfHAij2/x/qWlpSXsISCBLNxCHu4gCzdQAOFXjwrge0fes0WTF6Vc5bts6jKLx/m4FwCA3kIBhF9ZF8CdW3ba4zc9nlL+Vo9ebRvnb7R4GwUQAIDeQgGEX1kVwGPvH7O6G+pSyt+qm1fZ67HXe+mt3j80NDSEPQQkkIVbyMMdZOEGCiD8yvoI4LqfrussfyvvW2kn3z/ZC2/x/mXTpk1hDwEJZOEW8nAHWbiBAgi/si6A8Xjclj6w1DbXbLb4BT7yBQAgLBRA+DVEkt1Zdqcte3KZtbW1dfuGS76pMwAACAcFsLBUSHpf0hlJWyWN6GbbqyWtlXRK0nFJSyUNSNtmiqT/lHRO0uuSSjLsZ4gkGz5huBVNL7KJX5toC8oWcFVvSM6dOxf2EJBAFm4hD3eQhRsogIXju5L+KOnbkm6XtEdSUzfbr5P0H5ImSvq6pP+R9E9J379J0ieSfpj4uk7SCUnD0vYzRJJFro3YA9c8YNOvnm51Q+ts2qRplMAQzJ07N+whIIEs3EIe7iALN1AAC8dBSTVJr78oqV1eGUw3TFKbpG8mrfuupP+TdFni9VJJe9N+7j1Jj6atGyLJ1l29zmIDY1ZfVG9lg8qsdnitLfnnJWG/v/udbdu2hT0EJJCFW8jDHWThBgpgYRgk6YK8I3nJDkv62wzbfyuxffJHvn8qrzB+KfH6JaUeEZSkZyTVp60bIsmeL3reYgNjnSXwrjF32fi7x3/qOYEIFv+ydgdZuIU83EEWbqAAFoZR8srbrWnr90lakGH7h+Sd95fsysQ+/jLx+r8kfS9tmyWSdqetSymAO67YYeuvWW9TRk+xoulFtuzJZWG/x/sV/mJ1B1m4hTzcQRZuoAAWhtAL4PoB661+cL2tvHalLRuxzCLXRmz4hOF2Z9mddurUKZZeWiZPnhz6GFjIwsWFPNxZyMKN5ejRoxTAAtDdR8APZ9g+m4+A90qqTvu5tZI2pK0bLe8NxMLCwsLCwtL3ltFCn3ZAmS8CGZ9h20tdBPIHdV0E8oQyXwTySNq6y+S9eYawsLCwsLCw9KlltLr+v48+apak0+q6Dcxv1HUbmNGS3pZ3y5cOz0p6S123gTkmqSrp++MkfSzv3oI3S1ou72PjoXkZPQAAAHKSfCPoLZKGJ9bfICku6a6kba+SVwJPy7u/31JJl6ftr+NG0B/LuxH0pPwMGwAAAAAAAECvCuORcsgsyCxK5Z0XmrycDHzEhasnWfxI0mvyjp6nn0vbgXnhT5B5lIq54Ue2WQyV9C+SfifprKTfy8vmUp8+MTd6LsgsSsW86FfCeqQcLhZ0FqXyJvAX5J0eMFzS5wMec6HqaRaVkv5BXib/muH7zAt/gs6jVMyNXPUki1slbZZ0r7wLFadK+l9JC5O2YW7kLugsSsW86FcOKpxHyuFiQWdRmvj59CO0+HQ9ySJZlTIfcWJe+BN0HqVibuQq1yw6VMi7i0UH5kbugs6iVMyLfiPMR8ohVT6yKE28/m9JRyX9St7V3uheT7NIVqXMhYN5kbt85FEq5kYu/GTR4SeSdiW9Zm7kJh9ZlIp50W+E+UQRpMpHFl+Wd1RwvKSvyZvMxyVdG8yQC1ZPs0hWpcyFg3mRu3zkwdzIjZ8sJGmspI8kPZC0jrmRm3xkwbzoRyiA7shHFumK5J34+/3ch9kvUADdko880jE3suMni+Hy7k/7s7T1zI3c5COLdMyLAhbmI+WQKh9ZZPJLSStzH2a/0NMsklUpc+FgXuQuH3lkwtz4dLlmcY2kNyWtz/A95kZu8pFFJsyLAhbWI+VwsaCzSDdA0jviX3PZ6EkWyaqUuXAwL/wJOo90zI3s9TSLofIuVnhBF9/+RWJu+BF0FumYFwVulniknCtmKdgsHpV3f60/k1Qs71/UJ+Rd4o/uzVLPsrhe3p9xVN5fsLcnXndgXvgzS8HmwdzI3Sxln8UQefdjfFXSdfL+fL+g1HPKmBu5m6Vgs2Be9EM8Us4dQWbxA3nnb5yT9IGkbZK+kreRF56eZPGsum6cGk/6bzLmhT9B5sHc8CfbLEqVmkHHcjhtf8yN3AWZBfMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyOxySfVp6z4j6WFJByWN7PURAQAAIK++LulHaev+RtK/SfpY0pW9PiIAAADk1dOSxmZYv1DSnl4eCwAAAPJskKTYJb7XJOkfe28oAAAA6A33S/pehvWfkXRO0ld7dzgAAADI1VBJKyRVS1os6Q5J2yRdlrbdZknXZPj5b0k6nvh6sKT58o4I7srDWAEAAODTZyW9Iak8ad0+SS+mbfc5Sb+8xD5+Iq8cDpVX/q6Sd65gY6AjBQAAQCB+Jq8AJntZ0qK0dQ9LmnmJfbwq6RlJcyQNCHR0AAAACNQwebdueSxp3VWSPpF0T9q22+Wd65fuTyS1ySuNDZK+083vmyDvKGKLpB/KO1pYI+nwp/wcAAAAAnKfpHalXrxxj6QL8opdh+skrb/EPqZKOpH4ulheGZyUeF2UYfsfyzvqmOzbkkqyHjUAAAByViavACYf2YvIe6JHsvmS7r3EPpZJ+lXS6z/IK5aSVJVh+0Z1fZQ8NPHfv5I0KqsRAwAAwJdR8m7fMjzxepKkP8q7IjhZo7xHwGXy7/LO/etwXNI4Sd+QdFfatgMknZY0JvH6BzmNGgAAAL7MlLRO3pM8HpV0XtL0pO+P18WFsMPlko5IujFp3SOSopK+n2H7r0r6UN4RxV9IWutn4AAAAPDvL+R9JDwyad1idZ3T59dcSfWJrwfLu7IYAAAAIXpU0u+TXl8m6TcB7v8FSX+X+HqApCEB7hsAAAA52CTv4+AOpcp8IUeuWiTdFuD+AAAAkKM/l/fotzZJ76nrJtBPK/X8vlxNkvSkpLi8q4wnBrBPAAAA5MGmsAcAAAAAAAAAAAAAAAAAAAAAAD31/2gb4KiGT4OTAAAAAElFTkSuQmCC\">"
],
"metadata": {},
"output_type": "display_data",
"text": [
"<IPython.core.display.HTML at 0xb8bdb10>"
]
}
],
"prompt_number": 55
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment