Created
September 6, 2015 12:07
-
-
Save nebw/5504697c118744677c2d to your computer and use it in GitHub Desktop.
Popularity scoring for arXiv publications
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Popularity scoring for arXiv publications" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"**TLDR: I combined recent arXiv machine learning publications with Mendeley reader data to get a kind of popularity scoring similar to Hacker News or Reddit for publications. It works, but there are apparently not enough Mendeley users for actually useful results. Skip to the end of the notebook if you just want to see the results.**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"I had this idea of using some kind of popularity metric to keep up to date with recent publications without much manual effort. This weekend I hacked together a proof of concept implementation. There are a number of possible metrics that could be used for such a scoring:\n", | |
"\n", | |
"* arXiv page view / download statistics: Unfortunately, arXiv doesn't provide these (see their [FAQ](http://arxiv.org/help/faq/statfaq) on the subject).\n", | |
"* citations: Citations have a significant delay. Furthermore, to the best of my knowledge, there's no decent public API to get this kind of data. Google scholar has good results, but their API specifically forbids scraping their services. Microsoft Academic Search apparently provides an API on request, but they never replied when I asked for one several months ago.\n", | |
"* crowd sourcing: This is a) out of scoop for this proof of concept and b) would most likely just result in a bad clone of Reddit's MachineLearning subreddit or Hacker News.\n", | |
"* third party metrics: I finally settled for Mendeley reader stats. They have a good API and provide access to their statistics data. Unfortunately, there are apparently not enough Mendeley users (at least in the Machine Learning community) for really meaningful results. ** I would love to get suggestions for better data sources. **" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 143, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"import feedparser\n", | |
"import matplotlib.pyplot as plt\n", | |
"import mendeley\n", | |
"import os.path\n", | |
"import pandas as pd\n", | |
"import pickle\n", | |
"import urllib\n", | |
"import time\n", | |
"\n", | |
"from datetime import datetime, timedelta, date\n", | |
"from dateutil.parser import parse\n", | |
"from dateutil.tz import tzlocal\n", | |
"from IPython.display import HTML\n", | |
"from IPython.display import clear_output\n", | |
"from ipy_progressbar import ProgressBar\n", | |
"from itertools import tee\n", | |
"from mendeley import Mendeley\n", | |
"from pytz import timezone\n", | |
"\n", | |
"%matplotlib notebook" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 144, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"# adapted from: http://stackoverflow.com/a/1060330\n", | |
"def period_range(start_date, end_date, period=1):\n", | |
" for n in range(int ((end_date - start_date).days / period)):\n", | |
" yield start_date + timedelta(n)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Recent arXiv publications" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 145, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"# see http://arxiv.org/help/api/user-manual#subject_classifications for categories\n", | |
"arxiv_categories = ['stat.ML', 'cs.NE', 'cs.AI']\n", | |
"\n", | |
"search_term = '+OR+'.join(['cat:{}'.format(category) for category in arxiv_categories])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 146, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"arxiv_base_url = 'http://export.arxiv.org/api/query?';\n", | |
"search_query = '{}&sortBy=lastUpdatedDate&sortOrder=descending'.format(search_term)\n", | |
"\n", | |
"start = 0\n", | |
"total_results = 100000\n", | |
"results_per_iteration = 1000\n", | |
"begin_year = 2014\n", | |
"wait_time = 3\n", | |
"\n", | |
"arxiv_file_name = 'arxiv-publications.pickle'" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 147, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Searching arXiv for cat:stat.ML+OR+cat:cs.NE+OR+cat:cs.AI&sortBy=lastUpdatedDate&sortOrder=descending\n", | |
"Parsing results 0 - 1000\n", | |
"Sleeping for 3 seconds\n", | |
"Parsing results 1000 - 2000\n", | |
"Sleeping for 3 seconds\n", | |
"Parsing results 2000 - 3000\n", | |
"Sleeping for 3 seconds\n", | |
"Parsing results 3000 - 4000\n", | |
"Sleeping for 3 seconds\n", | |
"Parsing results 4000 - 5000\n", | |
"No more entries\n" | |
] | |
} | |
], | |
"source": [ | |
"if (os.path.isfile(arxiv_file_name)):\n", | |
" with open(arxiv_file_name, 'rb') as f:\n", | |
" entries = pickle.load(f)\n", | |
"else:\n", | |
" print('Searching arXiv for %s' % search_query)\n", | |
"\n", | |
" entries = []\n", | |
" for i in range(start,total_results,results_per_iteration): \n", | |
" print(\"Parsing results %i - %i\" % (i,i+results_per_iteration))\n", | |
"\n", | |
" query = 'search_query=%s&start=%i&max_results=%i' % (search_query, i, results_per_iteration)\n", | |
" response = urllib.request.urlopen(arxiv_base_url + query).read()\n", | |
" feed = feedparser.parse(response)\n", | |
"\n", | |
" if len(feed.entries) == 0:\n", | |
" print('No more entries')\n", | |
" break\n", | |
"\n", | |
" done = False\n", | |
" for entry in feed.entries: \n", | |
" dt_updated = parse(entry.updated)\n", | |
" if (dt_updated.year < begin_year):\n", | |
" done = True\n", | |
" break\n", | |
"\n", | |
" dt_published = parse(entry.published)\n", | |
" if (dt_published.year >= begin_year):\n", | |
" entries.append(entry)\n", | |
"\n", | |
" if done:\n", | |
" print('No more entries for selected date range')\n", | |
" break\n", | |
"\n", | |
" print('Sleeping for %i seconds' % wait_time)\n", | |
" time.sleep(wait_time)\n", | |
" \n", | |
" with open(arxiv_file_name, 'wb') as f:\n", | |
" pickle.dump(entries, f, pickle.HIGHEST_PROTOCOL)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 148, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/javascript": [ | |
"/* Put everything inside the global mpl namespace */\n", | |
"window.mpl = {};\n", | |
"\n", | |
"mpl.get_websocket_type = function() {\n", | |
" if (typeof(WebSocket) !== 'undefined') {\n", | |
" return WebSocket;\n", | |
" } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
" return MozWebSocket;\n", | |
" } else {\n", | |
" alert('Your browser does not have WebSocket support.' +\n", | |
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
" 'Firefox 4 and 5 are also supported but you ' +\n", | |
" 'have to enable WebSockets in about:config.');\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
" this.id = figure_id;\n", | |
"\n", | |
" this.ws = websocket;\n", | |
"\n", | |
" this.supports_binary = (this.ws.binaryType != undefined);\n", | |
"\n", | |
" if (!this.supports_binary) {\n", | |
" var warnings = document.getElementById(\"mpl-warnings\");\n", | |
" if (warnings) {\n", | |
" warnings.style.display = 'block';\n", | |
" warnings.textContent = (\n", | |
" \"This browser does not support binary websocket messages. \" +\n", | |
" \"Performance may be slow.\");\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.imageObj = new Image();\n", | |
"\n", | |
" this.context = undefined;\n", | |
" this.message = undefined;\n", | |
" this.canvas = undefined;\n", | |
" this.rubberband_canvas = undefined;\n", | |
" this.rubberband_context = undefined;\n", | |
" this.format_dropdown = undefined;\n", | |
"\n", | |
" this.image_mode = 'full';\n", | |
"\n", | |
" this.root = $('<div/>');\n", | |
" this._root_extra_style(this.root)\n", | |
" this.root.attr('style', 'display: inline-block');\n", | |
"\n", | |
" $(parent_element).append(this.root);\n", | |
"\n", | |
" this._init_header(this);\n", | |
" this._init_canvas(this);\n", | |
" this._init_toolbar(this);\n", | |
"\n", | |
" var fig = this;\n", | |
"\n", | |
" this.waiting = false;\n", | |
"\n", | |
" this.ws.onopen = function () {\n", | |
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
" fig.send_message(\"send_image_mode\", {});\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" }\n", | |
"\n", | |
" this.imageObj.onload = function() {\n", | |
" if (fig.image_mode == 'full') {\n", | |
" // Full images could contain transparency (where diff images\n", | |
" // almost always do), so we need to clear the canvas so that\n", | |
" // there is no ghosting.\n", | |
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
" }\n", | |
" fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
" 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", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_canvas = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var canvas_div = $('<div/>');\n", | |
"\n", | |
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
"\n", | |
" function canvas_keyboard_event(event) {\n", | |
" return fig.key_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
" canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
" this.canvas_div = canvas_div\n", | |
" this._canvas_extra_style(canvas_div)\n", | |
" this.root.append(canvas_div);\n", | |
"\n", | |
" var canvas = $('<canvas/>');\n", | |
" canvas.addClass('mpl-canvas');\n", | |
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
"\n", | |
" this.canvas = canvas[0];\n", | |
" this.context = canvas[0].getContext(\"2d\");\n", | |
"\n", | |
" var rubberband = $('<canvas/>');\n", | |
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
"\n", | |
" var pass_mouse_events = true;\n", | |
"\n", | |
" canvas_div.resizable({\n", | |
" start: function(event, ui) {\n", | |
" pass_mouse_events = false;\n", | |
" },\n", | |
" resize: function(event, ui) {\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" stop: function(event, ui) {\n", | |
" pass_mouse_events = true;\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" });\n", | |
"\n", | |
" function mouse_event_fn(event) {\n", | |
" if (pass_mouse_events)\n", | |
" return fig.mouse_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" rubberband.mousedown('button_press', mouse_event_fn);\n", | |
" rubberband.mouseup('button_release', mouse_event_fn);\n", | |
" // Throttle sequential mouse events to 1 every 20ms.\n", | |
" rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
"\n", | |
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
"\n", | |
" canvas_div.on(\"wheel\", function (event) {\n", | |
" event = event.originalEvent;\n", | |
" event['data'] = 'scroll'\n", | |
" if (event.deltaY < 0) {\n", | |
" event.step = 1;\n", | |
" } else {\n", | |
" event.step = -1;\n", | |
" }\n", | |
" mouse_event_fn(event);\n", | |
" });\n", | |
"\n", | |
" canvas_div.append(canvas);\n", | |
" canvas_div.append(rubberband);\n", | |
"\n", | |
" this.rubberband = rubberband;\n", | |
" this.rubberband_canvas = rubberband[0];\n", | |
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
" this.rubberband_context.strokeStyle = \"#000000\";\n", | |
"\n", | |
" this._resize_canvas = function(width, height) {\n", | |
" // Keep the size of the canvas, canvas container, and rubber band\n", | |
" // canvas in synch.\n", | |
" canvas_div.css('width', width)\n", | |
" canvas_div.css('height', height)\n", | |
"\n", | |
" canvas.attr('width', width);\n", | |
" canvas.attr('height', height);\n", | |
"\n", | |
" rubberband.attr('width', width);\n", | |
" rubberband.attr('height', height);\n", | |
" }\n", | |
"\n", | |
" // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
" // upon first draw.\n", | |
" this._resize_canvas(600, 600);\n", | |
"\n", | |
" // Disable right mouse context menu.\n", | |
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
" return false;\n", | |
" });\n", | |
"\n", | |
" function set_focus () {\n", | |
" canvas.focus();\n", | |
" canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" window.setTimeout(set_focus, 100);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items) {\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) {\n", | |
" // put a spacer in here.\n", | |
" continue;\n", | |
" }\n", | |
" var button = $('<button/>');\n", | |
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
" 'ui-button-icon-only');\n", | |
" button.attr('role', 'button');\n", | |
" button.attr('aria-disabled', 'false');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
"\n", | |
" var icon_img = $('<span/>');\n", | |
" icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
" icon_img.addClass(image);\n", | |
" icon_img.addClass('ui-corner-all');\n", | |
"\n", | |
" var tooltip_span = $('<span/>');\n", | |
" tooltip_span.addClass('ui-button-text');\n", | |
" tooltip_span.html(tooltip);\n", | |
"\n", | |
" button.append(icon_img);\n", | |
" button.append(tooltip_span);\n", | |
"\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" var fmt_picker_span = $('<span/>');\n", | |
"\n", | |
" var fmt_picker = $('<select/>');\n", | |
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
" fmt_picker_span.append(fmt_picker);\n", | |
" nav_element.append(fmt_picker_span);\n", | |
" this.format_dropdown = fmt_picker[0];\n", | |
"\n", | |
" for (var ind in mpl.extensions) {\n", | |
" var fmt = mpl.extensions[ind];\n", | |
" var option = $(\n", | |
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
" fmt_picker.append(option)\n", | |
" }\n", | |
"\n", | |
" // Add hover states to the ui-buttons\n", | |
" $( \".ui-button\" ).hover(\n", | |
" function() { $(this).addClass(\"ui-state-hover\");},\n", | |
" function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
" );\n", | |
"\n", | |
" var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
" // which will in turn request a refresh of the image.\n", | |
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_message = function(type, properties) {\n", | |
" properties['type'] = type;\n", | |
" properties['figure_id'] = this.id;\n", | |
" this.ws.send(JSON.stringify(properties));\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_draw_message = function() {\n", | |
" if (!this.waiting) {\n", | |
" this.waiting = true;\n", | |
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" var format_dropdown = fig.format_dropdown;\n", | |
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
" fig.ondownload(fig, format);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
" var size = msg['size'];\n", | |
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
" fig._resize_canvas(size[0], size[1]);\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
" var x0 = msg['x0'];\n", | |
" var y0 = fig.canvas.height - msg['y0'];\n", | |
" var x1 = msg['x1'];\n", | |
" var y1 = fig.canvas.height - msg['y1'];\n", | |
" x0 = Math.floor(x0) + 0.5;\n", | |
" y0 = Math.floor(y0) + 0.5;\n", | |
" x1 = Math.floor(x1) + 0.5;\n", | |
" y1 = Math.floor(y1) + 0.5;\n", | |
" var min_x = Math.min(x0, x1);\n", | |
" var min_y = Math.min(y0, y1);\n", | |
" var width = Math.abs(x1 - x0);\n", | |
" var height = Math.abs(y1 - y0);\n", | |
"\n", | |
" fig.rubberband_context.clearRect(\n", | |
" 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
"\n", | |
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
" // Updates the figure title.\n", | |
" fig.header.textContent = msg['label'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
" var cursor = msg['cursor'];\n", | |
" switch(cursor)\n", | |
" {\n", | |
" case 0:\n", | |
" cursor = 'pointer';\n", | |
" break;\n", | |
" case 1:\n", | |
" cursor = 'default';\n", | |
" break;\n", | |
" case 2:\n", | |
" cursor = 'crosshair';\n", | |
" break;\n", | |
" case 3:\n", | |
" cursor = 'move';\n", | |
" break;\n", | |
" }\n", | |
" fig.rubberband_canvas.style.cursor = cursor;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
" fig.message.textContent = msg['message'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
" // Request the server to send over a new figure.\n", | |
" fig.send_draw_message();\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
" fig.image_mode = msg['mode'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Called whenever the canvas gets updated.\n", | |
" this.send_message(\"ack\", {});\n", | |
"}\n", | |
"\n", | |
"// A function to construct a web socket function for onmessage handling.\n", | |
"// Called in the figure constructor.\n", | |
"mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
" return function socket_on_message(evt) {\n", | |
" if (evt.data instanceof Blob) {\n", | |
" /* FIXME: We get \"Resource interpreted as Image but\n", | |
" * transferred with MIME type text/plain:\" errors on\n", | |
" * Chrome. But how to set the MIME type? It doesn't seem\n", | |
" * to be part of the websocket stream */\n", | |
" evt.data.type = \"image/png\";\n", | |
"\n", | |
" /* Free the memory for the previous frames */\n", | |
" if (fig.imageObj.src) {\n", | |
" (window.URL || window.webkitURL).revokeObjectURL(\n", | |
" fig.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
" evt.data);\n", | |
" fig.updated_canvas_event();\n", | |
" 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 (name === 'button_press')\n", | |
" {\n", | |
" this.canvas.focus();\n", | |
" this.canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" var x = canvas_pos.x;\n", | |
" var y = canvas_pos.y;\n", | |
"\n", | |
" this.send_message(name, {x: x, y: y, button: event.button,\n", | |
" step: event.step});\n", | |
"\n", | |
" /* This prevents the web browser from automatically changing to\n", | |
" * the text insertion cursor when the button is pressed. We want\n", | |
" * to control all of the cursor setting manually through the\n", | |
" * 'cursor' event from matplotlib */\n", | |
" event.preventDefault();\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" // Handle any extra behaviour associated with a key event\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.key_event = function(event, name) {\n", | |
"\n", | |
" // Prevent repeat events\n", | |
" if (name == 'key_press')\n", | |
" {\n", | |
" if (event.which === this._key)\n", | |
" return;\n", | |
" else\n", | |
" this._key = event.which;\n", | |
" }\n", | |
" if (name == 'key_release')\n", | |
" this._key = null;\n", | |
"\n", | |
" var value = '';\n", | |
" if (event.ctrlKey && event.which != 17)\n", | |
" value += \"ctrl+\";\n", | |
" if (event.altKey && event.which != 18)\n", | |
" value += \"alt+\";\n", | |
" if (event.shiftKey && event.which != 16)\n", | |
" value += \"shift+\";\n", | |
"\n", | |
" value += 'k';\n", | |
" value += event.which.toString();\n", | |
"\n", | |
" this._key_event_extra(event, name);\n", | |
"\n", | |
" this.send_message(name, {key: value});\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
" if (name == 'download') {\n", | |
" this.handle_save(this, null);\n", | |
" } else {\n", | |
" this.send_message(\"toolbar_button\", {name: name});\n", | |
" }\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
" this.message.textContent = tooltip;\n", | |
"};\n", | |
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
"\n", | |
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", | |
"\n", | |
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
" // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
" // object with the appropriate methods. Currently this is a non binary\n", | |
" // socket, so there is still some room for performance tuning.\n", | |
" var ws = {};\n", | |
"\n", | |
" ws.close = function() {\n", | |
" comm.close()\n", | |
" };\n", | |
" ws.send = function(m) {\n", | |
" //console.log('sending', m);\n", | |
" comm.send(m);\n", | |
" };\n", | |
" // Register the callback with on_msg.\n", | |
" comm.on_msg(function(msg) {\n", | |
" //console.log('receiving', msg['content']['data'], msg);\n", | |
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
" ws.onmessage(msg['content']['data'])\n", | |
" });\n", | |
" return ws;\n", | |
"}\n", | |
"\n", | |
"mpl.mpl_figure_comm = function(comm, msg) {\n", | |
" // This is the function which gets called when the mpl process\n", | |
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
"\n", | |
" var id = msg.content.data.id;\n", | |
" // Get hold of the div created by the display call when the Comm\n", | |
" // socket was opened in Python.\n", | |
" var element = $(\"#\" + id);\n", | |
" var ws_proxy = comm_websocket_adapter(comm)\n", | |
"\n", | |
" function ondownload(figure, format) {\n", | |
" window.open(figure.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" var fig = new mpl.figure(id, ws_proxy,\n", | |
" ondownload,\n", | |
" element.get(0));\n", | |
"\n", | |
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
" // web socket which is closed, not our websocket->open comm proxy.\n", | |
" ws_proxy.onopen();\n", | |
"\n", | |
" fig.parent_element = element.get(0);\n", | |
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
" if (!fig.cell_info) {\n", | |
" console.error(\"Failed to find cell for figure\", id, fig);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var output_index = fig.cell_info[2]\n", | |
" var cell = fig.cell_info[0];\n", | |
"\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
" // 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", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
" // this is important to make the div 'focusable\n", | |
" el.attr('tabindex', 0)\n", | |
" // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
" // off when our div gets focus\n", | |
"\n", | |
" // location in version 3\n", | |
" if (IPython.notebook.keyboard_manager) {\n", | |
" IPython.notebook.keyboard_manager.register_events(el);\n", | |
" }\n", | |
" else {\n", | |
" // location in version 2\n", | |
" IPython.keyboard_manager.register_events(el);\n", | |
" }\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" var manager = IPython.notebook.keyboard_manager;\n", | |
" if (!manager)\n", | |
" manager = IPython.keyboard_manager;\n", | |
"\n", | |
" // Check for shift+enter\n", | |
" if (event.shiftKey && event.which == 13) {\n", | |
" this.canvas_div.blur();\n", | |
" event.shiftKey = false;\n", | |
" // Send a \"J\" for go to next cell\n", | |
" event.which = 74;\n", | |
" event.keyCode = 74;\n", | |
" manager.command_mode();\n", | |
" manager.handle_keydown(event);\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" fig.ondownload(fig, null);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.find_output_cell = function(html_output) {\n", | |
" // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
" // IPython event is triggered only after the cells have been serialised, which for\n", | |
" // our purposes (turning an active figure into a static one), is too late.\n", | |
" var cells = IPython.notebook.get_cells();\n", | |
" var ncells = cells.length;\n", | |
" for (var i=0; i<ncells; i++) {\n", | |
" var cell = cells[i];\n", | |
" if (cell.cell_type === 'code'){\n", | |
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
" var data = cell.output_area.outputs[j];\n", | |
" if (data.data) {\n", | |
" // IPython >= 3 moved mimebundle to data attribute of output\n", | |
" data = data.data;\n", | |
" }\n", | |
" if (data['text/html'] == html_output) {\n", | |
" return [cell, data, j];\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"// Register the function which deals with the matplotlib target/channel.\n", | |
"// The kernel may be null if the page has been refreshed.\n", | |
"if (IPython.notebook.kernel != null) {\n", | |
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
"}\n" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<img src=\"data:image/png;base64,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\">" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(figsize=(12, 8))\n", | |
"\n", | |
"df = pd.DataFrame([parse(entry['published']).date() for entry in entries], columns=['date'])\n", | |
"df.date = df.date.astype(\"datetime64\")\n", | |
"_ = df.groupby([df.date.dt.year, df.date.dt.month]).count().plot(kind=\"bar\", ax=ax, title='Publications by month')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Match with Mendeley data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 149, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"# if you want to run this for yourself, you have to get an API key from mendeley\n", | |
"# http://dev.mendeley.com/\n", | |
"client_id = 'redacted'\n", | |
"client_key = 'redacted'\n", | |
"client_uri = 'redacted'\n", | |
"\n", | |
"matched_file_name = 'matched_publications.pickle'\n", | |
" \n", | |
"mendeley = Mendeley(client_id, client_secret=client_key, redirect_uri=client_uri)\n", | |
"auth = mendeley.start_client_credentials_flow()\n", | |
"session = auth.authenticate()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 150, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Matched 1840 out of 3684 articles (49.9%)\n" | |
] | |
} | |
], | |
"source": [ | |
"if (os.path.isfile(matched_file_name)):\n", | |
" with open(matched_file_name, 'rb') as f:\n", | |
" matched_entries = pickle.load(f)\n", | |
"else:\n", | |
" matched_entries = []\n", | |
"\n", | |
" progress = ProgressBar(entries)\n", | |
" for entry in progress:\n", | |
" # try to match with the last updated arXiv version. If there's no match, try with the next oldest one\n", | |
" arxiv_id = 'arXiv:{}'.format(str(entry.id).split('/')[-1])\n", | |
" base_id, last_version = arxiv_id.rsplit('v', 1)\n", | |
" for version in range(int(last_version), 0, -1):\n", | |
" current_id = '{}v{}'.format(base_id, version)\n", | |
" try:\n", | |
" document = session.catalog.by_identifier(arxiv=current_id, view='stats')\n", | |
" matched_entries.append((entry, document))\n", | |
" break\n", | |
" except Exception:\n", | |
" pass\n", | |
"\n", | |
" clear_output()\n", | |
"\n", | |
" print('Matched {0} out of {1} articles ({2:.1f}%)'.format(len(matched_entries), \\\n", | |
" len(entries), \\\n", | |
" 100 * len(matched_entries) / len(entries)))\n", | |
" \n", | |
" with open(matched_file_name, 'wb') as f:\n", | |
" pickle.dump(entries, f, pickle.HIGHEST_PROTOCOL)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 151, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"data = pd.DataFrame([(ent.published, \\\n", | |
" ent.title, \\\n", | |
" ent.authors, \\\n", | |
" doc.reader_count, \\\n", | |
" ent.link, \\\n", | |
" doc.link) for ent, doc in matched_entries], \\\n", | |
" columns=['Date', 'Title', 'Authors', 'Readers', 'arXiv', 'Mendeley'])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 152, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/javascript": [ | |
"/* Put everything inside the global mpl namespace */\n", | |
"window.mpl = {};\n", | |
"\n", | |
"mpl.get_websocket_type = function() {\n", | |
" if (typeof(WebSocket) !== 'undefined') {\n", | |
" return WebSocket;\n", | |
" } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
" return MozWebSocket;\n", | |
" } else {\n", | |
" alert('Your browser does not have WebSocket support.' +\n", | |
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
" 'Firefox 4 and 5 are also supported but you ' +\n", | |
" 'have to enable WebSockets in about:config.');\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
" this.id = figure_id;\n", | |
"\n", | |
" this.ws = websocket;\n", | |
"\n", | |
" this.supports_binary = (this.ws.binaryType != undefined);\n", | |
"\n", | |
" if (!this.supports_binary) {\n", | |
" var warnings = document.getElementById(\"mpl-warnings\");\n", | |
" if (warnings) {\n", | |
" warnings.style.display = 'block';\n", | |
" warnings.textContent = (\n", | |
" \"This browser does not support binary websocket messages. \" +\n", | |
" \"Performance may be slow.\");\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.imageObj = new Image();\n", | |
"\n", | |
" this.context = undefined;\n", | |
" this.message = undefined;\n", | |
" this.canvas = undefined;\n", | |
" this.rubberband_canvas = undefined;\n", | |
" this.rubberband_context = undefined;\n", | |
" this.format_dropdown = undefined;\n", | |
"\n", | |
" this.image_mode = 'full';\n", | |
"\n", | |
" this.root = $('<div/>');\n", | |
" this._root_extra_style(this.root)\n", | |
" this.root.attr('style', 'display: inline-block');\n", | |
"\n", | |
" $(parent_element).append(this.root);\n", | |
"\n", | |
" this._init_header(this);\n", | |
" this._init_canvas(this);\n", | |
" this._init_toolbar(this);\n", | |
"\n", | |
" var fig = this;\n", | |
"\n", | |
" this.waiting = false;\n", | |
"\n", | |
" this.ws.onopen = function () {\n", | |
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
" fig.send_message(\"send_image_mode\", {});\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" }\n", | |
"\n", | |
" this.imageObj.onload = function() {\n", | |
" if (fig.image_mode == 'full') {\n", | |
" // Full images could contain transparency (where diff images\n", | |
" // almost always do), so we need to clear the canvas so that\n", | |
" // there is no ghosting.\n", | |
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
" }\n", | |
" fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
" 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", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_canvas = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var canvas_div = $('<div/>');\n", | |
"\n", | |
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
"\n", | |
" function canvas_keyboard_event(event) {\n", | |
" return fig.key_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
" canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
" this.canvas_div = canvas_div\n", | |
" this._canvas_extra_style(canvas_div)\n", | |
" this.root.append(canvas_div);\n", | |
"\n", | |
" var canvas = $('<canvas/>');\n", | |
" canvas.addClass('mpl-canvas');\n", | |
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
"\n", | |
" this.canvas = canvas[0];\n", | |
" this.context = canvas[0].getContext(\"2d\");\n", | |
"\n", | |
" var rubberband = $('<canvas/>');\n", | |
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
"\n", | |
" var pass_mouse_events = true;\n", | |
"\n", | |
" canvas_div.resizable({\n", | |
" start: function(event, ui) {\n", | |
" pass_mouse_events = false;\n", | |
" },\n", | |
" resize: function(event, ui) {\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" stop: function(event, ui) {\n", | |
" pass_mouse_events = true;\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" });\n", | |
"\n", | |
" function mouse_event_fn(event) {\n", | |
" if (pass_mouse_events)\n", | |
" return fig.mouse_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" rubberband.mousedown('button_press', mouse_event_fn);\n", | |
" rubberband.mouseup('button_release', mouse_event_fn);\n", | |
" // Throttle sequential mouse events to 1 every 20ms.\n", | |
" rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
"\n", | |
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
"\n", | |
" canvas_div.on(\"wheel\", function (event) {\n", | |
" event = event.originalEvent;\n", | |
" event['data'] = 'scroll'\n", | |
" if (event.deltaY < 0) {\n", | |
" event.step = 1;\n", | |
" } else {\n", | |
" event.step = -1;\n", | |
" }\n", | |
" mouse_event_fn(event);\n", | |
" });\n", | |
"\n", | |
" canvas_div.append(canvas);\n", | |
" canvas_div.append(rubberband);\n", | |
"\n", | |
" this.rubberband = rubberband;\n", | |
" this.rubberband_canvas = rubberband[0];\n", | |
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
" this.rubberband_context.strokeStyle = \"#000000\";\n", | |
"\n", | |
" this._resize_canvas = function(width, height) {\n", | |
" // Keep the size of the canvas, canvas container, and rubber band\n", | |
" // canvas in synch.\n", | |
" canvas_div.css('width', width)\n", | |
" canvas_div.css('height', height)\n", | |
"\n", | |
" canvas.attr('width', width);\n", | |
" canvas.attr('height', height);\n", | |
"\n", | |
" rubberband.attr('width', width);\n", | |
" rubberband.attr('height', height);\n", | |
" }\n", | |
"\n", | |
" // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
" // upon first draw.\n", | |
" this._resize_canvas(600, 600);\n", | |
"\n", | |
" // Disable right mouse context menu.\n", | |
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
" return false;\n", | |
" });\n", | |
"\n", | |
" function set_focus () {\n", | |
" canvas.focus();\n", | |
" canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" window.setTimeout(set_focus, 100);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items) {\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) {\n", | |
" // put a spacer in here.\n", | |
" continue;\n", | |
" }\n", | |
" var button = $('<button/>');\n", | |
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
" 'ui-button-icon-only');\n", | |
" button.attr('role', 'button');\n", | |
" button.attr('aria-disabled', 'false');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
"\n", | |
" var icon_img = $('<span/>');\n", | |
" icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
" icon_img.addClass(image);\n", | |
" icon_img.addClass('ui-corner-all');\n", | |
"\n", | |
" var tooltip_span = $('<span/>');\n", | |
" tooltip_span.addClass('ui-button-text');\n", | |
" tooltip_span.html(tooltip);\n", | |
"\n", | |
" button.append(icon_img);\n", | |
" button.append(tooltip_span);\n", | |
"\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" var fmt_picker_span = $('<span/>');\n", | |
"\n", | |
" var fmt_picker = $('<select/>');\n", | |
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
" fmt_picker_span.append(fmt_picker);\n", | |
" nav_element.append(fmt_picker_span);\n", | |
" this.format_dropdown = fmt_picker[0];\n", | |
"\n", | |
" for (var ind in mpl.extensions) {\n", | |
" var fmt = mpl.extensions[ind];\n", | |
" var option = $(\n", | |
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
" fmt_picker.append(option)\n", | |
" }\n", | |
"\n", | |
" // Add hover states to the ui-buttons\n", | |
" $( \".ui-button\" ).hover(\n", | |
" function() { $(this).addClass(\"ui-state-hover\");},\n", | |
" function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
" );\n", | |
"\n", | |
" var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
" // which will in turn request a refresh of the image.\n", | |
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_message = function(type, properties) {\n", | |
" properties['type'] = type;\n", | |
" properties['figure_id'] = this.id;\n", | |
" this.ws.send(JSON.stringify(properties));\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_draw_message = function() {\n", | |
" if (!this.waiting) {\n", | |
" this.waiting = true;\n", | |
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" var format_dropdown = fig.format_dropdown;\n", | |
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
" fig.ondownload(fig, format);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
" var size = msg['size'];\n", | |
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
" fig._resize_canvas(size[0], size[1]);\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
" var x0 = msg['x0'];\n", | |
" var y0 = fig.canvas.height - msg['y0'];\n", | |
" var x1 = msg['x1'];\n", | |
" var y1 = fig.canvas.height - msg['y1'];\n", | |
" x0 = Math.floor(x0) + 0.5;\n", | |
" y0 = Math.floor(y0) + 0.5;\n", | |
" x1 = Math.floor(x1) + 0.5;\n", | |
" y1 = Math.floor(y1) + 0.5;\n", | |
" var min_x = Math.min(x0, x1);\n", | |
" var min_y = Math.min(y0, y1);\n", | |
" var width = Math.abs(x1 - x0);\n", | |
" var height = Math.abs(y1 - y0);\n", | |
"\n", | |
" fig.rubberband_context.clearRect(\n", | |
" 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
"\n", | |
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
" // Updates the figure title.\n", | |
" fig.header.textContent = msg['label'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
" var cursor = msg['cursor'];\n", | |
" switch(cursor)\n", | |
" {\n", | |
" case 0:\n", | |
" cursor = 'pointer';\n", | |
" break;\n", | |
" case 1:\n", | |
" cursor = 'default';\n", | |
" break;\n", | |
" case 2:\n", | |
" cursor = 'crosshair';\n", | |
" break;\n", | |
" case 3:\n", | |
" cursor = 'move';\n", | |
" break;\n", | |
" }\n", | |
" fig.rubberband_canvas.style.cursor = cursor;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
" fig.message.textContent = msg['message'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
" // Request the server to send over a new figure.\n", | |
" fig.send_draw_message();\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
" fig.image_mode = msg['mode'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Called whenever the canvas gets updated.\n", | |
" this.send_message(\"ack\", {});\n", | |
"}\n", | |
"\n", | |
"// A function to construct a web socket function for onmessage handling.\n", | |
"// Called in the figure constructor.\n", | |
"mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
" return function socket_on_message(evt) {\n", | |
" if (evt.data instanceof Blob) {\n", | |
" /* FIXME: We get \"Resource interpreted as Image but\n", | |
" * transferred with MIME type text/plain:\" errors on\n", | |
" * Chrome. But how to set the MIME type? It doesn't seem\n", | |
" * to be part of the websocket stream */\n", | |
" evt.data.type = \"image/png\";\n", | |
"\n", | |
" /* Free the memory for the previous frames */\n", | |
" if (fig.imageObj.src) {\n", | |
" (window.URL || window.webkitURL).revokeObjectURL(\n", | |
" fig.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
" evt.data);\n", | |
" fig.updated_canvas_event();\n", | |
" 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 (name === 'button_press')\n", | |
" {\n", | |
" this.canvas.focus();\n", | |
" this.canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" var x = canvas_pos.x;\n", | |
" var y = canvas_pos.y;\n", | |
"\n", | |
" this.send_message(name, {x: x, y: y, button: event.button,\n", | |
" step: event.step});\n", | |
"\n", | |
" /* This prevents the web browser from automatically changing to\n", | |
" * the text insertion cursor when the button is pressed. We want\n", | |
" * to control all of the cursor setting manually through the\n", | |
" * 'cursor' event from matplotlib */\n", | |
" event.preventDefault();\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" // Handle any extra behaviour associated with a key event\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.key_event = function(event, name) {\n", | |
"\n", | |
" // Prevent repeat events\n", | |
" if (name == 'key_press')\n", | |
" {\n", | |
" if (event.which === this._key)\n", | |
" return;\n", | |
" else\n", | |
" this._key = event.which;\n", | |
" }\n", | |
" if (name == 'key_release')\n", | |
" this._key = null;\n", | |
"\n", | |
" var value = '';\n", | |
" if (event.ctrlKey && event.which != 17)\n", | |
" value += \"ctrl+\";\n", | |
" if (event.altKey && event.which != 18)\n", | |
" value += \"alt+\";\n", | |
" if (event.shiftKey && event.which != 16)\n", | |
" value += \"shift+\";\n", | |
"\n", | |
" value += 'k';\n", | |
" value += event.which.toString();\n", | |
"\n", | |
" this._key_event_extra(event, name);\n", | |
"\n", | |
" this.send_message(name, {key: value});\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
" if (name == 'download') {\n", | |
" this.handle_save(this, null);\n", | |
" } else {\n", | |
" this.send_message(\"toolbar_button\", {name: name});\n", | |
" }\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
" this.message.textContent = tooltip;\n", | |
"};\n", | |
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
"\n", | |
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", | |
"\n", | |
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
" // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
" // object with the appropriate methods. Currently this is a non binary\n", | |
" // socket, so there is still some room for performance tuning.\n", | |
" var ws = {};\n", | |
"\n", | |
" ws.close = function() {\n", | |
" comm.close()\n", | |
" };\n", | |
" ws.send = function(m) {\n", | |
" //console.log('sending', m);\n", | |
" comm.send(m);\n", | |
" };\n", | |
" // Register the callback with on_msg.\n", | |
" comm.on_msg(function(msg) {\n", | |
" //console.log('receiving', msg['content']['data'], msg);\n", | |
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
" ws.onmessage(msg['content']['data'])\n", | |
" });\n", | |
" return ws;\n", | |
"}\n", | |
"\n", | |
"mpl.mpl_figure_comm = function(comm, msg) {\n", | |
" // This is the function which gets called when the mpl process\n", | |
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
"\n", | |
" var id = msg.content.data.id;\n", | |
" // Get hold of the div created by the display call when the Comm\n", | |
" // socket was opened in Python.\n", | |
" var element = $(\"#\" + id);\n", | |
" var ws_proxy = comm_websocket_adapter(comm)\n", | |
"\n", | |
" function ondownload(figure, format) {\n", | |
" window.open(figure.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" var fig = new mpl.figure(id, ws_proxy,\n", | |
" ondownload,\n", | |
" element.get(0));\n", | |
"\n", | |
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
" // web socket which is closed, not our websocket->open comm proxy.\n", | |
" ws_proxy.onopen();\n", | |
"\n", | |
" fig.parent_element = element.get(0);\n", | |
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
" if (!fig.cell_info) {\n", | |
" console.error(\"Failed to find cell for figure\", id, fig);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var output_index = fig.cell_info[2]\n", | |
" var cell = fig.cell_info[0];\n", | |
"\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
" // 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", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
" // this is important to make the div 'focusable\n", | |
" el.attr('tabindex', 0)\n", | |
" // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
" // off when our div gets focus\n", | |
"\n", | |
" // location in version 3\n", | |
" if (IPython.notebook.keyboard_manager) {\n", | |
" IPython.notebook.keyboard_manager.register_events(el);\n", | |
" }\n", | |
" else {\n", | |
" // location in version 2\n", | |
" IPython.keyboard_manager.register_events(el);\n", | |
" }\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" var manager = IPython.notebook.keyboard_manager;\n", | |
" if (!manager)\n", | |
" manager = IPython.keyboard_manager;\n", | |
"\n", | |
" // Check for shift+enter\n", | |
" if (event.shiftKey && event.which == 13) {\n", | |
" this.canvas_div.blur();\n", | |
" event.shiftKey = false;\n", | |
" // Send a \"J\" for go to next cell\n", | |
" event.which = 74;\n", | |
" event.keyCode = 74;\n", | |
" manager.command_mode();\n", | |
" manager.handle_keydown(event);\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" fig.ondownload(fig, null);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.find_output_cell = function(html_output) {\n", | |
" // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
" // IPython event is triggered only after the cells have been serialised, which for\n", | |
" // our purposes (turning an active figure into a static one), is too late.\n", | |
" var cells = IPython.notebook.get_cells();\n", | |
" var ncells = cells.length;\n", | |
" for (var i=0; i<ncells; i++) {\n", | |
" var cell = cells[i];\n", | |
" if (cell.cell_type === 'code'){\n", | |
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
" var data = cell.output_area.outputs[j];\n", | |
" if (data.data) {\n", | |
" // IPython >= 3 moved mimebundle to data attribute of output\n", | |
" data = data.data;\n", | |
" }\n", | |
" if (data['text/html'] == html_output) {\n", | |
" return [cell, data, j];\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"// Register the function which deals with the matplotlib target/channel.\n", | |
"// The kernel may be null if the page has been refreshed.\n", | |
"if (IPython.notebook.kernel != null) {\n", | |
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
"}\n" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<img src=\"data:image/png;base64,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\">" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, ax = plt.subplots(figsize=(12, 8))\n", | |
"data.Readers.hist(ax=ax, bins=50)\n", | |
"ax.set_yscale('log')\n", | |
"ax.set_xlabel('Readers')\n", | |
"ax.set_ylabel('Bin Count (Log)')\n", | |
"_ = ax.set_title('Mendeley Readers/Article Histogram')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Scoring" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 153, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def get_age(elem):\n", | |
" # TODO: automatically determine correct TZ\n", | |
" published = parse(elem['Date']).replace(tzinfo=timezone('EST5EDT'))\n", | |
" return datetime.now().replace(tzinfo=tzlocal()) - published" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 154, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# see http://amix.dk/blog/post/19574 for further details\n", | |
"def calculate_score(age, readers, gravity=1.9):\n", | |
" return (readers - 1) / pow((age + 2), gravity)\n", | |
"\n", | |
"def calculate_elem_score(elem, gravity=1.9):\n", | |
" return calculate_score(get_age(elem).days, elem['Readers'], gravity)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 155, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/javascript": [ | |
"/* Put everything inside the global mpl namespace */\n", | |
"window.mpl = {};\n", | |
"\n", | |
"mpl.get_websocket_type = function() {\n", | |
" if (typeof(WebSocket) !== 'undefined') {\n", | |
" return WebSocket;\n", | |
" } else if (typeof(MozWebSocket) !== 'undefined') {\n", | |
" return MozWebSocket;\n", | |
" } else {\n", | |
" alert('Your browser does not have WebSocket support.' +\n", | |
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", | |
" 'Firefox 4 and 5 are also supported but you ' +\n", | |
" 'have to enable WebSockets in about:config.');\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", | |
" this.id = figure_id;\n", | |
"\n", | |
" this.ws = websocket;\n", | |
"\n", | |
" this.supports_binary = (this.ws.binaryType != undefined);\n", | |
"\n", | |
" if (!this.supports_binary) {\n", | |
" var warnings = document.getElementById(\"mpl-warnings\");\n", | |
" if (warnings) {\n", | |
" warnings.style.display = 'block';\n", | |
" warnings.textContent = (\n", | |
" \"This browser does not support binary websocket messages. \" +\n", | |
" \"Performance may be slow.\");\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.imageObj = new Image();\n", | |
"\n", | |
" this.context = undefined;\n", | |
" this.message = undefined;\n", | |
" this.canvas = undefined;\n", | |
" this.rubberband_canvas = undefined;\n", | |
" this.rubberband_context = undefined;\n", | |
" this.format_dropdown = undefined;\n", | |
"\n", | |
" this.image_mode = 'full';\n", | |
"\n", | |
" this.root = $('<div/>');\n", | |
" this._root_extra_style(this.root)\n", | |
" this.root.attr('style', 'display: inline-block');\n", | |
"\n", | |
" $(parent_element).append(this.root);\n", | |
"\n", | |
" this._init_header(this);\n", | |
" this._init_canvas(this);\n", | |
" this._init_toolbar(this);\n", | |
"\n", | |
" var fig = this;\n", | |
"\n", | |
" this.waiting = false;\n", | |
"\n", | |
" this.ws.onopen = function () {\n", | |
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", | |
" fig.send_message(\"send_image_mode\", {});\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" }\n", | |
"\n", | |
" this.imageObj.onload = function() {\n", | |
" if (fig.image_mode == 'full') {\n", | |
" // Full images could contain transparency (where diff images\n", | |
" // almost always do), so we need to clear the canvas so that\n", | |
" // there is no ghosting.\n", | |
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", | |
" }\n", | |
" fig.context.drawImage(fig.imageObj, 0, 0);\n", | |
" 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", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_canvas = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var canvas_div = $('<div/>');\n", | |
"\n", | |
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", | |
"\n", | |
" function canvas_keyboard_event(event) {\n", | |
" return fig.key_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" canvas_div.keydown('key_press', canvas_keyboard_event);\n", | |
" canvas_div.keyup('key_release', canvas_keyboard_event);\n", | |
" this.canvas_div = canvas_div\n", | |
" this._canvas_extra_style(canvas_div)\n", | |
" this.root.append(canvas_div);\n", | |
"\n", | |
" var canvas = $('<canvas/>');\n", | |
" canvas.addClass('mpl-canvas');\n", | |
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", | |
"\n", | |
" this.canvas = canvas[0];\n", | |
" this.context = canvas[0].getContext(\"2d\");\n", | |
"\n", | |
" var rubberband = $('<canvas/>');\n", | |
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", | |
"\n", | |
" var pass_mouse_events = true;\n", | |
"\n", | |
" canvas_div.resizable({\n", | |
" start: function(event, ui) {\n", | |
" pass_mouse_events = false;\n", | |
" },\n", | |
" resize: function(event, ui) {\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" stop: function(event, ui) {\n", | |
" pass_mouse_events = true;\n", | |
" fig.request_resize(ui.size.width, ui.size.height);\n", | |
" },\n", | |
" });\n", | |
"\n", | |
" function mouse_event_fn(event) {\n", | |
" if (pass_mouse_events)\n", | |
" return fig.mouse_event(event, event['data']);\n", | |
" }\n", | |
"\n", | |
" rubberband.mousedown('button_press', mouse_event_fn);\n", | |
" rubberband.mouseup('button_release', mouse_event_fn);\n", | |
" // Throttle sequential mouse events to 1 every 20ms.\n", | |
" rubberband.mousemove('motion_notify', mouse_event_fn);\n", | |
"\n", | |
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n", | |
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n", | |
"\n", | |
" canvas_div.on(\"wheel\", function (event) {\n", | |
" event = event.originalEvent;\n", | |
" event['data'] = 'scroll'\n", | |
" if (event.deltaY < 0) {\n", | |
" event.step = 1;\n", | |
" } else {\n", | |
" event.step = -1;\n", | |
" }\n", | |
" mouse_event_fn(event);\n", | |
" });\n", | |
"\n", | |
" canvas_div.append(canvas);\n", | |
" canvas_div.append(rubberband);\n", | |
"\n", | |
" this.rubberband = rubberband;\n", | |
" this.rubberband_canvas = rubberband[0];\n", | |
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n", | |
" this.rubberband_context.strokeStyle = \"#000000\";\n", | |
"\n", | |
" this._resize_canvas = function(width, height) {\n", | |
" // Keep the size of the canvas, canvas container, and rubber band\n", | |
" // canvas in synch.\n", | |
" canvas_div.css('width', width)\n", | |
" canvas_div.css('height', height)\n", | |
"\n", | |
" canvas.attr('width', width);\n", | |
" canvas.attr('height', height);\n", | |
"\n", | |
" rubberband.attr('width', width);\n", | |
" rubberband.attr('height', height);\n", | |
" }\n", | |
"\n", | |
" // Set the figure to an initial 600x600px, this will subsequently be updated\n", | |
" // upon first draw.\n", | |
" this._resize_canvas(600, 600);\n", | |
"\n", | |
" // Disable right mouse context menu.\n", | |
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", | |
" return false;\n", | |
" });\n", | |
"\n", | |
" function set_focus () {\n", | |
" canvas.focus();\n", | |
" canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" window.setTimeout(set_focus, 100);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._init_toolbar = function() {\n", | |
" var fig = this;\n", | |
"\n", | |
" var nav_element = $('<div/>')\n", | |
" nav_element.attr('style', 'width: 100%');\n", | |
" this.root.append(nav_element);\n", | |
"\n", | |
" // Define a callback function for later on.\n", | |
" function toolbar_event(event) {\n", | |
" return fig.toolbar_button_onclick(event['data']);\n", | |
" }\n", | |
" function toolbar_mouse_event(event) {\n", | |
" return fig.toolbar_button_onmouseover(event['data']);\n", | |
" }\n", | |
"\n", | |
" for(var toolbar_ind in mpl.toolbar_items) {\n", | |
" var name = mpl.toolbar_items[toolbar_ind][0];\n", | |
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", | |
" var image = mpl.toolbar_items[toolbar_ind][2];\n", | |
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n", | |
"\n", | |
" if (!name) {\n", | |
" // put a spacer in here.\n", | |
" continue;\n", | |
" }\n", | |
" var button = $('<button/>');\n", | |
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", | |
" 'ui-button-icon-only');\n", | |
" button.attr('role', 'button');\n", | |
" button.attr('aria-disabled', 'false');\n", | |
" button.click(method_name, toolbar_event);\n", | |
" button.mouseover(tooltip, toolbar_mouse_event);\n", | |
"\n", | |
" var icon_img = $('<span/>');\n", | |
" icon_img.addClass('ui-button-icon-primary ui-icon');\n", | |
" icon_img.addClass(image);\n", | |
" icon_img.addClass('ui-corner-all');\n", | |
"\n", | |
" var tooltip_span = $('<span/>');\n", | |
" tooltip_span.addClass('ui-button-text');\n", | |
" tooltip_span.html(tooltip);\n", | |
"\n", | |
" button.append(icon_img);\n", | |
" button.append(tooltip_span);\n", | |
"\n", | |
" nav_element.append(button);\n", | |
" }\n", | |
"\n", | |
" var fmt_picker_span = $('<span/>');\n", | |
"\n", | |
" var fmt_picker = $('<select/>');\n", | |
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", | |
" fmt_picker_span.append(fmt_picker);\n", | |
" nav_element.append(fmt_picker_span);\n", | |
" this.format_dropdown = fmt_picker[0];\n", | |
"\n", | |
" for (var ind in mpl.extensions) {\n", | |
" var fmt = mpl.extensions[ind];\n", | |
" var option = $(\n", | |
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n", | |
" fmt_picker.append(option)\n", | |
" }\n", | |
"\n", | |
" // Add hover states to the ui-buttons\n", | |
" $( \".ui-button\" ).hover(\n", | |
" function() { $(this).addClass(\"ui-state-hover\");},\n", | |
" function() { $(this).removeClass(\"ui-state-hover\");}\n", | |
" );\n", | |
"\n", | |
" var status_bar = $('<span class=\"mpl-message\"/>');\n", | |
" nav_element.append(status_bar);\n", | |
" this.message = status_bar[0];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n", | |
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n", | |
" // which will in turn request a refresh of the image.\n", | |
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_message = function(type, properties) {\n", | |
" properties['type'] = type;\n", | |
" properties['figure_id'] = this.id;\n", | |
" this.ws.send(JSON.stringify(properties));\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.send_draw_message = function() {\n", | |
" if (!this.waiting) {\n", | |
" this.waiting = true;\n", | |
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" var format_dropdown = fig.format_dropdown;\n", | |
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n", | |
" fig.ondownload(fig, format);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n", | |
" var size = msg['size'];\n", | |
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n", | |
" fig._resize_canvas(size[0], size[1]);\n", | |
" fig.send_message(\"refresh\", {});\n", | |
" };\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n", | |
" var x0 = msg['x0'];\n", | |
" var y0 = fig.canvas.height - msg['y0'];\n", | |
" var x1 = msg['x1'];\n", | |
" var y1 = fig.canvas.height - msg['y1'];\n", | |
" x0 = Math.floor(x0) + 0.5;\n", | |
" y0 = Math.floor(y0) + 0.5;\n", | |
" x1 = Math.floor(x1) + 0.5;\n", | |
" y1 = Math.floor(y1) + 0.5;\n", | |
" var min_x = Math.min(x0, x1);\n", | |
" var min_y = Math.min(y0, y1);\n", | |
" var width = Math.abs(x1 - x0);\n", | |
" var height = Math.abs(y1 - y0);\n", | |
"\n", | |
" fig.rubberband_context.clearRect(\n", | |
" 0, 0, fig.canvas.width, fig.canvas.height);\n", | |
"\n", | |
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n", | |
" // Updates the figure title.\n", | |
" fig.header.textContent = msg['label'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n", | |
" var cursor = msg['cursor'];\n", | |
" switch(cursor)\n", | |
" {\n", | |
" case 0:\n", | |
" cursor = 'pointer';\n", | |
" break;\n", | |
" case 1:\n", | |
" cursor = 'default';\n", | |
" break;\n", | |
" case 2:\n", | |
" cursor = 'crosshair';\n", | |
" break;\n", | |
" case 3:\n", | |
" cursor = 'move';\n", | |
" break;\n", | |
" }\n", | |
" fig.rubberband_canvas.style.cursor = cursor;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_message = function(fig, msg) {\n", | |
" fig.message.textContent = msg['message'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n", | |
" // Request the server to send over a new figure.\n", | |
" fig.send_draw_message();\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n", | |
" fig.image_mode = msg['mode'];\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.updated_canvas_event = function() {\n", | |
" // Called whenever the canvas gets updated.\n", | |
" this.send_message(\"ack\", {});\n", | |
"}\n", | |
"\n", | |
"// A function to construct a web socket function for onmessage handling.\n", | |
"// Called in the figure constructor.\n", | |
"mpl.figure.prototype._make_on_message_function = function(fig) {\n", | |
" return function socket_on_message(evt) {\n", | |
" if (evt.data instanceof Blob) {\n", | |
" /* FIXME: We get \"Resource interpreted as Image but\n", | |
" * transferred with MIME type text/plain:\" errors on\n", | |
" * Chrome. But how to set the MIME type? It doesn't seem\n", | |
" * to be part of the websocket stream */\n", | |
" evt.data.type = \"image/png\";\n", | |
"\n", | |
" /* Free the memory for the previous frames */\n", | |
" if (fig.imageObj.src) {\n", | |
" (window.URL || window.webkitURL).revokeObjectURL(\n", | |
" fig.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n", | |
" evt.data);\n", | |
" fig.updated_canvas_event();\n", | |
" 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 (name === 'button_press')\n", | |
" {\n", | |
" this.canvas.focus();\n", | |
" this.canvas_div.focus();\n", | |
" }\n", | |
"\n", | |
" var x = canvas_pos.x;\n", | |
" var y = canvas_pos.y;\n", | |
"\n", | |
" this.send_message(name, {x: x, y: y, button: event.button,\n", | |
" step: event.step});\n", | |
"\n", | |
" /* This prevents the web browser from automatically changing to\n", | |
" * the text insertion cursor when the button is pressed. We want\n", | |
" * to control all of the cursor setting manually through the\n", | |
" * 'cursor' event from matplotlib */\n", | |
" event.preventDefault();\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" // Handle any extra behaviour associated with a key event\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.key_event = function(event, name) {\n", | |
"\n", | |
" // Prevent repeat events\n", | |
" if (name == 'key_press')\n", | |
" {\n", | |
" if (event.which === this._key)\n", | |
" return;\n", | |
" else\n", | |
" this._key = event.which;\n", | |
" }\n", | |
" if (name == 'key_release')\n", | |
" this._key = null;\n", | |
"\n", | |
" var value = '';\n", | |
" if (event.ctrlKey && event.which != 17)\n", | |
" value += \"ctrl+\";\n", | |
" if (event.altKey && event.which != 18)\n", | |
" value += \"alt+\";\n", | |
" if (event.shiftKey && event.which != 16)\n", | |
" value += \"shift+\";\n", | |
"\n", | |
" value += 'k';\n", | |
" value += event.which.toString();\n", | |
"\n", | |
" this._key_event_extra(event, name);\n", | |
"\n", | |
" this.send_message(name, {key: value});\n", | |
" return false;\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n", | |
" if (name == 'download') {\n", | |
" this.handle_save(this, null);\n", | |
" } else {\n", | |
" this.send_message(\"toolbar_button\", {name: name});\n", | |
" }\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n", | |
" this.message.textContent = tooltip;\n", | |
"};\n", | |
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", | |
"\n", | |
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", | |
"\n", | |
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", | |
" // Create a \"websocket\"-like object which calls the given IPython comm\n", | |
" // object with the appropriate methods. Currently this is a non binary\n", | |
" // socket, so there is still some room for performance tuning.\n", | |
" var ws = {};\n", | |
"\n", | |
" ws.close = function() {\n", | |
" comm.close()\n", | |
" };\n", | |
" ws.send = function(m) {\n", | |
" //console.log('sending', m);\n", | |
" comm.send(m);\n", | |
" };\n", | |
" // Register the callback with on_msg.\n", | |
" comm.on_msg(function(msg) {\n", | |
" //console.log('receiving', msg['content']['data'], msg);\n", | |
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n", | |
" ws.onmessage(msg['content']['data'])\n", | |
" });\n", | |
" return ws;\n", | |
"}\n", | |
"\n", | |
"mpl.mpl_figure_comm = function(comm, msg) {\n", | |
" // This is the function which gets called when the mpl process\n", | |
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n", | |
"\n", | |
" var id = msg.content.data.id;\n", | |
" // Get hold of the div created by the display call when the Comm\n", | |
" // socket was opened in Python.\n", | |
" var element = $(\"#\" + id);\n", | |
" var ws_proxy = comm_websocket_adapter(comm)\n", | |
"\n", | |
" function ondownload(figure, format) {\n", | |
" window.open(figure.imageObj.src);\n", | |
" }\n", | |
"\n", | |
" var fig = new mpl.figure(id, ws_proxy,\n", | |
" ondownload,\n", | |
" element.get(0));\n", | |
"\n", | |
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n", | |
" // web socket which is closed, not our websocket->open comm proxy.\n", | |
" ws_proxy.onopen();\n", | |
"\n", | |
" fig.parent_element = element.get(0);\n", | |
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n", | |
" if (!fig.cell_info) {\n", | |
" console.error(\"Failed to find cell for figure\", id, fig);\n", | |
" return;\n", | |
" }\n", | |
"\n", | |
" var output_index = fig.cell_info[2]\n", | |
" var cell = fig.cell_info[0];\n", | |
"\n", | |
"};\n", | |
"\n", | |
"mpl.figure.prototype.handle_close = function(fig, msg) {\n", | |
" // 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", | |
"\n", | |
"mpl.figure.prototype._canvas_extra_style = function(el){\n", | |
" // this is important to make the div 'focusable\n", | |
" el.attr('tabindex', 0)\n", | |
" // reach out to IPython and tell the keyboard manager to turn it's self\n", | |
" // off when our div gets focus\n", | |
"\n", | |
" // location in version 3\n", | |
" if (IPython.notebook.keyboard_manager) {\n", | |
" IPython.notebook.keyboard_manager.register_events(el);\n", | |
" }\n", | |
" else {\n", | |
" // location in version 2\n", | |
" IPython.keyboard_manager.register_events(el);\n", | |
" }\n", | |
"\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype._key_event_extra = function(event, name) {\n", | |
" var manager = IPython.notebook.keyboard_manager;\n", | |
" if (!manager)\n", | |
" manager = IPython.keyboard_manager;\n", | |
"\n", | |
" // Check for shift+enter\n", | |
" if (event.shiftKey && event.which == 13) {\n", | |
" this.canvas_div.blur();\n", | |
" event.shiftKey = false;\n", | |
" // Send a \"J\" for go to next cell\n", | |
" event.which = 74;\n", | |
" event.keyCode = 74;\n", | |
" manager.command_mode();\n", | |
" manager.handle_keydown(event);\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"mpl.figure.prototype.handle_save = function(fig, msg) {\n", | |
" fig.ondownload(fig, null);\n", | |
"}\n", | |
"\n", | |
"\n", | |
"mpl.find_output_cell = function(html_output) {\n", | |
" // Return the cell and output element which can be found *uniquely* in the notebook.\n", | |
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", | |
" // IPython event is triggered only after the cells have been serialised, which for\n", | |
" // our purposes (turning an active figure into a static one), is too late.\n", | |
" var cells = IPython.notebook.get_cells();\n", | |
" var ncells = cells.length;\n", | |
" for (var i=0; i<ncells; i++) {\n", | |
" var cell = cells[i];\n", | |
" if (cell.cell_type === 'code'){\n", | |
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n", | |
" var data = cell.output_area.outputs[j];\n", | |
" if (data.data) {\n", | |
" // IPython >= 3 moved mimebundle to data attribute of output\n", | |
" data = data.data;\n", | |
" }\n", | |
" if (data['text/html'] == html_output) {\n", | |
" return [cell, data, j];\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"}\n", | |
"\n", | |
"// Register the function which deals with the matplotlib target/channel.\n", | |
"// The kernel may be null if the page has been refreshed.\n", | |
"if (IPython.notebook.kernel != null) {\n", | |
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", | |
"}\n" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"<img src=\"data:image/png;base64,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dps1EdtnAoMHD5Z27dr5HJVwQSOAzkFTxP960Nh/pkGLiMZuFYlnTNxWV/zskydPlrPOOisqQIUKFWTt2rXFD5yEO4cOHSrXX3+9LF261PwYan4OTYMW7znDALsXGafjXgObFUQY4De+fUOemPaETL1hanTOlStFqlYV2b5dpFQpmzURGwIQgAAEIAABCCSdQDxjkvSCfEoYNsADBw6Uk046aWfUUubnueOPP96nLHbCYIBlox2yRC2IAAY4vZ+PCAP81ndvyaNTH5VpbadFj/q330T2209k61aRMmXSmwqjgwAEIAABCEAg4wikuwH+8MMPPWeCiyr0n3/+KbvttltRbyvW9X4a4H/++SdUQ8mSJYtVi183xXvOmAH2i3Tx42CAi88uFe6MMMBvf/+2PPzZw/LljV9G175uncjee4v88YfInnumwtioEQIQgAAEIAABCBSaQDxjUuhAAbswPAM8ceJEadSoUZGqC987atQoGTt2rLz77rvmOJi/ZZ3+XGjac889J4MGDZIffvhB9tprL2nevLn069dPKlasuDPPU089Ja+++mromn/NVjp9NeN9990n5513XkQtixcvlttvv100557mZ82rrrpKjjjiCGnfvn3UEujC5C1RooR069YtVJduL9D3O3/99ddy6KGHSnZ2tvzvf/+T1atXS/ny5eWYY44RrbNWrVpF4lOci+M9Zxjg4lD19x4MsL88gxYtwgC/8/070vvT3jLjphnRdW40KzDMPxCyfv1/v9JShoD+I5+Tk5My9VJo8Qigc/G4pdJdaJxKahWvVjQuHje/7opnTPzKk+w4YRO7n1nJ9/vvv4vu/W3atKk8/PDDUr169QLLCd9b1WyDU8N66aWXmheCbJMLL7xQ7rnnHunfv7906NAhFG/58uVy7733SrVq1WTq1KmiBlRbly5d5Mgjj5QaNWqEzLMaTzXN48aNC92n7a+//gqZXZ1d7t27t+y7774h0zpz5kxZsWJFhAEubF7Nr3Wr4e3YsWPIVB977LHSvXt3GTNmTOhno5rmgFdlovVecsklcsopp1iXJ95zhgG2LkHcBBjguIhS+oIIAzx6/mjpOaWnzGw3M3pQW7b8N/Nr/pGQSpVSetCZVvyqVaukSpUqmTbsjBsvOqe/5GiMxulPwO0I4xkTt9UVP/s333wjI0aMkAYNGki5cuVCprJPnz5SunRpmTVrVshsxmphA3zxxReLzgKHmx5Kddhhh0mPHj1Cpjfc1Eiefvrp8s4774Rmg/M3nQHW3qxZM9l9991DM8rann/++dCBnXoS+sknnxz62o4dO8wbOI+W77//XpaYt5HoIVhFyRs2wIsWLYpYsq0x1Xg/+uijxYeawJ3xnjMMcAJwfboVA+wTyICGiTDAYxaMkfsn3y+z2s2KLtd8Mmf+9RAxZkoqVw7ocCgLAhCAAAQgAAEIFI9APGOSP6rxZ7JpU/FyFeausmXtvXhDja8aTZ1N7dWrV8xywgb45ZdflquvvnrndWHDunDhwqjTmfc2W+ZuvPFGeeyxx0LX67LjBx54QGbMmCG/mTNl1Nhq06XQ3333Xej3etLzxx9/HDK4eVvPnj1Fe/gU6KLkVQOscV944YWImPq10aNHS+fOnaVx48Zy3HHHJXVfcLznDANcmL8ddq/BANvl6zp6hAF+/4f3pdvH3WT2zbOj69LXH+mhAWZ5ixxwgOu6yQ8BCEAAAhCAAAR8JRDPmORPFt4d5msReYJt2CBmxtZWdJE6deqEzKsuRY7VYu0f1mXKuo/Xq+1iXpfZunVrGTJkSGjfrc64HnXUUaFlyJpPD6HSe+fPny+671fbueeeG3ol0/Tp0yNCPvvss3LLLbfsNMCFzatB1ADrcuf8Bn/z5s2hZdZvvvmm6OywGnatV7+ms9K2W7znDANsW4H48THA8Rml8hURBnjcj+Pk7g/vlrnt53qPSfdymCUoctBBqTzmjKt9woQJO/fYZNzgM2jA6Jz+YqMxGqc/AbcjjGdM8leXyjPAOpbwvlw93CqeAc5/gnTYmOrBWnkPvArHqWS2yx1kfl4Mz9jq/mDdjxtuuhxbzXHYAOus7EcffSQ//fRTRCn5Z4ALmzdsgHV59oMPPhhzfFqDGmGdCe/UqVNoX7TtFu85wwDbViB+fAxwfEapfEWEAZ6wcIJ0+qCTfHvLt95j2nVXMR/XiRxySCqPOeNqHzlypLRs2TLjxp1pA0bn9FccjdE4/Qm4HWE8Y+K2On+z63LkrKys0P5d3cdbVAOsxvXwww8PnQKt5jVWGzBggNx5551mB90q8zZN8zpN0/Q0aDXfOhscNsC6TPmmm26SL774YudBVLpXWGePdaY4vAe4sHkLa4DDdev7kA8wKxz1cCzbLd5zhgG2rUD8+Bjg+IxS+YoIAzxx0US5Y/wd8v2t33uPSZeFzDbLo80/eDQIQAACEIAABCCQTgTiGZNUHWurVq3M3MUhob2uegK07v/VE5D19UB6IJYuAS6qAdbrdXnx448/Hnp1Uf369aVMmTKhWV2dLW7btq00bNgwtMdXT14+66yzQjOsK1euDBluXZ6sBleNrbbt27eHToHeunVr6IAuPZhLZ3v1AC+dPQ7vAS5s3oIMcL169UIHdOmybGUwZcqU0DLp8Fhs6xzvOcMA21YgfnwMcHxGqXxFhAH+cPGHcuvYW2XBbQu8x6SnMejeDPOpHQ0CEIAABCAAAQikE4F4xiRVx6rLel977bXQ8uIt5q0e+++/f2jPrS4vrhznYFPdA6zvDtalzmpi87fhw4eHXmk0d+5c0b2/+lqls88+O7SkOLzkWZcY33///TtPcNb9v7rvWI1neAZY46oZvu2223a+B1iNe/g9wOEZ4HD+WHm7du0amsktyABrbR988EEot76WSV+TpId2ae5ktHjPGQY4GSoUnAMD7F4DmxVEGOCPl3wsN793s/xw+w/eOfWl5uYfK/O2cJs1EdtnAvq+Pv1UlpbeBNA5vfXV0aExGqc/AbcjjGdM3FZH9nQhEO85wwC7VxoD7F4DmxVEGODJSydL2/+1lYV3LPTOqe+JMwcqidknQUsdArrkSF9UT0tvAuic3vrq6NAYjdOfgNsRxjMmbqsje7oQiPecYYDdK40Bdq+BzQoiDPAnP30ibd5tI4s7/HckfVQzS2bMi9PEvDjOZk3E9pkAs0Y+Aw1oOHQOqDA+loXGPsIMaCg0ditMPGPitjqypwuBeM8ZBti90hhg9xrYrCDCAH/282dy9dtXy9KOS71zmn0d8sYbIubwABoEIAABCEAAAhBIJwLxjEk6jZWxuCMQ7znDALvTJpwZA+xeA5sVRBjgqcumyhVvXSE/3/mzd84aNUReeUXkjDNs1kRsCEAAAhCAAAQgkHQC8YxJ0gsiYVoSiPecYYDdy44Bdq+BzQoiDPAXy76Qy968TJZ3Wu6d87DDxLzRXOTMM23WRGyfCfDuUJ+BBjQcOgdUGB/LQmMfYQY0FBq7FSaeMXFbHdnThUC85wwD7F5pDLB7DWxWEGGApy+fLi3eaCErOq3wzlm7tsjAgSKNG9usidg+E5hgDi5r2rSpz1EJFzQC6Bw0RfyvB439Zxq0iGjsVpF4xsRtdWRPFwLxnjMMsHulMcDuNbBZQYQB/mrFV3Lh6xfKyrtWeuc0LwyXfv3EvDzOZk3EhgAEIAABCEAAAkknEM+YJL0gEqYlgXjPGQbYvewYYPca2KwgwgB//cvXct6I82R159XeOY89VuShh0TOP99mTcSGAAQgAAEIQOFUQmQAACAASURBVAACSScQz5gkvSASpiWBeM8ZBti97Bhg9xrYrCDCAM9aOUuaDG8iv3X5zTvniSeK3HuvyEUX2ayJ2D4TWLVqlVSpUsXnqIQLGgF0Dpoi/teDxv4zDVpENHarSDxj4rY6sqcLgXjPGQbYvdIYYPca2KwgwgDPXjVbznr5LFlz9xrvnKecItKli8ill9qsidg+E8jOzpacnByfoxIuaATQOWiK+F8PGvvPNGgR0ditIvGMidvqyJ4uBOI9Zxhg90pjgN1rYLOCCAM8Z/UcaTC0gazrus4752mnidx+u8gVV9isidgQgAAEIAABCEAg6QTiGZOkF+RTwrfeektee+01+frrr+XXX3+VAw88UFq0aCHdunWTvfbaa2eWpUuXyiGHHOKZdf369VKunP7YGMw2efJkOeuss0R/rV+/fjCLzK0q3nOGAXYvHwbYvQY2K4gwwPN+nSenvXSabLhng3fOBg1EbrxR5OqrbdZEbAhAAAIQgAAEIJB0AvGMSdIL8ilhvXr15KCDDpLmzZtLtWrVZObMmdKjRw+pbd7uMXXqVNlll/9+3A8bYDXGF154YUT2E802uBIlSvhUkf9hMMD+M83kiBjg9FY/wgB/99t3kvVClmzM3ug96kaNRK65RqRNm/SmwuggAAEIQAACEMg4AulqgNesWSOVKlWK0POVV16Ra6+9Vj766CM588wzIwzwCy+8INdff33C+m/fvl1Kly6dcJzCBPDTAO/YsUP+/vtva7XHe86YAS6M4navwQDb5es6eoQBnv/7fDnxuRPlj25/eNel75K9/HKRG25wXTf5i0Bg8ODB0q5duyLcwaWpSACdU1G1otWMxkXjlYpXo7Fb1eIZE7fV+Zv9+++/lzp16oga4VatWkUY4Oeff978qFe0n/XCs8eDBg2SJUuWyPDhw2X16tWydu1aKV++vLz99tvyyCOPyNy5c2XXXXeVxo0by2OPPSbVq1ffObDXX39dnnvuOZk3b55s3bpVatasKR07dpTWrVtHDP63336TDh06yPvvvx+aldbZ6osvvji0rDv/EujC5K1Ro4acccYZoQ8CtMbFixfLm2++aV56cn5opnzEiBHyyy+/hJaL66z5ww8/LKfptsBitnjPGQa4mGB9vA0D7CPMAIaKMMA/rPlBjn32WNnSfYt3qc2aiflXRoybCuBQKCkWgWnTpklWVhaA0pwAOqe5wGZ4aIzG6U/A7QjjGRO31fmb/dlnn5VbbrlFZsyYIccff3yEAd5nn31k3bp1sueee0oDs/2td+/ectRRRxVYQNgAV61aVU4++WRp27at/PPPPyGjO3To0FAunVW+1BykqpzVWG7btk3mzJmzcx+yHthZsWJFOeyww0LGdsqUKaFDPAcOHBjxQb6aVTXSffr0CZlkNc4ffPCBrFixIsIAh8cYL+/BBx8sOlu99957S/fu3WW//fYLLRnXfdNqdjXPseZVoBs2bAjtoz7hhBNC5ri4Ld5zhgEuLln/7sMA+8cyiJEiDPDCtQvlqKePkm33bvOu1ewdkSZNRG69NYhjoSYIQAACEIAABCBQbALxjEmxAwfsRjWKxx13XKhPmDBhZ3X6Gq6ePXtKU7Pib9999xWdJVbz9/vvv8uXX34Zmv2M1cIGWM20mupw++OPP+SAAw6Qyy67THRpdbjp9bVq1QrNuOpsbv7277//ivb27dvLV199Jd98803okokTJ4bqU9N7ua5KzG3nnXeejB8/fqcBLkpenQHWMerMr5rfcFOTW6ZMGdFDxPxs8Z4zDLCftIsXCwNcPG6pcleEAV68brHUfqq2/HXfX971m6Ul5qNAMf9Spcr4qBMCEIAABCAAAQgUikA8Y5I/iO4V3fTXpkLFLs5FZXctu/OAquLc73WPGsOGDRuKml01tTpjW1Bbvnx5aKm0LjPW5dKxWtgAP/jgg3LvvffuvCxsWD/88MOo05nVLOsM7qhRo0LX//jjj3L//ffLp59+GqpPDbA2NaFbtvy3OlHj9+rVKzR7XLJkyZ15Xn75ZXNETZudBrgoedUA66yz1pi3aS6dgb7rrrvknHPOCc1s6/LtRFu85wwDnCjhxO/HACfOMMgRIgzwknVLpObAmvL3/X9716yftOm7gM0/BLTUITB//vwCP7VNnZFQaUEE0Dn9nw80RuP0J+B2hPGMSf7qNv65Uco/XN5a0fpWjnK7+ffqId1XqzOlunxYlxersS1Ma2a2wC1atEj036BYLWyA8+8ffvXVV835qeYA1RhNl1hPmjRJ1JjrMmvdZ6vvwz700ENDZvPpp5+Wl156aacZ1hlhNcz6Oqe8TWd/dWzhPcCFzasxdAn06aefHmXw9SCs/v37h/Yz675krU2XcPfr1y/qULHCcAxfE+85wwAXhaadazHAdrgGJWqEAf5p/U9yyJOHyD/3/+Nd31VXidStK9K1a1Dqp45CEOjbt6+RDM0KgSqlL0HnlJavUMWjcaEwpfRFaOxWvnjGJH91qTQDrHtcL7roIvnss89Cy4h1NrOwTY2lGtzvvvsurgHOf4J02JgOGzbM03CXLVs2NAscnrHV+k499dSdefSkap15Ds8Gx5oB1vjXXXfdTgNc2LxhA6z7inUWOVZTwz1mzBjp1KmTnHvuuaEl2MVt8Z4zDHBxyfp3HwbYP5ZBjBRhgJdtWCYHPnGg7Hhgh3etegqf7v8w74ejQQACEIAABCAAgXQiEM+YpOpY1TxeccUVoVOT33vvvZ2vPSrMeH7++efQzKyesKyHWcVq4Rng/AZ406ZNoXcP6z5fNa+x2ujRo0MnOethf2Fzrgdx6eysxtADtbTpMuUm5jwaPaCqZcuWO8OpKdX9zOEZYNVST5iOl7ewBjicSDnoUm2dRS9ui/ecYYCLS9a/+zDA/rEMYqQIA7xi4wqp9ng1+ff+f733nOg74cw+CbNBI4hjoSYIQAACEIAABCBQbALxjEmxAzu+UZcN6yu29IRjXc6ct6lJ1EOqtOleV53V1jdH6CFYCxYsCO2BVQM6ffr00ExtrBbLAOv1+mqjW80BqnoytO6l1dci6UFcugxbXz105ZVXhg6h0n24mkMP4tIl0Q899FDodUi6/Do8A6zx6tevHzo9Wk+n1ntGjhwZMsa6Xznva5AKk1fj6R5gjZl/Bri5OfxVT3/Ww8L0dOpZs2aFGN58882hVzgVt8V7zjDAxSXr330YYP9YBjFShAFeuWmlVO1fVf6+728pWeL/DxbYWfhNN4lUqaInEARxLNQEAQhAAAIQgAAEik0gnjEpdmDHN+osqs7kqrnN3/R1RHrwlLYhQ4bIM888IwsXLgwZ0EqVKkmjRo3kgQceKND86r0FGWD9/rhx40J7Z/U1Qrq3Vk23ms7OnTvvPKdE9wKrCde9xvp9nb1ds2ZNaOY4PAOssdQs33HHHaHZbD0IS42qzszqDLLG0LjhVpi8ysdrCbTu/9X3AeuMrx7Cpa9GUrOuJjjvAVxFlTfec4YBLipR/6/HAPvPNEgRIwzw6j9WS5XHqshf9/4lpUuWjq7TfIJoPgITcyZ+kMZALXEIsKcsMx4RdE5/ndEYjdOfgNsRxjMmbqsje7oQiPecYYDdK40Bdq+BzQoiDPCvm3+Vyo9Wlm3dt8lupXaLznv77SK77y7mpW02ayK2zwQ4OdZnoAENh84BFcbHstDYR5gBDYXGboWJZ0zcVkf2dCEQ7znDALtXGgPsXgObFUQY4N+3/C779ttXtnbfKmVKlYnOe+edIiVKiNn4YLMmYkMAAhCAAAQgAIGkE4hnTJJeEAnTkkC85wwD7F52DLB7DWxWEGGA125dK5UeqSSbu22WPUrvEZ23SxeRv/4SGTDAZk3EhgAEIAABCEAAAkknEM+YJL0gEqYlgXjPGQbYvewYYPca2KwgwgCv37ZeKvatKJuyN8leu+4Vnde8mFzMsfIyaJDNmojtMwF9pYCe6EhLbwLonN766ujQGI3Tn4DbEcYzJm6rI3u6EIj3nGGA3SuNAXavgc0KIgzwxj83SvmHy8uGezZIud30W/naffeJmBeBm7P0bdZEbJ8J6KsP2rVr53NUwgWNADoHTRH/60Fj/5kGLSIau1UknjFxWx3Z04VAvOcMA+xeaQywew1sVhBhgP/46w8pm1NW1nVdJxXKVIjOa47Kl2XLRF580WZNxIYABCAAAQhAAAJJJxDPmCS9IBKmJYF4zxkG2L3sGGD3GtisIMIAb/5rs+yVs5esuXuN7L373tF5zQvJzcvQRIYNs1kTsSEAAQhAAAIQgEDSCcQzJkkviIRpSSDec4YBdi87Bti9BjYriDDAW7dvlT367CG/dflN9tljn+i8Dz8sMm+eyPDhNmsiNgQgAAEIQAACEEg6gXjGJOkFkTAtCcR7zjDA7mXHALvXwGYFEQb4z7//lDK9y8ivnX+VfffcNzrvo4+KzJgh8vrrNmsits8Ess3hZTk5OT5HJVzQCKBz0BTxvx409p9p0CKisVtF4hkTt9WRPV0IxHvOMMDulcYAu9fAZgURBnj7P9tl14d2lVV3rZLKe1WOzvvEEyKffSby1ls2ayK2zwRWrVolVapU8Tkq4YJGAJ2Dpoj/9aCx/0yDFhGN3SoSz5i4rY7s6UIg3nOGAXavNAbYvQY2K4gwwP/8+4+U6lVKfun0i+xfdv/ovE89JTJxosjo0TZrIjYEIAABCEAAAhBIOoF4xiTpBfmUcPny5dK3b1+ziG+GzJ49W7Zt2yZLly6VAw88MCrDunXrpEuXLuZHvdGydetWqVevnjz++ONy1FFHRVyrMe4zbwcZbrbFbdiwQY499thQjjPOOMOnqu2E0XEfcsghMmTIELn22mvtJIkTNd5zhgF2IktEUgywew1sVhBhgHfs2CElHiwhy+9cLgeUOyA677PPiowZI/L++zZrIjYEIAABCEAAAhBIOoF4xiTpBfmUcPLkyXLFFVfIiSeeKH///bd88MEHngZYfw5UA/vzzz9Lv379pEKFCqEtVN9++6188803csAB//+zYatWrWTs2LHyqNkep4byKTNJMm7cOPniiy+kbt26PlXuf5iwAR46dKi0bt3a/wSFiBjvOcMAFwKi5UswwJYBOw4fYYC1ll167iI/d/xZqpevHl2avv5o5Egx/3I6Lpv0RSEwYcIEadq0aVFu4doUJIDOKShaEUtG4yICS8HL0ditaPGMidvqip9dje0uu/z3I/0LL7wgN910k6cB1lnfiy++WCZNmiQNGjQIXa9MDj74YLn66qtlwIABoa/pLPJxxx0XMYv6zz//SJ06daRWrVqh2eOiNL1XW8mSJYtyW7Gu9dsA//XXX7LrrrsWqZZ4zxkGuEg4rVyMAbaCNTBBowxwiZ4lZEmHJXJQhYOii3z5ZTH/2on5lzEwA6CQ+ARGmg8tWrZsGf9CrkhpAuic0vIVqng0LhSmlL4Ijd3KF8+YuK3On+wFGeAbbrghNDu8bNmyiGRt2rQRnUVW86itV69e8pB5NaYufS5TpszOa3v06CEPmzeGbNq0SUqXLh2z4BIlSki3bt1kr732ksGDB4fyff3116GZ4ylTpsiDDz4oX331lfz7779y+umny2OPPRYy1+GmNT5hzqXRWWmtQWegr7vuOunYsaNo7HDbsmWLdO7c2czdjBQ1qmeddVZoeXf9+vUl/wxwYfI2bNhQ1Kzffffdcv/998v3338fWvbdoUOH0IcDz5qVkj/99FOIyaGHHirdu3eXiy66KIpDvOcMA+zPs55IFAxwIvSCf2+UAS71YClZeMdCqVGhRnT1r70mMmjQfwdh0SAAAQhAAAIQgEAaEYhnTNJhqAUZ4KysLKlYsWJoKXPe9sgjj8g999wjf/zxh+yxxx6h5dQ6C6wGMG974403Qt/TJdNHHHFEgQa4atWqIZOopnXPPfcM7SFW09u8eXO54IIL5PrrrxeduVaDqXnmzJkj1apVC8VU06zm9sgjjwyZTb1PTfOtt94a8daLa665RrQmNeYnnXRSyNy/bt5konui8xrg983WvsLkPfPMM+W7774L1asGWI238tLa9EOCBx54ILSEXPdOK5/99tsvZMzzt3jPGQbY/d80DLB7DWxWEGWAd+21q8y/bb4cUvGQ6LxvvinmYziRadNs1kRsCEAAAhCAAAQgkHQC8YxJ0guykLAgA3z44YeH9gmPGDEiInP4Hp2p1X3ATZo0CZnhqVOnRlz34Ycfhr736aefymmnnRbXAC9atEh22223ndcddthhoeXWE/XA1dyms8lqNHUJth7Glb+pSdZZWTXKOlO8du3a0CULFiwIzRr36dMnNGMbbrfccktopjavAS5sXp0B1rHNmjVLjjnmmJ0xb7vtttDeZ53FLkyL95xhgAtD0e41GGC7fF1HjzLAZR4qI/NumSeH7X1YdG3vvqvrXsT8DXddN/mLQEBPasy7RKkIt3JpChFA5xQSq5ilonExwaXQbWjsVqx4xsTDfYlZ72uv6LJlzeEs/v4oXpAB1v27J5xwQlIMsM7wai3h9uOPP4b2D79ozpvRmdu8Tfcl//LLLzsN5sqVK0OzuuPHjxf9vR7spU33Oeufdeb1ZbNtT2dlFy9eLDVq1NgZ7pNPPhE1smEDXJS8ep/OHi9cuDCiPs2lM706A33hhRfKqaeeGpopj9XiPWcYYHt/pQob2d+/dYXNynXJIhBlgPfovYd8c/M3cnilw6Nr0NOfs7PFrPVIVn3k8YFAp06dpH///j5EIkSQCaBzkNXxpzY09odjkKOgsVt14hmTqOrMAVFSvry9os3+VimnP6r51+ItgdaTn9VY5m35l0DruSK6xHf+/PkR1xVlCbTuj9W9xOH2+eefF/gKpYMOOkiWLFkS2hd8yimniL4zW01w7dq1Zffdd5d33nlHevfuvfNwL50RzjY/s27evDn0/XDTmnXpdNgAFzav3h/eA6yzwPnbc889FzLvOgus+5/PO++80M9eWnf+Fu85wwD797wXNxIGuLjkUuO+KAO8V5+9ZMZNM6T2PrWjR6CnP5uN/mYzRmqMjipDBJhRyIwHAZ3TX2c0RuP0J+B2hPGMSVR1ZvltOs0AF3QIlh4SpQZUm+63VbOZyCFY9957byhOfmOqh2idffbZUaj1pGV9F3F4xlbfP3zVVVftvE7336qhDr/fONYMsI5D9/KGDXDYEMfLGzbAasB1FjlWUyZ6mvtdd90VWi4+zWPbYLznDAPs9t8BzY4Bdq+BzQqiDHDZnLIyve10OXLfI6Pz6unPN94oZu2HzZqIDQEIQAACEIAABJJOIJ4xSXpBFhIW5jVIeuKznpSszes1SHr68vHHHx+xj1aXIR999NGi+4jjvQZJT2rOb4A1l+711VOf1bzGauFXMOlhVpdffnnosu3bt4cO3VKDrv3AAw/cuQdYjXrXrl13hmvfvn3oEK2wAdY9xHoYV7y8hTXA4US6mkNnhXWvdP4W7znDAFt48IsYEgNcRGApdnmUAS7/cHmZev1UqbPf/x83v3NMevqzefG5OeM9xYZJuRCAAAQgAAEIQKBgAvGMSSrze+utt0Llf/TRRyED+PTTT8s+++wT2i8bNrtqBtUI6mFX/fr1E10OnZOTI/PmzQstedYZzXC78sorQzOdep3usX3mmWdk7NixoYOx9ETnglosA6ynT+tpzC1atJDLLrssVN/q1atDMXUp8Z133hkyu2qyS5UqFXrlkv6qh2OtWLFC9FCt8Ayw5m/dunXoFUi6VFoP99JToN80B7r+/PPPEea9MHnDBlgP3Mq/BFrfq1zOLFXXU7SV5w8//BB6zZOeCD1q1CgMcAr+xcEAp6BoRSg5ygBX7FtRPmnziRxd+ejoMNOni3lDupiTCIqQgktdE+C9kq4VSE5+dE4OZ5dZ0Ngl/eTkRuPkcI6VJZ0NcN734+phUWp2w6bu448/3olk3bp1oXfnvmsOPtVtF3qgk+5l1dndvE2/p/t49cTo9evXh0yv7rsNm+niGGC9R5cM66yt7s3V1wlVqVJF6tWrF3rXru791aZmXE9enjlzplSqVCn0yqTq1auLGtHwDLBep/frUuTwe4AbNWoUOhFaTX7+9wAXJq8unVYDnH8JtM5YDxkyJPSKJF0Cra940oO7evbsGXrXcf4W7zljBtjtvwOaHQPsXgObFUQZ4EqPVJKPW38sdavUjc5r/qGRpk1FfvvNZk3E9pmAfkLbVHWjpTUBdE5reUODQ2M0Tn8CbkcYz5i4rY7s6UIg3nOGAXavNAbYvQY2K4gywPv221c+uPoDOW7/46Lzzp0r5qM9EfPpIA0CEIAABCAAAQikE4F4xiSdxspY3BGI95xhgN1pE86MAXavgc0Kogxw5Ucry9irxsoJVU+IzqunP590kpgd/TZrIjYEIAABCEAAAhBIOoF4xiTpBZEwLQnEe84wwO5lxwC718BmBVEGuMqjVWTMlWPkpAOM0c3f9PTnOuZwrD//tFkTsX0moO/K0z00tPQmgM7pra+ODo3ROP0JuB1hPGPitjqypwuBeM8ZBti90hhg9xrYrCDKAFd9rKq80/IdOaXafwcNRDQ9/fngg8W8hdxmTcT2mYC+CF5PcaSlNwF0Tm99dXRojMbpT8DtCOMZE7fVkT1dCMR7zjDA7pXGALvXwGYFUQa4Wv9q8tblb0lWtazovHr6sx6Bb971JiVL2qyL2BCAAAQgAAEIQCCpBOIZk6QWQ7K0JRDvOcMAu5ceA+xeA5sVRBngAx8/UF6/9HU5tfqp0Xn19GfzfjNzrrxImTI26yI2BCAAAQhAAAIQSCqBeMYkqcWQLG0JxHvOMMDupccAu9fAZgVRBrjGEzVkeIvhcvqBp0fnNe95k4oVRTZuFClb1mZdxIYABCAAAQhAAAJJJRDPmCS1GJKlLYF4zxkG2L30GGD3GtisIMoAHzLgEBl60VCpf5B53VH+tnmzmDd6i6xZI7L33jbrIraPBAYPHizt2rXzMSKhgkgAnYOoir81obG/PIMYDY3dqhLPmLitjuzpQiDec4YBdq80Bti9BjYriDLAhz15mLxw4QvSsEbD6Lx//SWy2256FKlI5co26yK2jwSmTZsmWVkee7p9zEEo9wTQ2b0GtitAY9uE3cdHY7cahI3HsmXLpFw5/RGJBgH/CehzVr16ddmwYYPnc4YB9p95USNigItKLLWujzLANQfWlMHnD5azDj4reiR6+rMefrV8+X+HYdEgAAEIQAACEIBAmhDIYzzSZEQMI8gEMMDBVQcDHFxt/KgsygDXeqqWPH3e09LokEbe8dUAL1okUqOGH/mJAQEIQAACEIAABAJBYMeOHbJp06ZA1EIR6U+grDlPZ5ddoq0WM8DutccAu9fAZgVRBviIQUfIk+c8KY0PbeydV09/njtXpGZNm3UR20cC8+fPl9q1a/sYkVBBJIDOQVTF35rQ2F+eQYyGxkFUxf+a0Nl/pkGLmIjGGGD3amKA3Wtgs4IoA1zn6TrSv0l/aXpYU++8evrz9OkiRx5psy5i+0igb9++0rVrVx8jEiqIBNA5iKr4WxMa+8sziNHQOIiq+F8TOvvPNGgRE9EYA+xeTQywew1sVhBlgI9+5mh55OxH5Nya53rn1dOfJ00SqVvXZl3EhgAEIAABCEAAAhCAQMYRwAC7lxwD7F4DmxVEGeC6z9aVPmf1kWaHN/POq6c/v/++yIkn2qyL2BCAAAQgAAEIQAACEMg4Ahhg95JjgN1rYLOCKAN87LPHSq8ze8kFtS7wzlutmsibb4rUq2ezLmJDAAIQgAAEIAABCEAg4whggN1LjgF2r4HNCqIM8PGDj5ceDXvIhbUu9M578MEiw4aJ1K9vsy5i+0ggkX0oPpZBKMsE0Nky4ACER+MAiGC5BDS2DDgg4dE5IEJYLCMRjTHAFoUpZGgMcCFBpehlUQb4xOdOlHvr3ysX1b7Ie0iHHy7yzDMijWK8JilFQaRz2YmcRJjOXNJtbOicbopGjweN0Tj9CWTGCPm7nP46J6IxBtj984EBdq+BzQqiDPDJz58s95x+j7Q4ooV3Xj39+fHHRZrGOCXaZrXEhgAEIAABCEAAAhCAQBoTwAC7FxcD7F4DmxVEGeCsF7Kk86md5dIjL/XOq6c/9+4tcv75NusiNgQgAAEIQAACEIAABDKOAAbYveQYYPca2KwgygCf+uKp0jGro1xe53LvvHr6c/fuIhdfbLMuYvtIYNq0aZKVleVjREIFkQA6B1EVf2tCY395BjEaGgdRFf9rQmf/mQYtYiIaY4Ddq4kBdq+BzQqiDPBpL50mt598u1xx1BXeefX05zvvFLk8hkG2WS2xi0Vg8ODB0q5du2Ldy02pQwCdU0er4laKxsUllzr3oXHqaJVIpeicCL3UuDcRjTHA7jXGALvXwGYFUQb4jCFnSPsT28tVR1/lnVdPf1Yz1aqVzbqIDQEIQAACEIAABCAAgYwjgAF2LzkG2L0GNiuIMsANhjaQm46/SVodE8Pg6unP11wj0qaNzbqIDQEIQAACEIAABCAAgYwjgAF2LzkG2L0G4Qp6mt+0NX1v0780/RbTv41R3knm64+Yfrzpf5v+iekdTf8p3/VRBvjMYWfK9cdeL9fUNSbXq51zjsgll4jceGNwyFAJBCAAAQhAAAIQgAAE0oAABti9iBhg9xpoBV1MNxtvRV/Ou9D0+0y/zPRapm/OV2IJ8+dVpo8yvavpu5s+2PTKppsNvBEtygA3ermRtD6mtVx77LXeI7/gApFzzzX2W/03LRUIZGdnS05OTiqUSo0JEEDnBOClyK1onCJCJVAmGicAL4VuRecUEquYpSaiMQa4mNB9vA0D7CPMBEItMfc+YfqA3BilzK8rTVdTPDxf3Irmz2tMN+8rkrm539N3Fr1h+h75ro0ywI1faSxXHXWVXHfcdd7ltjDvB27YUOSOOxIYYru5swAAIABJREFUDrcmk8CqVaukSpUqyUxJLgcE0NkB9CSnROMkA3eQDo0dQHeQEp0dQE9yykQ0xgAnWSyPdBhg9xqUNyWsM/1U06flKeeDXIN7l0eJA83XSpqebfpupusM8AbT2+S7NsoANx3eVC4/8nK54fgbvEeupz+fcorIXV5p3cOiAghAAAIQgAAEIAABCKQqAQywe+UwwO41qG5K0L27R5i+IE85I3NN7U0eJTYwX3vG9Nq535tpfm1m+up4Bvic4efIJUdcIjeeEGOPr57+fPTRIvfc454MFUAAAhCAAAQgAAEIQCCNCGCA3YuJAXavQawZ4ImmtNmmd85XYk3zZz0cS/cNv2D6rqbfbXpL048yfUue60MzwE2aNJE6deqEvjxllylScVVFee/F96RMmTKhr40cOVIqVKggTZs2DZ3+vGq//WRAyZIR+0r1fWd169aVrKys0D3z58+X0aNHS9euug35v9a3b19p3ry51K79ny/Xl4TPnj074h21umeiQ4cOO5fsTpgwQdavXy8tW2r5Itu2bZNu3bpJnz59vOsz1+iykwEDBlCfYaH8pkyZEuIFv/R+/lTrBg0a8Pcjjf99GTNmjEyaNIl//9L4/4+rrrpKRowYwf9vaf7zgf6/rD9TRfx8xc8vafXzX/jn150/P8fRd8OGDaGf2dauXSsLFiwI/YxsmnqAjTt/kOY3SSOAAU4a6gITLTbffdJ03QesrbTpv5iuJzu/mu9Oc0SzvGh6hTxfV6O73nSzdlm+yvd183dug5Qrp5eInD/ifGlWs5m0P6m9d0F6+vP++4s8+GAwyFBFXAL6H2z4A4S4F3NByhJA55SVrtCFo3GhUaXshWicstIVqXB0LhKulLw4EY2ZAXYvOQbYvQZagc7y6oFX5gQq+dH0+01Xo6unQOed0dVrDzR9vuk69TrUdDXLOgN8c+738n6SFLUH+MLXLpSmhzaVW0++1XvkevpzefOBFKcKB+PJoAoIQAACEIAABCAAgbQhgAF2LyUG2L0G4Qr0PcC631dPedZ1EepQdalzDdN1hrih6fq+X22NTdfrdV3zv6Z/Y3p306fmG06UAb545MVyZo0z5Y5TYpzybJYnS2njqR99NDhkqAQCEIAABCAAAQhAAAJpQAAD7F5EDLB7DWxWEGWAL33jUjmt+mlyZz2dcPZonc1k9Pbt5oVM4Tcy2SyP2H4Q0H3T4f3cfsQjRjAJoHMwdfGzKjT2k2YwY6FxMHXxuyp09pto8OIlojEG2L2eGGD3GtisIMoAt3yrpZxU9STpfGr+s7VyyzCHVInZMyxPP22zLmL7SKBTp07Sv39/HyMSKogE0DmIqvhbExr7yzOI0dA4iKr4XxM6+880aBET0RgD7F5NDLB7DWxWEGWArxp1ldStXFe6nv7/pzdHFHDffeZlSuZtSs89Z7MuYvtIIJFPIX0sg1CWCaCzZcABCI/GARDBcglobBlwQMKjc0CEsFhGIhpjgC0KU8jQGOBCgkrRy6IM8DXvXCNH7HOEdDujm/eQ9PTnJUtEhgxJ0SFTNgQgAAEIQAACEIAABIJJAAPsXhcMsHsNbFYQZYDbvNtGDq14qNzXwMz0ejU9/flbc/bW8OE26yI2BCAAAQhAAAIQgAAEMo4ABti95Bhg9xrYrCDKAN8w+gapXr669GjYwzuvnv78lXmVsHm3LC01CCTyLrrUGCFVKgF0Tv/nAI3ROP0JZMYI+buc/jonojEG2P3zgQF2r4HNCqIM8E1jbpLKe1aWXmf18s6rpz9PmSLy9ts26yK2jwQmTJggTZs29TEioYJIAJ2DqIq/NaGxvzyDGA2Ng6iK/zWhs/9MgxYxEY0xwO7VxAC718BmBVEGuP177aXi7hWlT6M+3nn19Odx40TGjLFZF7EhAAEIQAACEIAABCCQcQQwwO4lxwC718BmBVEG+Laxt8mepfeUvo37eud9/nmRUaNExo+3WRexIQABCEAAAhCAAAQgkHEEMMDuJccAu9fAZgVRBrjDuA5SumRpebSJ2evr1YYOFXnlFZGPPrJZF7F9JLBq1SqpUqWKjxEJFUQC6BxEVfytCY395RnEaGgcRFX8rwmd/WcatIiJaIwBdq8mBti9BjYriDLAnSZ0kh07dsjj5zzunffVV0UGDxb55BObdRHbRwLZ2dmSo6d309KaADqntbyhwaExGqc/gcwYIX+X01/nRDTGALt/PjDA7jWwWUGUAe7yQRf5858/5clzn/TOq6c/60FYU6farIvYEIAABCAAAQhAAAIQyDgCGGD3kmOA3Wtgs4IoA3zPh/fIpj83yaBmg7zz6unPOpuor0KiQQACEIAABCAAAQhAAAK+EcAA+4ay2IEwwMVGlxI3Rhng7h91lzVb18iz5z/rPQA9/fm++0S++SYlBkiREIAABCAAAQhAAAIQSBUCGGD3SmGA3Wtgs4IoA3z/pPtl5aaV8vyF5rRnr6anP991l8i339qsi9g+Ehhs9my3a9fOx4iECiIBdA6iKv7WhMb+8gxiNDQOoir+14TO/jMNWsRENMYAu1cTA+xeA5sVRBngnpN7yk8bfpKXmr/knVdPf27fXuSHH2zWRWwfCUybNk2ysrJ8jEioIBJA5yCq4m9NaOwvzyBGQ+MgquJ/TejsP9OgRUxEYwywezUxwO41sFlBlAF+6JOH5Me1P8qwi4Z559XTn6+9VmTJEpt1ERsCEIAABCAAAQhAAAIZRwAD7F5yDLB7DWxWEGWAcz7NkW9/+1aGtxjunfeLL0Quu0xk+XKbdREbAhCAAAQgAAEIQAACGUcAA+xecgywew1sVhBlgB/5/BGZtWqWvHbJa955Z8wQadZMZPVqm3UR20cC8+fPl9q1a/sYkVBBJIDOQVTF35rQ2F+eQYyGxkFUxf+a0Nl/pkGLmIjGGGD3amKA3Wtgs4IoA/zY1Mdk+orp8sZlb3jnnTNHpGFDkbVrbdZFbB8J9O3bV7p27epjREIFkQA6B1EVf2tCY395BjEaGgdRFf9rQmf/mQYtYiIaY4Ddq4kBdq+BzQqiDPAT056QT3/+VEZdPso7r5lNlBNOENm82WZdxIYABCAAAQhAAAIQgEDGEcAAu5ccA+xeA5sVRBnggdMHykdLPpJ3r3jXO+/ixSK1aols326zLmJDAAIQgAAEIAABCEAg4whggN1LjgF2r4HNCqIM8NNfPS3jFo6TMVeO8c67YoVItWoi//wjUqKEzdqIDQEIQAACEIAABCAAgYwigAF2LzcG2L0GNiuIMsCDZwyW0QtGy9hWY73z/vabyH77iWzbJrLbbjZrI7ZPBBLZh+JTCYRJAgF0TgJkxynQ2LEASUiPxkmAHIAU6BwAESyXkIjGGGDL4hQiPAa4EJBS+JIoA/zCzBfkze/elAlXT/Ae1oYNIhUqiGzcKFK2bAoPPXNKT+QkwsyhlPojRefU1zDeCNA4HqHU/z4ap76GhRkBOheGUmpfk4jGGGD32mOA3Wtgs4IoAzxk1hB5de6r8mHrD73zbt0qssceIr//LlKpks3aiA0BCEAAAhCAAAQgAIGMIoABdi83Bti9BjYriDLAL89+WYZ8M0QmXTvJO6/u/S1VSuSXX0T2399mbcSGAAQgAAEIQAACEIBARhHAALuXGwPsXgObFUQZ4FfnvCqDvx4sn1z3Sey8JUuK6GnQBx1kszZi+0Rg2rRpkpWV5VM0wgSVADoHVRn/6kJj/1gGNRIaB1UZf+tCZ395BjFaIhpjgN0rigF2r4HNCqIM8OvzXpeBXw6Uz6//PHbe3XcXmTNHpGZNm7UR2ycCgwcPlnbt2vkUjTBBJYDOQVXGv7rQ2D+WQY2ExkFVxt+60NlfnkGMlojGGGD3imKA3Wtgs4IoA/zmt2/KY188JtPaToudt3x5kc+NQT7qKJu1ERsCEIAABCAAAQhAAAIZRQAD7F5uDLB7DWxWEGWA3/7+bcn5LEe+uvGr2Hn33Vdkgjkl+vjjbdZGbAhAAAIQgAAEIAABCGQUAQywe7kxwO41sFlBlAEePX+09JzSU2a2mxk77wEHiIwaJWZjqc3aiA0BCEAAAhCAAAQgAIGMIoABdi83Bti9BjYriDLA7/3wnnT/uLvMvnl27LwHHywybJhI/fo2ayO2TwSys7MlJyfHp2iECSoBdA6qMv7Vhcb+sQxqJDQOqjL+1oXO/vIMYrRENMYAu1cUA+xeA5sVRBngcT+Oky4Tu8i8W+bFzlurlsigQSJnn22zNmL7RGDVqlVSpUoVn6IRJqgE0DmoyvhXFxr7xzKokdA4qMr4Wxc6+8sziNES0RgD7F5RDLB7DWxWEGWAP1j0gXQY30G+v/X72HmPOUbk4YdFzjvPZm3EhgAEIAABCEAAAhCAQEYRwAC7lxsD7F4DmxVEGeCPFn8k7d9vLz/c/kPsvCeeKHLvvSIXXWSzNmJDAAIQgAAEIAABCEAgowhggN3LjQF2r4HNCqIM8OSlk+WG/90gi+5YFDvvqaeKdOwocvnlNmsjtk8EJpgTu5s2bepTNMIElQA6B1UZ/+pCY/9YBjUSGgdVGX/rQmd/eQYxWiIaY4DdK4oBdq+BzQqiDPCnP30q17xzjSztuDR23oYNRdq2Fbn6apu1EdsnAiNHjpSWLVv6FI0wQSWAzkFVxr+60Ng/lkGNhMZBVcbfutDZX55BjJaIxhhg94pigN1rYLOCKAM8ddlUaflWS1l257LYeZs0EeOoRG64wWZtxIYABCAAAQhAAAIQgEBGEcAAu5cbA+xeA5sVRBng6cuny8UjL5Zf7voldt7zzxdp1kykfXubtREbAhCAAAQgAAEIQAACGUUAA+xebgywew1sVhBlgGf8MkOajWgmqzuvjp23RQuRBg1EOnSwWRuxfSKwbds2KVOmjE/RCBNUAugcVGX8qwuN/WMZ1EhoHFRl/K0Lnf3lGcRoiWiMAXavKAbYvQY2K4gywLNWzpLGrzSW3+/+PXbeK64QOeEEkS5dbNZGbJ8IdOrUSfr37+9TNMIElQA6B1UZ/+pCY/9YBjUSGgdVGX/rQmd/eQYxWiIaY4DdK4oBdq+BzQqiDPCc1XOkwdAGsq7ruth5W7cWqVVLpHt3m7UR2ycCiXwK6VMJhEkCAXROAmTHKdDYsQBJSI/GSYAcgBToHAARLJeQiMYYYMviFCI8BrgQkFL4kigD/O2v30q9F+vJxuyNsYelJ0AfcIBIz54pPHRKhwAEIAABCEAAAhCAQLAIYIDd64EBdq+BzQqiDPD83+fLCc+dIJu7bY6d95ZbRMqXF8nJsVkbsSEAAQhAAAIQgAAEIJBRBDDA7uXGALvXwGYFUQb4xzU/ytHPHC3b7t0WO++dd4qUKCHy2GM2ayO2TwQSeRedTyUQJgkE0DkJkB2nQGPHAiQhPRonAXIAUqBzAESwXEIiGmOALYtTiPAY4EJASuFLogzw4nWLpdZTtWT7fdtjD6trV5EtW0QGDkzhoWdO6RMmTJCmTZtmzoAzdKTonP7CozEapz+BzBghf5fTX+dENMYAu38+MMDuNbBZQZQB/mn9T3LwgIPl3wf+jZ33vvtEVpvXJD33nM3aiA0BCEAAAhCAAAQgAIGMIoABdi83Bti9BjYriDLAyzcul+qPV5d/7/9Xdtklhvy9eoksWiQydKjN2ogNAQhAAAIQgAAEIACBjCKAAXYvNwbYvQY2K4gywCs3rZSq/auGlkCXKlHKO3ffviKzZ4uMGGGzNmL7RGDVqlVSpUoVn6IRJqgE0DmoyvhXFxr7xzKokdA4qMr4Wxc6+8sziNES0RgD7F5RDLB7DWxWEGWAf938q1R+tLJs675Ndiu1m3fuxx8X+fxzkbfeslkbsX0ikJ2dbQ7s5sRun3AGNgw6B1Ya3wpDY99QBjYQGgdWGl8LQ2dfcQYyWCIaY4DdS4oBdq+BzQqiDPCaLWtkn377hF6DtEfpPbxzDxokYg5Wkv/9z2ZtxIYABCAAAQhAAAIQgEBGEcAAu5cbA+xeA5sVRBng9dvWS8W+FWXjPRul7G5lvXM//7zIqFEi48fbrI3YEIAABCAAAQhAAAIQyCgCGGD3cmOA3Wtgs4IoA7zpz01S7uFysq7rOqlQpoJ37mHDRLR//LHN2ogNAQhAAAIQgAAEIACBjCKAAXYvNwbYvQY2K4gywFu2b5E9++wpv3f5XSrtUck792uviegy6M8+s1kbsX0iMHjwYGnXrp1P0QgTVALoHFRl/KsLjf1jGdRIaBxUZfytC5395RnEaIlojAF2rygG2L0GNiuIMsB//v2nlOldRlZ3Xi377bmfd25d/qwnQX/5pc3aiO0TgWnTpklWVpZP0QgTVALoHFRl/KsLjf1jGdRIaBxUZfytC5395RnEaIlojAF2rygG2L0GNiuIMsB///u3lO5VWn7p9IvsX3Z/79zvvSfSvft/r0KiQQACEIAABCAAAQhAAAK+EMAA+4IxoSAY4ITwBf7mKAO8Y8cOKfFgCVl25zKpVq6a9wA++ECkQweR778P/AApEAIQgAAEIAABCEAAAqlCAAPsXikMsHsNbFYQZYA1WYmeJWRJhyVyUIWDvHNPnixyww0iixbZrI3YPhGYP3++1K5d26dohAkqAXQOqjL+1YXG/rEMaiQ0Dqoy/taFzv7yDGK0RDTGALtXFAPsXgObFXgaYF0CveC2BXJIxUO8c0+dKtKypciyZTZrI7ZPBPqa/dpdu3b1KRphgkoAnYOqjH91obF/LIMaCY2Dqoy/daGzvzyDGC0RjTHA7hXFALvXwGYFnga4zENlZG77uVKzUk3v3DNmiDRrJrJ6tc3aiA0BCEAAAhCAAAQgAIGMIoABdi83Bti9BjYr8DTA+hqkr2/6WmrvE2PZ7Jw5Ig0aiKxbZ7M2YkMAAhCAAAQgAAEIQCCjCGCA3cuNAXavgc0KPA1wuZxy8sUNX0id/ep45zZ7SuWEE0Q2b7ZZG7EhAAEIQAACEIAABCCQUQQwwO7lxgC718BmBZ4GuGLfijKlzRQ5pvIx3rkXLxapVUtk+3abtRHbJwKJ7EPxqQTCJIEAOicBsuMUaOxYgCSkR+MkQA5ACnQOgAiWS0hEYwywZXEKER4DXAhIKXyJpwHe55F9ZOI1E+W4/Y/zHtry5SLVq4v88485MrpECg8/M0pP5CTCzCCUHqNE5/TQsaBRoDEapz+BzBghf5fTX+dENMYAu38+MMDuNbBZgacBrvxoZXn/qvflxKoneuf+9VeRypVFtm4VKVPGZn3EhgAEIAABCEAAAhCAQMYQwAC7lxoD7F4DmxV4GuCqj1WVd1q+I6dUO8U79/r1IhUrimzYIFJOQ9AgAAEIQAACEIAABCAAgUQJYIATJZj4/RjgxBkGOYKnAa7+eHUZeelIObX6qd61b9kisueeIr/9JrLPPkEeH7UZAtOmTZOsrCxYpDkBdE5zgfm7nP4Co3FGaKyD5N/r9Jc6EY0xwO6fDwywew1sVuBpgGs8UUNeufgVOeOgM7xz697fUqVEVqwQqVrVZn3E9oHA4MGDpV27dj5EIkSQCaBzkNXxpzY09odjkKOgcZDV8a82dPaPZVAjJaIxBti9qhhg9xrYrMDTAB/65KHy4oUvSsMaDWPnLllSZOFCkYMPtlkfsSEAAQhAAAIQgAAEIJAxBDDA7qXGALvXwGYFngb48IGHyzPNnpFGhzSKnXuPPURmzhSpXdtmfcSGAAQgAAEIQAACEIBAxhDAALuXGgPsXgObFXga4CMGHSEDzhkgTQ5tEjv33nuLTJokUreuzfqIDQEIQAACEIAABCAAgYwhgAF2LzUG2L0GNivwNMBHPX2U9GvcT86teW7s3PvvL/LuuyKnxDgp2mbVxC4SgezsbMnJySnSPVycegTQOfU0K2rFaFxUYql3PRqnnmbFqRidi0Mtte5JRGMMsHutMcDuNbBZgacBrvtsXel9Vm85//DzY+fWvb/DhonUr2+zPmL7QGDVqlVSpUoVHyIRIsgE0DnI6vhTGxr7wzHIUdA4yOr4Vxs6+8cyqJES0RgD7F5VDLB7DWxW4GmAjx98vDzQ4AFpXrt57Ny69/fJJ0WaFLBM2mblxIYABCAAAQhAAAIQgECaEcAAuxcUA+xeA5sVeBrgk54/SbJPz5YWR7SInfvYY0V69RK54AKb9REbAhCAAAQgAAEIQAACGUMAA+xeagywew1sVuBpgLNeyJK76t0ll9W5LHZu3fvbubPIZQVcY7NyYheawIQJE6Rp06aFvp4LU5MAOqembkWpGo2LQis1r0Xj1NStqFWjc1GJpd71iWiMAXavNwbYvQY2K/A0wKe9dJrcfvLtcsVRV8TO3aCByI03ilx9tc36iO0DgZEjR0rLli19iESIIBNA5yCr409taOwPxyBHQeMgq+NfbejsH8ugRkpEYwywe1UxwO41sFmBpwGuP6S+tDuhnbQ6plXs3Lr39/LLRdq2tVkfsSEAAQhAAAIQgAAEIJAxBDDA7qXGALvXwGYFngb4zGFnynXHXiet67aOnfvCC8WsqxW59Vab9REbAhCAAAQgAAEIQAACGUMAA+xeagywew1sVuBpgM9++WxpdXQrue6462Ln1r2/WVkid91lsz5i+0Bg27ZtUqZMGR8iESLIBNA5yOr4Uxsa+8MxyFHQOMjq+FcbOvvHMqiREtEYA+xeVQywew1sVuBpgJsObyqXHXmZtD2+gOXN11wjcsQRIt262ayP2D4Q6NSpk/Tv39+HSIQIMgF0DrI6/tSGxv5wDHIUNA6yOv7Vhs7+sQxqpEQ0xgC7VxUD7F4DmxV4GuDzXj1PmtdqLu1ObBc7t+79rVpV5MEHbdZHbB8IJPIppA/pCZEkAuicJNAO06CxQ/hJSo3GSQLtOA06OxYgCekT0RgDnASB4qTAALvXwGYFngb4gtcukHMPO1duOemW2Llvu01kzz1F+va1WR+xIQABCEAAAhCAAAQgkDEEMMDupcYAu9fAZgWeBvii1y+SRgc3kttPuT12bn0H8PbtIgMG2KyP2BCAAAQgAAEIQAACEMgYAhhg91JjgN1rYLMCTwN8yRuXyBkHniEdszrGzt29u8iaNSLPPmuzPmL7QCCRd9H5kJ4QSSKAzkkC7TANGjuEn6TUaJwk0I7ToLNjAZKQPhGNMcBJEChOCgywew1sVuBpgC9/83I55YBT5K5TCzjhuVcvkUWLRIYOtVkfsX0gMGHCBPPGKvPKKlpaE0DntJY3NDg0RuP0J5AZI+TvcvrrnIjGGGD3zwcG2L0GNivwNMBXjrpSjqtynNx92t2xcz/yiMisWSKvvWazPmJDAAIQgAAEIAABCEAgYwhggN1LjQF2r4HNCjwN8NVvXy119q0j2Wdkx8795JMikyaJvPOOzfqIDQEIQAACEIAABCAAgYwhgAF2LzUG2L0GNivwNMDXvnut1Ny7ptxb/97YuQcPFhk9WmTsWJv1EdsHAqtWrZIqVar4EIkQQSaAzkFWx5/a0NgfjkGOgsZBVse/2tDZP5ZBjZSIxhhg96pigN1rYLMCTwN8/ejr5aDyB8kDDR+InXvYMBHtH39ssz5i+0AgOztbcnJyfIhEiCATQOcgq+NPbWjsD8cgR0HjIKvjX23o7B/LoEZKRGMMsHtVMcDuNbBZgacBvvF/N8r+ZfeXB898MHbu118XGThQ5PPPbdZHbAhAAAIQgAAEIAABCGQMAQywe6kxwO41sFmBpwG++b2bpdLulaR3o96xc7/7roieBP311zbrIzYEIAABCEAAAhCAAAQyhgAG2L3UGGD3GoQr6Gl+09b0vU3/0vRbTP+2gPLamO/pe4xqmr7B9BGm35nvek8DfMv7t0i53crJw2c/HDv8uHEiXbqIzJsXHEJUAgEIQAACEIAABCAAgRQmgAF2Lx4G2L0GWoFxmiHzepHpC02/z/TLTK9l+maPEtX4djRdDfOnpu9h+mGmTyuMAb597O1SplQZ6dekX+zR6wnQN95oqtFyaEEmMNgcWNauXbsgl0htPhBAZx8gBjwEGgdcIB/KQ2MfIKZACHROAZESLDERjTHACcL34XYMsA8QfQixxMR4wvQBubFKmV9Xmq6meLiHqV1hvnaN6WadcoHNcwa44/iOUmKXEtK/af/YN0+dKtKypciyZT4MjxA2CUybNk2ysrJspiB2AAigcwBEsFwCGlsGHIDwaBwAEZJQAjonAbLjFIlojAF2LJ5JjwF2r0F5U8I60081Pe8M7gfmz3NN19nevO0c8wd9N5F+vYPpumRaN+p2Mn1Wvms9DfBdE+6Sv//9WwacG/bbHhBmzhRp2lTkt9/cE6ICCEAAAhCAAAQgAAEIpAEBDLB7ETHA7jWobkr4yfQjTF+Qp5yR5ve6t/emfCVebf78sulfmK6/X2t6D9OvNF2XTOs94eZpgO+eeLds2b5Fnjrvqdij/9ZsP65XT2TjRveEqAACEIAABCAAAQhAAAJpQAAD7F5EDLB7DWLNAE80pc02vXO+Ei80f9alz+eaPiH3eyXNr+pULzF9fDwDnP1htqzftl6eOf+Z2KNftMhYcuPJ//rLPSEqKJDA/PnzpXbt2lBKcwLonOYCm+GhMRqnP4HMGCF/l9Nf50Q0xgC7fz4wwO410AoWm/6k6boPWFtp038xXQ+6ejVfieEZ4/PymN2wAb7YfE2XTodbaAa4SZMmUqdOndDXzjzzTHlo2ENS58o68tIlL4W+NnLkSKlQoYJZ8WyWPJu2atUqGfDQQ5IzaJDIP/+IlCghutm/bt26O/ea6l/80aNHS9euXXcm69u3rzRv3nynGdP9EbNnz444oElfHN6hQwepUqVK6L4JEybI+vXrzXZjs9/YtG3btkm3bt2kT58+UqZMmdj1DRggOTk5O3Nncn3Dhg2TESP0EHD4pfPzp3+/9O8Ofz/++7AnHf99ecj8u7t27Vr+/UtTffX/t8YnEwqwAAAgAElEQVSNG8vEiRP5/y3Nfz4YYH5G0Z+PPH++4ueXtPj5T/9PrlGjRvTPzzH03bBhQ+hnXv03fsGCBaH/w0zTSTCWWu78aT55v8EAJ491QZl0llcPvGph+o+m32+6zubqkuYtHje+bb5W2fTwEmi9Xk+NPtL0P/Jc77kE+oFJD8jyjcvlxeYvxq7p999F9t3XZDfpd989GJSoAgIQgAAEIAABCEAAAilMgBlg9+JhgN1rEK5A3wOs+30rmq4fC91qur4HuIbpOkPc0PRPci8ua37V2WKd8VUNdT+wmujv8g3H0wD3mtJLFq5bKMMuGhZ79Js2iZQzt68z53OZ2WEaBCAAAQhAAAIQgAAEIJAYAQxwYvz8uBsD7AfF4MbwNMA5n+bIvN/myast8q+uzjOQ7dtFdt3VvIzJvI0pd7lycIdJZRCAAAQgAAEIQAACEAg+AQywe40wwO41sFmBpwF+dOqj8uWKL+WNy96InXvHDpGSZmvxEvOK4oMOslkjsRMkoPtQ8u7FTjActweUADoHVBgfy0JjH2EGNBQaB1QYn8tCZ5+BBjBcIhpjgN0LigF2r4HNCjwN8IBpA2TKT1Pk7Za6lbiAtsce5s3C5tXCtXQrMi2oBBI5iTCoY6KuaALonP5PBRqjcfoTyIwR8nc5/XVORGMMsPvnAwPsXgObFXga4EFfDpLxi8bLmCvHFJy7otmOPGWKyDHH2KyR2BCAAAQgAAEIQAACEMgIAhhg9zJjgN1rYLMCTwP83NfPyTvz35FxrcYVnHv//cW860jk5JNt1khsCEAAAhCAAAQgAAEIZAQBDLB7mTHA7jWwWYGnAX5p1ksyYu4I+bD1hwXnNu83k1deETnjDJs1EjtBAvouuaysrASjcHvQCaBz0BVKvD40Tpxh0COgcdAV8qc+dPaHY5CjJKIxBti9shhg9xrYrMDTAL8y+xV5cdaLMrnN5IJz164tMnCgSOPGNmskdoIEBg8eLO3atUswCrcHnQA6B12hxOtD48QZBj0CGgddIX/qQ2d/OAY5SiIaY4DdK4sBdq+BzQo8DfBrc1+Tp756Sj6//vOCc9etK9K7t8j559uskdgQgAAEIAABCEAAAhDICAIYYPcyY4Dda2CzAk8D/NZ3b0m/qf1ketvpBec+5RSRLl1ELr3UZo3EhgAEIAABCEAAAhCAQEYQwAC7lxkD7F4DmxV4GuB3578rD055UGa2m1lw7oYNRW64QeSaa2zWSGwIQAACEIAABCAAAQhkBAEMsHuZMcDuNbBZgacBfv+H9yX7o2yZ035OwbnPPVfk4otFbrrJZo3ETpBAdna25OTkJBiF24NOAJ2DrlDi9aFx4gyDHgGNg66QP/Whsz8cgxwlEY0xwO6VxQC718BmBZ4G+INFH0iH8R3k+1u/Lzh3ixYiDRqIdOhgs0ZiJ0hg1apVUqVKlQSjcHvQCaBz0BVKvD40Tpxh0COgcdAV8qc+dPaHY5CjJKIxBti9shhg9xrYrMDTAH+85GO5acxNsvCOhQXnbtVK5OijRe65x2aNxIYABCAAAQhAAAIQgEBGEMAAu5cZA+xeA5sVeBrgT3/6VK555xpZ2nFpwbnbthU54ACRnj1t1khsCEAAAhCAAAQgAAEIZAQBDLB7mTHA7jWwWYGnAf5i2Rdy6ZuXyopOKwrOffvtIrvvLvLIIzZrJHaCBCZMmCBNmzZNMAq3B50AOgddocTrQ+PEGQY9AhoHXSF/6kNnfzgGOUoiGmOA3SuLAXavgc0KPA3wjF9mSLMRzWR159UF5777bpEtW0SeespmjcROkMDIkSOlZcuWCUbh9qATQOegK5R4fWicOMOgR0DjoCvkT33o7A/HIEdJRGMMsHtlMcDuNbBZgacB/mbVN3LWsLNkbde1Bed+4AGR5ctFXnzRZo3EhgAEIAABCEAAAhCAQEYQwAC7lxkD7F4DmxV4GuBvf/1W6r1YTzZmbyw4d9++IrNni4wYYbNGYkMAAhCAAAQgAAEIQCAjCGCA3cuMAXavgc0KPA3wgt8XyLGDj5Wt3bcWnPvJJ0UmTRJ55x2bNRI7QQLbtm2TMmXKJBiF24NOAJ2DrlDi9aFx4gyDHgGNg66QP/Whsz8cgxwlEY0xwO6VxQC718BmBZ4GePG6xVLrqVqy/b7tBed+/nmRUaNExo+3WSOxEyTQqVMn6d+/f4JRuD3oBNA56AolXh8aJ84w6BHQOOgK+VMfOvvDMchREtEYA+xeWQywew1sVuBpgJdtWCYHPnGg/Hv/v7LLLgU8AsOHi6gJnjLFZo3ETpBAIp9CJpia25NIAJ2TCNtRKjR2BD6JadE4ibAdpkJnh/CTlDoRjTHASRKpgDQYYPca2KzA0wCv3LRSqvavGpoBLlWiVOz8Ovur+4C//NJmjcSGAAQgAAEIQAACEIBARhDAALuXGQPsXgObFXga4N+3/C779ttXtnTbIruXNu/5jdXGjhXp2lVk7lybNRIbAhCAAAQgAAEIQAACGUEAA+xeZgywew1sVuBpgNdvWy8V+1aUjfdslLK7lY2dXw/AattWZNEimzUSO0ECibyLLsHU3J5EAuicRNiOUqGxI/BJTIvGSYTtMBU6O4SfpNSJaIwBTpJIBaTBALvXwGYFngZ481+bZa+cvWTN3Wtk7933jp1/2jSRFi3k/9g7Ezibyj+MP9YGudYYhLEkEpIwQraYSguyq1RoLKWQGKW/EhNFyNJQlkRJKkk1KVTUlC0KYxdiZL323f89dzK55t65595z3vOee+Y5///7Gcv7/n7P+T5n5HHuOS/27pWpkbUNEkhMTERMTIzBKlxudwL02e4OGddHj40ztHsFemx3h8zRR5/N4WjnKkY8ZgBW7ywDsHoPZCrwGYDPXjiLiGERSOmXgqLXF/Xff906oEED4MgRmRpZmwRIgARIgARIgARIgAQyBQEGYPU2MwCr90CmAp8B+NLlS8j2ajbs6bMHJVwl/PffsgWoUgUQ+8zyIAESIAESIAESIAESIAESMEaAAdgYPzNWMwCbQdG+NXwGYE1u1leyYvuz2xGVP8q/+j17gJIlgYsXxYKs9j3LTK4sJSUFkZGRmZyC80+fPtNj5xNw/hny+9j5HmtnSJ+d77MRjxmA1V8fDMDqPZCpwG8Avu6167C+53qUL1jef/9Dh4DChYGTJ4HcuWXqZG0DBOLi4hAfH2+gApeGAwH6HA4uGdNIj43xC4fV9DgcXDKukT4bZ2j3CkY8ZgBW7y4DsHoPZCrwG4CvH349VnRbgUo3VPLf/9QpIE8e4OBBoFAhmTpZmwRIgARIgARIgARIgAQcT4ABWL3FDMDqPZCpwG8Azv96fvz0xE+oUlQ84+vvuHQJyJYN2L0buPFGmTpZmwRIgARIgARIgARIgAQcT4ABWL3FDMDGPBDpEP3FeFKMKDFyinGfGMXEeM9YaVNW+w3AN7xxAxIfScTtxW7PuFFEBKC9DbpCBVMEsQgJkAAJkAAJkAAJkAAJZFYCDMDqnWcANubBELH8YTG0BzA/EEN7U1RlMWaKESBZGmusc7XfAFxsVDHMbz8ftUrUyrhUgQLA0qVAtWo6W3Ka1QQSEhIQGxtrdVv2s5gAfbYYuIJ29FgBdItb0mOLgStqR58VgbewrRGPGYAtNMpPKwZgYx7sFMvvFWOjGOLzwp4ArL0tKkUMLXyqPvwG4FJvlcKHD3+IuqXqZqyxhNgmad48IDpa9bmwvx8CSUlJwh764/QLhD473WGAHtNj5xPIHGfI72Xn+2zEYwZg9dcHA7AxD46I5drDseI1yWkBOL/48VYxxOuTlR9+A3DZsWUx7aFpaBDVIGOR5cVboqdMARo1Un4yFEACJEACJEACJEACJEAC4UyAAVi9ewzAxjxYKpZPE2PGVQH4UfHjR8SIMVbalNV+A/DN42/GhPsm4O6yd2fcqIp4SdaIEeLJZu3RZh4kQAIkQAIkQAIkQAIkQAKhEmAADpWceesYgI2xrC2WfyfGF2J0+DcMtxFftVT5m7HSpqz2G4ArT6yMUc1G4Z7y92TcqJZ4RnjAAPGks/aoMw87EkhOTkbFihXtKI2aTCRAn02EadNS9Nimxpgoix6bCNPGpeizjc0xSZoRjxmATTLBQBkGYAPw/l16s/jaS4ybxNgnxkQxVhova0oFvwH4tnduw9BGQ/HAzQ9k3KiB+Ih0t27inrZ2U5uHHQmMEHfoB2j/SMHD0QTos6Pt9ZwcPabHzieQOc6Q38vO99mIxwzA6q8PBuDQPdC2PPpMDC0Zas8C2/HwG4BrTqmJuHpxaFWpVca67xF3iLW7v1oI5kECJEACJEACJEACJEACJBAyAQbgkNGZtpAB2BjKg2J5aTG0l2DZ8fAbgOu8Vwd9ovugbeW2Getu2RJo2BB49lk7nh81kQAJkAAJkAAJkAAJkEDYEGAAVm8VA7AxD94WyzeJMd5YGWmr/Qbgu6bdhdgasehUtVPGzTt2BKpWBQYOlCaShUmABEiABEiABEiABEggMxBgAFbvMgOwMQ8+EsvFLVKsFmObGJf/Lad9fcxYaVNW+w3AjWc0RudqndH5ts4ZN+raFdD2An7lFVMEsYj5BIw8h2K+GlaURYA+yyJrn7r02D5eyFJCj2WRtVdd+mwvP2SoMeIxA7AMR4KryQAcHK9rZ0/3s1wLwE8YK23Kar8BOOaDGLS5pQ263i4CbkbHM88AuXIBI0eaIohFzCdg5E2E5qthRVkE6LMssvapS4/t44UsJfRYFll71aXP9vJDhhojHjMAy3AkuJoMwMHxCrfZfgNw89nN8UCFB9D9ju4Zn5P2duETJ4AJE8Lt3KmXBEiABEiABEiABEiABGxFgAFYvR0MwMY9yCpK3CFGKTF2ibFCjCsfhTZe3VgFvwG4xUct0KRMEzxTW9zhzeh49VVg+3Zg+nRjSriaBEiABEiABEiABEiABDI5AQZg9RcAA7AxD4qJ5V+IcbsY2lZIBcRYI8aDYuw1VtqU1X4DcOuPW6NuybroU6dPxo1GjQJ+/RX4+GNTBLGI+QSSkpIQHR1tfmFWtBUB+mwrO6SIocdSsNqqKD22lR3SxNBnaWhtU9iIxwzA6m1kADbmgfYSrOvE0B6kPSRGITGmiHFejHbGSpuy2m8A7jCvA6pHVscLdV/IuNE77wALFgALF5oiiEXMJ5CQkIDY2FjzC7OirQjQZ1vZIUUMPZaC1VZF6bGt7JAmhj5LQ2ubwkY8ZgBWbyMDsDEP9ovlt4mx76oy2l3htWIUMVbalNV+A/Bjnz2GioUrYlD9QRk3mjkTeO89YOlSUwSxCAmQAAmQAAmQAAmQAAlkVgIMwOqdZwA25oEWgMUmudC+XjmKih/8YfcA/OT8J1E6X2n8r+H/Mibw6adAfLx4sll7tJkHCZAACZAACZAACZAACZBAqAQYgEMlZ946BmBjLLUHY7WXYGkfgT4qhvYMcIIYGtc2xkqbstpzB/jNN93o10/74X9H7IJY3JDnBrzW+LWMGyUmAn3Ec8IbNpgiiEVIgARIgARIgARIgARIILMSYABW7zwDsDEPSojlX4qh3QU+LEZBMbS7v/eLscdYaVNWewJwzZpu/PabdwDutbAX8l6XF6/f/XrGjZYtAzp1Av76yxRBLGI+gbi4OHGTXtyl5+FoAvTZ0fZ6To4e02PnE8gcZ8jvZef7bMRjBmD11wcDsHEPsokStcQoKcZuMcQrk3HJeFlTKngCcI0abqxc6R2An/vmOWTLkg2jYsRbnjM61oiXWjdtChw8aIogFjGfQEpKCiIjI80vzIq2IkCfbWWHFDH0WApWWxWlx7ayQ5oY+iwNrW0KG/GYAVi9jQzAxjzQ3gCt7fl77qoyOcWPNa5njZU2ZbUnAN92mxtr1ngH4Oe/fR7nL57H2HvHZtxo82agWjXg9GlTBLEICZAACZAACZAACZAACWRWAgzA6p1nADbmwTdi+TgxvrqqTHPx46fFuNdYaVNWewJwlSpurFvnHYDjvouD+6wbE5tPzLjR338DN94IXLgAZNNudvMgARIgARIgARIgARIgARIIhQADcCjUzF3DAGyMp/bcbxktZF5VJp/4sfbAbH5jpU1Z7QnAt9zixvr13gF48OLB2H9yPyY/MDnjRkeOiCebxaPNx44BefOaIopFzCWQKF5UFhMTY25RVrMdAfpsO0tMF0SPTUdqu4L02HaWSBFEn6VgtVVRIx4zAKu3kgHYmAeHxPKbxNCC8JWjkPjBNjsF4JtvdiM52TsAv/rDq9hxdAemPTQtYwLnxKe7rxOf9N4ntjrmc6bGrhZJq+fMmYN27dpJqs6ydiFAn+3ihDwd9FgeW7tUpsd2cUKuDvosl68dqhvxmAFYvYMMwMY8WCyWfy3GG1eV6Sd+/IAYDY2VNmW15w7wTTe5sXmzdwCO/ykeGw5uwMyWMwM3ypEDIkED5coFnssZJEACJEACJEACJEACJEACPgkwAKu/MBiAjXlQRyxfIsb3Ymgb5d4iRpN/x3JjpU1Z7QnAZcu6sW2bdwB+Y/kbWLVvFT5q/VHgRvnFp7l//FFs9qTt9sSDBEiABEiABEiABEiABEggFAIMwKFQM3cNA7BxnpVFiR5iRImxU4xJYqw3XtaUCp4AHBXlxo4d3gF4TNIYLNu1DJ+0/SRwoxJiu+NPxLw6Wt7nYTcCZ86cQUREhN1kUY/JBOizyUBtWI4e29AUkyXRY5OB2rQcfbapMSbKMuIxA7CJRoRYigE4NHBFxbKsYogHYz2H+IwwBopxhxjiVikCbK4bWtMQVnkCcMmSbuza5R2Ax/82Hou2L8L89vMDl61QAZgo3hZ9992B53KG5QT69u2L0aNHW96XDa0lQJ+t5a2iGz1WQd3anvTYWt6qutFnVeSt62vEYwZg63zy14kBODQPPhPLtC2QEv5dPlx87S6G9nFo7SPQw8S4+rng0LoYX+UJwMWLu/H3394BOGFlAr7Y/AUWdlwYuEv16sCQIcBDDwWeyxmWEzDyr5CWi2XDkAnQ55DRhc1Cehw2VoUslB6HjC6sFtLnsLIrJLFGPGYADgm5qYsYgEPDqW1z1EiM7WJoDPeL8agYiWJoKfE1MaqEVtrUVZ4AXLSoGykp3gH4vdXvYc76Ofj20W8DN6xXD+jZE+jYMfBcziABEiABEiABEiABEiABEvBJgAFY/YXBAByaB6fFMi1Rnhejohgr/v35ZfE1jxjaR6O9E2dofYyu8gTgwoXdOHDAW877a9/HtN+nYUln7aZ1gEPbY7ZNG6Br10Az+fskQAIkQAIkQAIkQAIkQAJ+CDAAq780GIBD82CvWFZLjD1itBfjaTHEbVLPke/fX88bWmlTV3kCcIECbhw+7B2AZ/8xG5NWTsJPT/wUuGGrVkCDBsCzzwaeyxmWEzCyF53lYtkwZAL0OWR0YbOQHoeNVSELpcchowurhfQ5rOwKSawRjxmAQ0Ju6iIG4NBwfiyWnRJjjBgTxNAepNWeA9YOLRhPFePW0EqbusoTgPPlc+PoUe8APHf9XIz6ZRSSuiYFbvio+HR3pUrAoEGB53KG5QQSExMRo92l5+FoAvTZ0fZ6To4e02PnE8gcZ8jvZef7bMRjBmD11wcDcGgelBPLvhLjJjF+F6OhGMf+LaWF4uxiaHeFVR+eAHz99W4cP+4dgD9P/hyv/fgaVj61MrDG7uL9XoUKiVd7ae/24kECJEACJEACJEACJEACJBAKAQbgUKiZu4YB2BhPkQpx6JoSBcTPz4ihPSes+vAE4Fy53Dh1yjsAf7n5S7y4+EWs7b42sMZ+/YCLF8X9bi3b8yABEiABEiABEiABEiABEgiFAANwKNTMXcMAbC5Pu1XzBODrrnPjzBnvAJy4NRF9EvtgQ68NgTW//LJ4rZd4r9eUKYHncoblBFJSUhAZGWl5Xza0lgB9tpa3im70WAV1a3vSY2t5q+pGn1WRt66vEY8ZgK3zyV8nBmD1HshU4AnA2bO7cf68dwBesmMJui3ohq29twbuP2IEsFbcKZ49O/BczrCcQFxcHOLj4y3vy4bWEqDP1vJW0Y0eq6BubU96bC1vVd3osyry1vU14jEDsHU+MQCrZ61CgScAZ8nixqVL3gF4+a7l6DCvA3b12RVY1/jxwKJFwPz5gedyBgmQAAmQAAmQAAmQAAmQgE8CDMDqLwzeAVbvgUwFngCs/V8LwFmucnvl3pVoPrs59j+/P3D/adOAWbOA774LPJczSIAESIAESIAESIAESIAEGIBteg0wANvUGJNkpQXgCxdcyJbtv6p/7P8Dd02/C0cGHAnc6mOx69Po0UCSji2TAlfjDBIgARIgARIgARIgARLIlAR4B1i97QzA6j2QqSAtAJ8960LOnP+12nRwE6onVMepF7XtjAMcX38NPP88sH59oJn8fQUEEhISEBsbq6AzW1pJgD5bSVtNL3qshruVXemxlbTV9aLP6thb1dmIxwzAVrnkvw8DsHoPZCpIC8DaNki5cv3XaufRnSg/rjwuvHwhcP9ly4COHYFdOp4XDlyNM0wmkCTuzEdHR5tcleXsRoA+280R8/XQY/OZ2q0iPbabI3L00Gc5XO1U1YjHDMDqnWQAVu+BTAVpAfj4cReuv/6/VnuP70WJ0SVwYfAFZMt61WejfanR3gDdqBFw+LBMraxNAiRAAiRAAiRAAiRAAo4mwACs3l4GYPUeyFSQFoCPHnUhX77/Wh06dQiF3yiMk4NOIneO3Blr2L4duPlm4Nw5eL1JS6Zy1iYBEiABEiABEiABEiABhxFgAFZvKAOweg9kKkgLwIcOuVCw4H+tjp89DtfrLs9LsPJH5M9Yw4EDQJEiwOnTQESETL2sHQKB5ORkVKxYMYSVXBJOBOhzOLkVmlZ6HBq3cFpFj8PJrdC10ufQ2YXLSiMeMwCrd5kBWL0HMhWkBeB//nHhhhv+a3Xu4jlc99p1SOmXgqLXF81Yw5kz8DxA/M8/8CoiUzlr6yYwYsQIDBgwQPd8TgxPAvQ5PH0LRjU9DoZWeM6lx+HpW7Cq6XOwxMJvvhGPGYDV+80ArN4DmQrSAvC+fS5ERv7X6vLly8j6albsem4XSuYrmbEGMdfzCulNm4CyZWXqZW0SIAESIAESIAESIAEScCwBBmD11jIAq/dApoK0APz33y4UL+7dSrsDvL7nepQvWD6wBu3z00uWANWqBZ7LGSRAAiRAAiRAAiRAAiRAAukIMACrvygYgNV7IFNBWgDetcuFktfc6HXFu5DUNQm33HBLYA2lSgGzZwP16gWeyxkkQAIkQAIkQAIkQAIkQAIMwDa8BhiAbWiKiZI8AThLFje2b3chKsq7cuGRhbHo0UWoXqx64JaVKwNvvgnce2/guZxhKQEjz6FYKpTNDBGgz4bwhcViehwWNhkSSY8N4QubxfQ5bKwKWagRj3kHOGTspi1kADYNpS0LeQJw9uxuJCe7UK6ct0ZtH+B5bech+sbowOKjxZy+fYG2bQPP5QxLCRh5E6GlQtnMEAH6bAhfWCymx2FhkyGR9NgQvrBZTJ/DxqqQhRrxmAE4ZOymLWQANg2lLQt5AvB117mxbp0LFSp4aywztgxmtJiBu0rfFVh806ZA+/ZAly6B53IGCZAACZAACZAACZAACZBAOgIMwOovCgZg9R7IVOAJwLlzu7FypQuVKnm3qji+It6+9200LSfCbaCjVSvgLhGUn3su0Ez+PgmQAAmQAAmQAAmQAAmQgA8CDMDqLwsGYPUeyFTgCcB587rx888u3Hqrd6uqk6oivkk8mldoHlhD585AefG26MGDA8/lDEsJJCUlIVr7iDoPRxOgz46213Ny9JgeO59A5jhDfi8732cjHjMAq78+GIDVeyBTgScA58/vxtKlrnQ7GNWcUhNx9eLQqpK4uxvoePppIHduYOTIQDP5+xYTSEhIQGxsrMVd2c5qAvTZauLW96PH1jO3uiM9tpq4mn70WQ13K7sa8ZgB2EqnfPdiAFbvgUwFngBcoIAb333nwu23e7eqN7Uenq71NNrfKp7tDXTExQFHjwKTJgWayd8nARIgARIgARIgARIgARLwQYABWP1lwQCs3gOZCjwBuHBhN776yoWaNb1bNZ7RGJ2rdUbn28THmwMdw4cDGzYAH3wQaCZ/nwRIgARIgARIgARIgARIgAHYltcAA7AtbTFNlCcAFy3qxuefu8Rzot517511L1pVbIVuNboFbvj22xC3kYH58wPP5QwSIAESIAESIAESIAESIIF0BHgHWP1FwQCs3gOZCjwBuHhxN+bOdeHOO71bPfTRQ2hatqnnY9ABj+nTgfffBxYvDjiVE6wlECc+nh4fH29tU3aznAB9thy55Q3pseXILW9Ijy1HrqQhfVaC3dKmRjxmALbUKp/NGIDVeyBTgScAlyzpxqxZLtSv792q7dy2qF2iNvrd2S+whnnzgBEjgN9+CzyXMywlkJKSgsjISEt7spn1BOiz9cyt7kiPrSZufT96bD1zFR3pswrq1vY04jEDsLVe+erGAKzeA5kKPAE4KsqNadNcaNjQu9Ujnz6CyjdURlx98YKrQMe33wLPPgts3BhoJn+fBEiABEiABEiABEiABEjABwEGYPWXBQOweg9kKvAE4LJl3Zg82YUmTbxbdZnfBSXzlcSQhkMCa/jlF6BNG2DPnsBzOYMESIAESIAESIAESIAESCAdAQZg9RcFA7B6D64oeEX8oKsYBcXQPmfcU4z1AeRpAXedGKXEyC7GpWvmewLwTTe5MX68C82aef9ujy97oECuAhjeRLzhOdDx559A3bqimjvQTP6+xQQSExMRExNjcVe2s5oAfbaauPX96LH1zK3uSI+tJq6mH31Ww93KrkY8ZgC20infvRiA1XugKegvRh8xWoixVYzBYojbrbhZjJMZSJwqfq+4GE3FyCGGzwBcsaIbo0e7cOuu3I4AACAASURBVO+93pWe++Y5ZMuSDaNiRgWm8NdfQJkywIULQNasgedzhmUE5syZg3bt2lnWj43UEKDParhb2ZUeW0lbTS96rIa71V3ps9XEre9nxGMGYOv9urYjA7B6DzQFO8QYI8bYf+Vod3P3iaGFYn8b7z4gfu8lMQaJsUgMv3eAK1d24/XXXbj/fu+THbBoAE6dP4W37xNbHAU6tDu/+fOn3gF2aTeWeZAACZAACZAACZAACZAACQRDgAE4GFpy5jIAy+EaTNV8YvIRMbRNipKuWijeOoU/xPD1iuZC4tdXiXGfGEXE0PYm8huAq1RxY+hQFx56yFvW4MWDsf/kfkx+YHJgvZfEzeXsosXOneID19onrnmQAAmQAAmQAAmQAAmQAAkEQ4ABOBhacuYyAMvhGkzVkmKy+HwxKomx6aqFc8SPtQdun/JR7GPxa7+LoT2821CMDAPwbbe5MXiwC61aeVd67cfXsOXwFsxoMUOf3nwiqy9bBlSpom8+Z1lC4MyZM4iIiLCkF5uoI0Cf1bG3qjM9toq0uj70WB17KzvTZytpq+llxGMGYDWeXd2VAVi9B/7uAGsfa14rxvPXSGz/76/VFl8vXhWAtWeAtZ9ffXheguVyNRN7AFdGhQpAo0aNsGTJEgwfPhzjVo3DmpQ1aHGhhfh0c/60Fylpe5uNHTsW8fHxabUSEhJQ7eWXEa3tB1yvHpKTkzF//nwMGDAgbc4IsU/wQ+I2c8WKFT2/lpSUhLVr1yI2NjZtjrZx+LNiO6Ur+9ZqLxE4evRo2jOs2h8ogwYN8ui7Euq05yx06atWDdHR0Z5emUnfuHHjsHDhQs95k59zr7++fft6vi/4/eHcP1969+4tPmiTnX/+Ofi/H3XFyySXL1/O/745/O8H2p/To0ePBv/+4ty//2n/Ta5du7buv5+6xSOE2t95Dx8+jE2bNnn+jiwOLQMcUx9FMp8CBmB7eL5dyBgnhvYcsHZoYXavGM+JMesaidPEz7UXZJ2+aq4WdA+J0VeMmVfN9wTgmjXd6NvXhfZadL7qGJs0Fj/89QM+bfepPgpVq0KkYqB5c33zOcsSAkb+FdISgWxiCgH6bApGWxehx7a2xxRx9NgUjLYvQp9tb5FhgUY85h1gw/gNF2AANozQlALaXV7thVfah5S3iPGyGA+Lob0F+tQ1HcSbqJD7ql/Tnh3WPhJdWgwtBF893xOAo6PdeOYZFzp29K40acUkLNyyEF92/FLfSdSvD3TvDnTqpG8+Z5EACZAACZAACZAACZAACaQRYABWfzEwAKv34IoCbR9g7XnfAmJon4voJYa2D3CUGNod4oZi/OhDrvbr34vhdxukunXd4mPILjz6qPfqqWum4sM/P8SiR7VPW+s4tNdI3yfeu9VT26KYBwmQAAmQAAmQAAmQAAmQQDAEGICDoSVnLgOwHK52qeq5A3zXXW488YQLjz/uLWvWulmYvHoyfnj8B316tTu/t94KiOd4ediHgJG96OxzFlQSiAB9DkQo/H+fHoe/h4HOgB4HIuSM36fPzvAxo7Mw4jEDsPrrgwFYvQcyFXgCcKNGbvGpZRe6dPFuNXf9XIz6ZRSSul69+1IGcnqJm9J580JsKixTM2sHSUB7qUJMTEyQqzg93AjQ53BzLHi99Dh4ZuG2gh6Hm2Oh6aXPoXELp1VGPGYAVu80A7B6D2Qq8ATgu+92o00bF566ZkOlLzZ9gSFLh2B17Gp9GsRbDcXr64B33tE3n7NIgARIgARIgARIgARIgATSCDAAq78YGIDVeyBTgScAN2vmRosWLvTo4d3qm63foN+3/bC+p/aosY5DbHOE38X2wx9+qGMyp5AACZAACZAACZAACZAACVxNgAFY/fXAAKzeA5kKPAH4nnvcYuciF55+2rvVkh1L0G1BN2ztvVWfBu3O7xdfAF99pW8+Z1lCQNu3+cq+ypY0ZBMlBOizEuyWNqXHluJW0oweK8FueVP6bDlyyxsa8ZgB2HK70jVkAFbvgUwFngDcvLkbTZu68Oyz3q2W71qODvM6YFefXfo0fPQR8PbbwPLl+uZzliUE4sRLyeK1/Zl5OJoAfXa0vZ6To8f02PkEMscZ8nvZ+T4b8ZgBWP31wQCs3gOZCjwB+MEH3WjQwIW+fb1brdy7Es1nN8f+5/fr0/D118DzYsvi9To/Mq2vKmeRAAmQAAmQAAmQAAmQQKYgwACs3mYGYPUeyFTgCcAtW7pRp44L/ft7t1q3fx0aTG+AIwOO6NPw889A27bAnj365nMWCZAACZAACZAACZAACZBAGgEGYPUXAwOweg9kKvAE4Nat3ahRw4WBA71bbTq4CdUTquPUi6f0adDu/EZHA8eP65vPWSRAAiRAAiRAAiRAAiRAAgzANroGGIBtZIYEKZ4A3LatG1WruvDii94ddh7difLjyuPCyxf0tf77b+DGG4Hz54Hs2fWt4SzpBBISEhAbGyu9DxuoJUCf1fK3ojs9toKy2h70WC1/q7rTZ6tIq+tjxGPeAVbn25XODMDqPZCpwBOAO3Rwo1IlFwYP9m619/helBhdAhcGX0C2rNkC6zhxAsibFzh0CChYMPB8zrCEQFJSkrgxL+7M83A0AfrsaHs9J0eP6bHzCWSOM+T3svN9NuIxA7D664MBWL0HMhV4AvAjj7hRrpwLQ4Z4tzp06hAKv1EYJwedRO4cuQPruHwZyJED2LIFKFMm8HzOIAESIAESIAESIAESIAESSCPAAKz+YmAAVu+BTAWeANy5sxslS7owdKh3qxPnTiBvfF4ceuEQCubSeUe3UCHgu++A6tVl6mZtEiABEiABEiABEiABEnAcAQZg9ZYyAKv3QKYCTwB+8kk3ihZ1Yfhw71YXL11E9qHZsafPHpRwldCno3x5YPJkoHFjffM5SzqB5ORkVKxYUXofNlBLgD6r5W9Fd3psBWW1PeixWv5WdafPVpFW18eIxwzA6ny70pkBWL0HMhV4AnDXrm7xyK4LI0akb5VzaE5s6LUB5QuKYKvnqFULeOEFoHVrPbM5xwICI4SxAwYMsKATW6gkQJ9V0remNz22hrPKLvRYJX3retNn61ir6mTEYwZgVa7915cBWL0HMhV4AnBsrBvXX+/Cm2+mb5Xv9XxY9sQyVClaRZ+Oe+4BHn4Y6NZN33zOIgESIAESIAESIAESIAES8BBgAFZ/ITAAq/dApgJPAO7Rw43rrnPhrbfStyo2qhjmt5+PWiXEnV09R8eOQLVqELcc9czmHBIgARIgARIgARIgARIggX8JMACrvxQYgNV7IFOBJwA//bQbWbK4MG5c+lZlx5bFtIemoUFUA306evWCuJ0Mn5+n1leBs0iABEiABEiABEiABEggUxJgAFZvOwOweg9kKvAE4GefdeP8eRcmTEjfqvLEyhjVbBTuKS8+2qzn0DYTTkkBpkzRM5tzLCBg5DkUC+SxhUkE6LNJIG1chh7b2ByTpNFjk0DavAx9trlBJsgz4jEDsAkGGCzBAGwQoM2XewJw375unDzpwjvvpFd7x+Q78GL9F9GyUkt9p6J9jnr5cuCTT/TN5yzpBIy8iVC6ODYwjQB9Ng2lbQvRY9taY5owemwaSlsXos+2tscUcUY8ZgA2xQJDRRiADeGz/WJPAO7f340jR1w+b9rWn1YfPe7ogY5VxLO9eo4ZMwBtLF6sZzbnkAAJkAAJkAAJkAAJkAAJ/EuAAVj9pcAArN4DmQo8AXjgQDf++ceF995L36rZzGZoV7kdutzeRZ+OL74AXn4Z+P13ffM5iwRIgARIgARIgARIgARIwEOAAVj9hcAArN4DmQo8AXjQIDf+/tuF6dPTt3roo4fQtGxTPF3raX06li0DtDdB79qlbz5nSSeQlJSE6Oho6X3YQC0B+qyWvxXd6bEVlNX2oMdq+VvVnT5bRVpdHyMeMwCr8+1KZwZg9R7IVOAJwIMHu7FjhwszZ6Zv1f6T9qhRrAb61+2vT8eGDUDt2sDx4/rmc5Z0AgkJCYiNjZXehw3UEqDPavlb0Z0eW0FZbQ96rJa/Vd3ps1Wk1fUx4jEDsDrfGIDVs7dCgScADxnixqZNLsyenb7lE/OfQJn8ZfByA/GxZj2H9gboYsWAs2eBnDn1rOAcEiABEiABEiABEiABEiABQYABWP1lwDvA6j2QqcATgF991Y0//3Rhzpz0rXou7Il81+VD/N3x+nRowTciInUrpKJF9a3hLBIgARIgARIgARIgARIgAQZgG1wDDMA2MEGiBE8AHjbMjdWrXT53LuqX2A8XLl3A2HvH6peRJw+wciVQqZL+NZxJAiRAAiRAAiRAAiRAApmcAO8Aq78AGIDVeyBTgScAv/66G0lJLnz2WfpWLy1+Cf+c/AeTH5isX0fJksBHHwF16+pfw5nSCMTFxSE+XucdfGkqWFg2Afosm7D6+vRYvQeyFdBj2YTtUZ8+28MHmSqMeMwALNMZfbUZgPVxCtdZngA8cqQbP/3kgraD0bXHsB+HIflQMma29PGGLH9nXa0aMGwYcP/94crFUbpTxMfRIyMjHXVOPJn0BOiz868KekyPnU8gc5whv5ed77MRjxmA1V8fDMDqPZCpwBOAR41y4/vvXVi4MH2r0b+Mxs+7f8YnbT/Rr6NhQ+CJJ4DOnfWv4UwSIAESIAESIAESIAESyOQEGIDVXwAMwOo9kKnAE4DHjHHj669d+Oab9K0mrZiEL7d8iYUdfaRjf8oefhioVw/o00emdtYmARIgARIgARIgARIgAUcRYABWbycDsHoPZCrwBOC333Zj/nwXFi1K32rG7zMwY+0MLO68WL+O7t2BggWB4cP1r+FMaQQSExMRExMjrT4L24MAfbaHDzJV0GOZdO1Rmx7bwwfZKuizbMLq6xvxmAFYvX8MwOo9kKnAE4AnTnSLN0C7xMeg07f6eP3HeCvpLfzS5Rf9Ol56CfjnH2ByEC/O0l+dM4MkMEfsb9WuXbsgV3F6uBGgz+HmWPB66XHwzMJtBT0ON8dC00ufQ+MWTquMeMwArN5pBmD1HshU4AnACQluzJ7twtKl6Vst2LQAg5cMxu/df9evY6zYMkkr5uu10vqrcCYJkAAJkAAJkAAJkAAJZCoCDMDq7WYAVu+BTAWeADxlihszZrjEm6DTt/pu+3fo9VUvbHp6k34ds2YB77wDnwX1V+FMEiABEiABEiABEiABEshUBBiA1dvNAKzeA5kKPAH4vffcePddF37+OX2r5buWo8O8DtjVZ5d+Hd9+C/TuDSQn61/DmdIInDlzBhEREdLqs7A9CNBne/ggUwU9lknXHrXpsT18kK2CPssmrL6+EY8ZgNX7xwCs3gOZCjwBePp0NyZOdOHXX9O3Wr1vNWI+iMGB/gf061izBmjaFDh4UP8azpRGoG/fvhg9erS0+ixsDwL02R4+yFRBj2XStUdtemwPH2SroM+yCauvb8RjBmD1/jEAq/dApgJPAJ45040xY1xYuTJ9q40HNqLmlJo4MeiEfh27dwOlSwPnzwPZsulfx5lSCBj5V0gpglhUCgH6LAWrrYrSY1vZIUUMPZaC1XZF6bPtLDFdkBGPGYBNtyPoggzAQSMLqwWeADx7thsjR7qg3bi99th5dCfKjSuHC4MvIEsWnZfD6dNA7typb4K+4YawAkKxJEACJEACJEACJEACJKCKAAOwKvL/9dWZeNQLpYKQCHgC8Jw5brz2mgvr1qWvsf/EfkSOisTZl84iZ7ac+ptcfz3w22/ALbfoX8OZJEACJEACJEACJEACJJCJCTAAqzefAVi9BzIVeALwJ5+48fLLLqxfn77VsbPHkO/1fDgy4AjyR+TXr6VMGYhXSwN33aV/DWdKIWBkLzopglhUCgH6LAWrrYrSY1vZIUUMPZaC1XZF6bPtLDFdkBGPGYBNtyPoggzAQSMLqwWeAPzpp27Exbl8vrT5/MXzyPlaTuztuxfF8hbTf3I1awIDBwIPP6x/DWdKIZCYmIiYmBgptVnUPgTos328kKWEHssia5+69Ng+XshUQp9l0rVHbSMeMwCr95ABWL0HMhV4AvD8+W706+fCli2+W2V/NTs2P7MZZQuU1a/lvvuAhx4CYmP1r+FMEiABEiABEiABEiABEsjEBBiA1ZvPAKzeA5kKPAH4yy/deOYZF7Zv990qb3xeJHVJQuUilfVreewxoEIF4KWX9K/hTBIgARIgARIgARIgARLIxAQYgNWbzwCs3gOZCjwB+Ouv3eje3YWdO323KvJGEXzV6SvcUfwO/Vr69QMuXoTYX0n/Gs6UQiAlJQWRkZFSarOofQjQZ/t4IUsJPZZF1j516bF9vJCphD7LpGuP2kY8ZgBW7yEDsHoPZCrwBODERDe6dHFB277X1xE1JgozW85E/dL19Wt5/XVg7Vrgww/1r+FMKQTi4uIQHx8vpTaL2ocAfbaPF7KU0GNZZO1Tlx7bxwuZSuizTLr2qG3EYwZg9R4yAKv3QKYCTwD+7js3Hn3Uhb17fbe6ZcIteCvmLcSUD+JFStOnA++/DyxeLFM/a5MACZAACZAACZAACZCAYwgwAKu3kgFYvQcyFXgC8OLFbrRv78L+/b5b1ZpSCwPrDUSrSq30a/n6a+D55+FzbyX9VTiTBEiABEiABEiABEiABDINAQZg9VYzAKv3QKYCTwD+4Qc3WrVy4eBB360az2iMx297HI9VEy+20nusWQPcfTdw6JDeFZxHAiRAAiRAAiRAAiRAApmaAAOwevsZgNV7IFOBJwAvW+bG/fe7cOSI71YPfvggYsrFoFetXvq17NsHFC8OnD0L5Mypfx1nmk4gISFB7EbF7ahMB2uzgvTZZoZIkEOPJUC1WUl6bDNDJMmhz5LA2qisEY8ZgNUbyQCs3gOZCjwB+Jdf3GjWzIVjx3y36jivI6oVrYYB9Qbo13LhQmrw3bULuPFG/es403QCSUlJiI6ONr0uC9qLAH22lx8y1NBjGVTtVZMe28sPWWrosyyy9qlrxGMGYPU+MgCr90CmAk8A/u03Nxo2dOHkSd+tnlrwFIrmKYqhjYcGp6VIEeCrr4A7gtg+KbgOnE0CJEACJEACJEACJEACjiHAAKzeSgZg9R7IVOAJwKtWuXHnnS6cOeO7Vd/Evrh8+TLeuuet4LRUqQJo2yE1bx7cOs4mARIgARIgARIgARIggUxIgAFYvekMwOo9kKnAE4DXrHGjZk0Xzp/33erlJS9j3/F9mPLglOC0NG0K8XppiE2Gg1vH2aYSSE5ORsWKFU2tyWL2I0Cf7eeJ2YrosdlE7VePHtvPExmK6LMMqvaqacRjBmD1XjIAq/dApgJPAP7zTzduvdWFS5eALD4cH7l8JNakrMGHD38YnJZHHgFuuQUYNCi4dZxtKoERI0ZgwIAgnt82tTuLWUWAPltFWl0feqyOvVWd6bFVpNX2oc9q+VvR3YjHDMBWOJRxDwZg9R7IVOAJwJs3u1GhggvnzgE5cqRvN3HFRHy99Wss6LAgOC3aPsBa0XHjglvH2SRAAiRAAiRAAiRAAiSQCQkwAKs3nQFYvQcyFXgC8I4dbpQp48KJE0CePOnbvb/2fUz7fRqWdF4SnJY33wR++w34+OPg1nE2CZAACZAACZAACZAACWRCAgzA6k1nAFbvgUwFngD8999ulCjhwuHDQIEC6dt9tvEzDF82HCu6rQhOy8yZwLvvAj/8ENw6ziYBEiABEiABEiABEiCBTEiAAVi96QzA6j2QqcATgA8ccOOGG1xISQGKFk3fbtG2Rej9TW9s7LUxOC2LFgG9egGbNwe3jrNNJWDkORRThbCYVAL0WSpeWxSnx7awQaoIeiwVr22K02fbWCFNiBGPGYCl2aK7MAOwblRhOdETgI8edSN/fhd27QJKlkx/Hr/s/gVt5rbBnr57gjvJDRsgXi8Nz2erfb1dK7hqnB0iASNvIgyxJZcpIECfFUC3uCU9thi4gnb0WAF0BS3pswLoFrc04jEDsMVm+WjHAKzeA5kKPAFYHChc2IWN4gZvuXLp2/2x/w/Un1YfRwceDU6LqCuSNXBUrMuXL7i1nE0CJEACJEACJEACJEACmYwAA7B6wxmA1XsgU0FaAC5e3OV5X5W2a9G1x44jO3DT2zfh/ODz4kZuEJfE5ctA3rypL8LyVVjmmbE2CZAACZAACZAACZAACYQZAQZg9YYFkXbUi6WCoAmkBWDtLdDffw/cdlv6GgdOHkCRN4vg9IunEZE9IrgmFSoAEyYATZsGt46zTSOQlJSE6Oho0+qxkD0J0Gd7+mKmKnpsJk171qLH9vTFbFX02Wyi9qtnxGMGYPV+MgCr90CmgrQAfPPNLsyfD9Sqlb7d6fOnkXt4bhzofwCFcxcOTk+jRkDnzsDjjwe3jrNNI5CQkIDY2FjT6rGQPQnQZ3v6YqYqemwmTXvWosf29MVsVfTZbKL2q2fEYwZg9X4yAKv3QKaCtABcpYoLs2YB9eqlb3dZfJQ5+9Ds2NZ7G6LyRwWn55FHgEqVgBdfDG4dZ5MACZAACZAACZAACZBAJiPAAKzecAZg9R7IVJAWgGvUcEHcKETjxr7b5Xs9H5Y/uRy3Frk1OD0DBgDHjwMTJwa3jrNJgARIgARIgARIgARIIJMRYABWbzgDsHoPZCpIC8B16rgwahRwzz2+25UYXQLz2s5D9I1BPks6bhyweDHw+ecyz4O1SYAESIAESIAESIAESCDsCTAAq7eQAVi9BzIVpAXgBg1ceOUV4MEHfberOL4ixt83HneXvTs4PfPmAa+/DqxYEdw6zjaNQFxcHOLj402rx0L2JECf7emLmarosZk07VmLHtvTF7NV0WezidqvnhGPGYDV+8kArN4DmQrSAnDTpi707w+0bu273R2T78BLd72EFhVbBKdHvIEYrVoBe/cGt46zTSOQkpKCyMhI0+qxkD0J0Gd7+mKmKnpsJk171qLH9vTFbFX02Wyi9qtnxGMGYPV+MgCr90CmgrQA3Ly5Cz16AB07+m7XcHpDdKneBY9WezQ4Pbt3A1FRwNmzQPbswa3lbBIgARIgARIgARIgARLIRAQYgNWbzQCs3gOZCtICcKtWLnTqBDzxhO9298++H81vao4eNUVKDua4cAG47jpgxw6gVKlgVnIuCZAACZAACZAACZAACWQqAgzA6u1mAFbvgUwFaQG4fXsXHnoIYr9Y3+3af9Ietxe7HS/UfSF4PVrw1fZYql8/+LVcYZhAYmIiYmJiDNdhAXsToM/29scMdfTYDIr2rkGP7e2PWeros1kk7VvHiMcMwOp9ZQBW74FMBWkB+LHHXGjSBHjmGd/tnlrwFIrmKYqhjYcGr0cLvt27w3OLmYflBObMmYN27dpZ3pcNrSVAn63lraIbPVZB3dqe9Nha3qq60WdV5K3ra8RjBmDrfPLXiQFYvQcyFaQF4K5dXahdG+jXz3e7Fxa9gNPnT+Pt+94OXo8WfCtXBgYNCn4tV5AACZAACZAACZAACZBAJiHAAKzeaAZg9R7IVJAWgHv2dHkyqtgxx+cx/Kfh2HhwI2a2nBm8Hq3okSPAO+8Ev5YrSIAESIAESIAESIAESCCTEGAAVm80A7B6D2QqSAvAzz3nQunSwP/+57vdhN8m4Jtt32BBhwXB69GC7/z5wNdfB7+WKwwTOHPmDCIiIgzXYQF7E6DP9vbHDHX02AyK9q5Bj+3tj1nq6LNZJO1bx4jHDMDqfWUAVu+BTAVpAfiFF1woVAgYNsx3u1nrZiFhVQJ+fOLH4PV89RXw/PPAhg3Br+UKwwT69u2L0aNHG67DAvYmQJ/t7Y8Z6uixGRTtXYMe29sfs9TRZ7NI2reOEY8ZgNX7ygCs3gOZCtIC8EsvuTy7Fb3xhu92CzcvRNz3cVjXY13wetavh+cB4+PHgSy8pIIHaGyFkX+FNNaZq60kQJ+tpK2mFz1Ww93KrvTYStrqetFndeyt6mzEYwZgq1zy34dpRb0HMhWkBeChQ104dw4YO9Z3u+W7lqPDvA7Y1WdX8Hq04OsSrQ4ehOc2Mw8SIAESIAESIAESIAESIIF0BBiA1V8UDMDqPZCpIC0AjxjhwuHDwKRJvtut/2c96rxXB8fijoWmp2BB4PvvgerVQ1vPVSRAAiRAAiRAAiRAAiTgcAIMwOoNZgBW74FMBWkB+K23XPjrL2DqVN/t9hzbg5JvlcT5weeRPWv24DVpwXfwYKBVq+DXcoUhAkb2ojPUmIstJUCfLcWtpBk9VoLd0qb02FLcyprRZ2XoLWtsxGMGYMts8tuIAVi9BzIVpAXgCRNc0B7V/eAD3+1OnDuBvPF5ceiFQyiYS9zNDfZo3RqIjk59GRYPSwkkJiYiJibG0p5sZj0B+mw9c6s70mOriVvfjx5bz1xFR/qsgrq1PY14zABsrVe+ujEAq/dApoK0ADxligu//gp8/LHvdpcvX0aOoTmw5ZktKFOgTPCaXngBOHECmDgx+LVcQQIkQAIkQAIkQAIkQAKZgAADsHqTGYDVeyBTQVoAnjHD5XlE9/PP/bcrPLIwFj26CNWLhfAcb0IC8OmngLgbyYMESIAESIAESIAESIAESCA9AQZg9VcFA7B6D2QqSAvAH37owvz5gLZlr7+j/LjymPLAFDQq0yh4TYsWAT17Alu2BL+WKwwRSElJQWRkpKEaXGx/AvTZ/h4ZVUiPjRK0/3p6bH+PzFBIn82gaO8aRjxmAFbvLQOweg9kKkgLwPPmuTBrFvDdd/7b1ZhcAy/VfwktK7UMXtP27cDNNwOnTwPZQ3iJVvAdueJfAnFxcYiPjycPhxOgzw43WJwePabHzieQOc6Q38vO99mIxwzA6q8PBmD1HshUkBaAFyxwQfuU8o8/+m/X5P0meKTKI3ii+hPBazp/HsiVC9i6FYiKCn49V5AACZAACZAACZAACZCAwwkwAKs3mAFYvQcyFaQF7FXKigAAIABJREFU4G+/deHNN4GkJP/tHv74YdQvVR/PRT8XmqayZYF33wUaNw5tPVeRAAmQAAmQAAmQAAmQgIMJMACrN5cBWL0HMhWkBeClS10YMgRYvdp/uy7zu6BkvpIY0lBMDOVo2hRo2xbo1i2U1VxDAiRAAiRAAiRAAiRAAo4mwACs3l4GYPUeyFSQFoB//tnl2aL3zz/9t+uX2A8XL1/EmHvGhKapRw8gb15g5MjQ1nNVSAQSxGfbY2NjQ1rLReFDgD6Hj1ehKqXHoZILn3X0OHy8MqKUPhuhFx5rjXjMAKzeYwZg9R7IVJAWgFeudImQlPFLml/94VVsP7Id01tMD03TW28BP/yQ8V5LoVXmqgwIJInPtUdHR5ORwwnQZ4cbLE6PHtNj5xPIHGfI72Xn+2zEYwZg9dcHA7B6D2QqSAvA69a50KkT8Ndf/tuN+3Ucvt/xPea3F/slhXJoeyxpt5k3bAhlNdeQAAmQAAmQAAmQAAmQgKMJMACrt5cBWL0HMhWkBeDkZBceegjYt89/u9l/zMbEFROx7MlloWnatg2oVAk4dYpbIYVGkKtIgARIgARIgARIgAQcTIABWL25DMDqPbii4BXxg65iFBTjNzF6irHeh7zC4tdGiHGXGCXE2C/Gx2K8LMbZa+anBeDt211o0gQ4dMj/CX+77Vv0/ro3kp9ODo3KxYupWyFpd4DLlw+tBlcFTSA5ORkVK1YMeh0XhBcB+hxefoWilh6HQi281tDj8PIrVLX0OVRy4bPOiMcMwOp9ZgBW74GmoL8YfcRoIYbYSBeDxWgjxs1inLxGYjnx8yfF+EiMLWLc9O+PvxNfn71mbloA3rPHhdq1gePH/Z/w6n2r0WxmMxx84WDoVG65BZ79lu67L/QaXBkUgREjRmDAgAFBreHk8CNAn8PPs2AV0+NgiYXffHocfp6Fopg+h0ItvNYY8ZgBWL3XDMDqPdAU7BBDe/Xy2H/lZBdftQ8ra6H4Ax0StY17HxfjNn8B+MABF7Rsevbae8RXLdjl3oWoMVE4P/g8smXNpqOtjyktW4p70+LmdB9NOg8SIAESIAESIAESIAESIIErBBiA1V8LDMDqPcgnJBwR404xkq6S86348R9i9NMh8UsxJ0UM7SPUVx9pd4DdbhdKlQIuXQKy+HH91PlTyDM8Dw70P4DCubVPWodwDBwIHD0KvPNOCIu5hARIgARIgARIgARIgAScS4ABWL23DMDqPSgpJGjvZhZvj8Kmq+TMET92i/FUAInax6W1OTXF0EKwzwB8+rQLkZHAuXNAjhz+K2oBeNVTq1CxcIjPlE6fDkyblrodEg8SIAESIAESIAESIAESIIE0AgzA6i8GBmD1Hvi7A7xISFsrhthXyO8xTPxOezHuFkP7GPW1R9od4IsXXSgoXq914gSQJ4//gqXHlMasVrNQr1S90MisWAHcey9w4ID/W82hVeYqPwSMPIdCqOFDgD6Hj1ehKqXHoZILn3X0OHy8MqKUPhuhFx5rjXjMAKzeYwZg9R5oCraLMU4M7Tlg7dDu0e4VQ3u2d5YPidoDupPEqCtG03/n+joTTwBu1qwZKlSojPHjgdmzG2HFiiUYPnw4IiIiPGvmzJmD/PnzIyYmBjUm18DTlZ7G5q82Iz4+Pq1mQkICqlWrhujoaM+vaW+/mz9/vtfLl7Q/DB66+25UvOMOcS86BUk7dmDt2rWIjY1NqxMXF4dnn31W3I0Wt6PFkZiYKD4xfRTt2rXz/PzMmTMYNGiQX33anBRRe+zYsaHpE3tBXXljsraJuRP0rV+/Hn379iU/7fpzoL9Xvj+077moqCh+f/z7xnOnfP9e/eef9ufRjBkz+Oef+NPMif5q/33r3r27eELoHZ///eV/35zz94OdO3d6/q5x9d+v6K9z/NX+/qz9N1n7M/vK358D+et2uz1/5z18+DA2bdrk+TNOHNpNsGO+/gLPX5NLgAFYLl+91bW7vNpbo1qJob3ZWdvS6GExtLdAi011vY7rxM8+FKO0GDFiZPTK5rQ7wLlyuZAzZ+o+wP9mT5/aYj6IQZtb2qDr7dc+Tqz3VMS8smWBd98FGjcOYhGnkgAJkAAJkAAJkAAJkICzCfAOsHp/GYDVe3BFgbYPsPYsbwExtH8W6iWGtg9wlBjaHeKGYvz479fF4utlMa72T/v5ta9uTgvAefO6kDWreNhYPG2svQzL39Hp006oUqQKBtYTL7MK9XjgAXFfWtyY7t071ApcRwIkQAIkQAIkQAIkQAKOI8AArN5SBmD1HshUkBaAXS4XrhP3jsWnZVG+vP+Wz379LLJnzY5RMaNC16W9CfqIeLG1+Ng0D/kEtI/RXPlouvxu7KCKAH1WRd66vvTYOtaqOtFjVeSt7UufreWtopsRjxmAVTjm3ZMBWL0HMhV4BWCRgcUzB/DsB+zvGPrDUGw9shUzWswIXdfMmanhd9my0GtwpW4C2vPZVz9nrXshJ4YVAfocVnaFJJYeh4QtrBbR47CyK2Sx9DlkdGGz0IjHDMDqbWYAVu+BTAVeAbiw2Np3kXi3dPXq/lu+s/IdLNi8AAs7Lgxd15o14gPbDVP3A/a36XDo1bmSBEiABEiABEiABEiABMKSAAOwetsYgNV7IFOBVwAuKXYcFi98xp13+m/5yYZP8MbPb+DXrr+GruvsWeD664HNm4EyZUKvw5UkQAIkQAIkQAIkQAIk4CACDMDqzWQAVu+BTAVeAVjbPeTtt1PfT+XvWLpzKZ6c/yS2P6u9d8vAIbZMwpAhQMuWBopwKQmQAAmQAAmQAAmQAAk4hwADsHovGYDVeyBTgVcArlEDGDwYaNHCf8sNBzag1pRaODHohDFdjz8uNmoSOzW9or3cmodMAtreylfv2SyzF2urI0Cf1bG3qjM9toq0uj70WB17KzvTZytpq+llxGMGYDWeXd2VAVi9BzIVeAXgu+6CeFkS0KmT/5ZHTh9BwZEFcWzgMeS9Lm/o2saMAZYsAebPD70GV+oikJKSIvZ2jtQ1l5PClwB9Dl/v9Cqnx3pJhe88ehy+3gWjnD4HQys85xrxmAFYvecMwOo9kKnAKwDfe2/qJ5Kf0nYb9nNcvnwZuYblwroe61ChUIXQtS1dCnTunLrxMA8SIAESIAESIAESIAESIAEwAKu/CBiA1XsgU4FXAG7dGqhbF+jTJ+OWZcaWwbSHpqFhVMPQtWn7ABcsCBw8CBQqFHodriQBEiABEiABEiABEiABhxBgAFZvJAOweg9kKvAKwNoN2ZtuAl56KeOWd753J56p9Qw6VOlgTFu5csCkSUCzZsbqcHWGBBITExETE0NKDidAnx1usDg9ekyPnU8gc5whv5ed77MRjxmA1V8fDMDqPZCpwCsA9+wJ5MsH8cKkjFu2/rg17ix5J/rW6WtMW/v2QJUqwIsvGqvD1RkSmCP2tmrXrh0pOZwAfXa4weL06DE9dj6BzHGG/F52vs9GPGYAVn99MACr90CmAq8A3L8/cOZM6lZIGR3PfPUMIrJH4I1mbxjTNno08MMPfBGWMYpcTQIkQAIkQAIkQAIk4BACDMDqjWQAVu+BTAVeAVjblnfXLmDq1IxbDv9pONYfWI9ZrWYZ0/bTTxC3JoG9e43V4WoSIAESIAESIAESIAEScAABBmD1JjIAq/dApgKvAPyGuKG7cqX2MbuMW05bMw0z183E4s6LjWk7eRJwCQla6i5RwlgtrvZL4Iy4rR8REUFCDidAnx1usDg9ekyPnU8gc5whv5ed77MRjxmA1V8fDMDqPZCpwCsAT5wIfPUV8OWXGbf8Zus36JPYBxt7bTSurWpVQLv13KqV8Vqs4JNA3759MVr7uDkPRxOgz46213Ny9JgeO59A5jhDfi8732cjHjMAq78+GIDVeyBTgVcAnjEDmD4dWLIk45ZrU9aiwfQGODrwqHFtsbFA3rzAm28ar8UKPgkY+VdIIg0fAvQ5fLwKVSk9DpVc+Kyjx+HjlRGl9NkIvfBYa8RjBmD1HjMAq/dApgKvAPzJJ8DIkcBvv2Xc8sDJAyjyZhGcHHQSuXPkNqbv/fdTt0L65RdjdbiaBEiABEiABEiABEiABMKcAAOwegMZgNV7IFOBVwD++mvg+eeB9eszbnnp8iVEvBaBDb02oHzB8sb0bdsGVKoEuN1ArlzGanE1CZAACZAACZAACZAACYQxAQZg9eYxAKv3QKYCrwD844/AY48BO3cGblluXDlMvn8ympRtEnhyRjMuXwaKFwc+/hioX99YLa72ScDIXnREGj4E6HP4eBWqUnocKrnwWUePw8crI0rpsxF64bHWiMcMwOo9ZgBW74FMBV4BeNUq4J57gAMHArdsPKMxHqn6CJ6s/mTgyYFmtG4N1KgBxMUFmsnfD4FAYmIiYmJiQljJJeFEgD6Hk1uhaaXHoXELp1X0OJzcCl0rfQ6dXbisNOIxA7B6lxmA1XsgU4FXAE5OBm6/HTh1KnDLJ+Y/gVKuUnil0SuBJweaMW5c6uunv/km0Ez+PgmQAAmQAAmQAAmQAAk4lgADsHprGYDVeyBTgVcA3r0bKFUKuHgRyJo147ZDlg7BzqM7Mb3FdOP6/vgDqFMHOHIEyJHDeD1WIAESIAESIAESIAESIIEwJMAArN40BmD1HshU4BWADx8GChUCjh8Hrr8+47bT1kzD++vex5LOAfZM0qP+0iWgaFFg/nzgzjv1rOCcIAikpKQgMjIyiBWcGo4E6HM4uhacZnocHK9wnE2Pw9G14DXT5+CZhdsKIx4zAKt3mwFYvQcyFXgF4LNngYgIQOQlTx7N6Fi8YzG6LeiGbb3FW5zNONq0AW67DXjxRTOqscZVBOLEs9Xx8fFk4nAC9NnhBovTo8f02PkEMscZ8nvZ+T4b8ZgBWP31wQCs3gOZCrwCsPZC5pw5gU2bgLJlM2677fA2VJpQCWdeOoOsWQJ8XlrPGUycCMybB3z/vZ7ZnEMCJEACJEACJEACJEACjiPAAKzeUgZg9R7IVOAVgLVG+fMDP/0EVKmScdtzF8959gLe3Wc3SrhKGNe4ZQtw662A9jnsPHmM12MFEiABEiABEiABEiABEggzAgzA6g1jAFbvgUwF6QJwCZFltRux0dGB25YYXQJz28zFnSVNeG5Xu/1cvjygvRG6efPAzTmDBEiABEiABEiABEiABBxGgAFYvaEMwOo9kKkgXQCuUAGYNAlo0iRw27pT66LnHT3RqWqnwJP1zOjZE8iePTUE8zCNQEJCAmJjY02rx0L2JECf7emLmarosZk07VmLHtvTF7NV0WezidqvnhGPGYDV+8kArN4DmQrSBeDq1YFXxNa+Dz4YuO3jnz+OqPxRGNJwSODJemZob4Hu3x/YvFnPbM7RSSApKUnc0ddxS19nPU6zJwH6bE9fzFRFj82kac9a9Nievpitij6bTdR+9Yx4zACs3k8GYPUeyFSQLgDXqwf06gV06BC47bAfh2HDwQ2Y1WpW4Ml6Zpw4ARQuDPz+O1Cxop4VnEMCJEACJEACJEACJEACjiHAAKzeSgZg9R7IVJAuAMfEANqORF27Bm47d/1cjPx5JFZ0WxF4st4Z2q3nOnW0/T70ruA8EiABEiABEiABEiABEnAEAQZg9TYyAKv3QKaCdAG4bVugdm2gX7/AbX9P+R0NpjfA0QFHkSWLSZfKtGmAtiXSChNDdeBTcfSM5ORkcUOdd9QdbbI4OfrsdIfpsfMdpseZwWPtHPnntfOdNuIxA7D668OkVKP+RKjAJ4F0Abh7d6BQIWDYsMDETpw7gbzxebH/+f0okqdI4AV6Zhw8CBQrBmzbBpQqpWcF5wQgMGLECAwYMICcHE6APjvcYHF69JgeO59A5jhDfi8732cjHjMAq78+GIDVeyBTQboAPGgQcORI6pug9Rw3jr4RH7X+CPVKiYeHzToaNwZatAB69zarIuuQAAmQAAmQAAmQAAmQgO0JMACrt4gBWL0HMhWkC8Bvvpn66eM5c/S1bTSjER6r+hieqP6EvgV6Zo0fn7oZ8ZIlemZzDgmQAAmQAAmQAAmQAAk4ggADsHobGYDVeyBTQboAPHUq8OGHwKJF+trGLohFgVwF8Prdr+tboGfWnj1AVBSwbx9www16VnAOCZAACZAACZAACZAACYQ9AQZg9RYyAKv3QKaCdAH488+BoUOBVav0tR336zh8u+1bfNnxS30L9M7S9q3t0gXo1k3vCs7zQ8DIcyiEGj4E6HP4eBWqUnocKrnwWUePw8crI0rpsxF64bHWiMcMwOo9ZgBW74FMBekC8I8/Ap07Azt26Gu7ZMcSPD7/cfz13F/6Fuid9fbbwEcfAcuX613BeX4IGHkTIaGGDwH6HD5ehaqUHodKLnzW0ePw8cqIUvpshF54rDXiMQOweo8ZgNV7IFNBugD8559A3bqA262v7cFTB3HDGzd4tkLKF5FP3yI9sw4dAooXB/74A6hQQc8KziEBEiABEiABEiABEiCBsCbAAKzePgZg9R7IVJAuAO/dC5QoAZw7B+TIoa91sVHF8EmbT1C3lEjOZh5t2gA33QQMH25mVdYiARIgARIgARIgARIgAVsSYABWbwsDsHoPZCpIF4BPnwZy5wb++Uf/+6diPohBy4ot0f0OsYmwmcfChUBsLPCX+Hh1tmxmVs5UtZKSkhCtPVPNw9EE6LOj7fWcHD2mx84nkDnOkN/LzvfZiMcMwOqvDwZg9R7IVJAuAGvNtAC8Zg1w8836Wj//7fM4ff40JjSfoG+B3lkXLgClSgHaq6nvuUfvKs67hkBCQoL4dwTxDwk8HE2APjvaXs/J0WN67HwCmeMM+b3sfJ+NeMwArP76YABW74FMBT4D8I03AnPnAnXq6Gv9/tr3MXnVZCx7cpm+BcHMGjAA2LlT/8bEwdTmXBIgARIgARIgARIgARKwEQEGYPVmMACr90CmAp8BuGpVID4eaN5cX+v1/6xHrXdrwT3QjexZs+tbpHfWli3ArbcC27enPpzMgwRIgARIgARIgARIgAQcSoABWL2xDMDqPZCpwGcAbtgQ6NoVeOQRfa0vXrqI/CPy4+cnf0aVolX0LQpm1oMPApUrp6ZyHiRAAiRAAiRAAiRAAiTgUAIMwOqNZQBW74FMBT4DcKtWgBaCe/fW37rh9IZ4tOqj6HJ7F/2L9M5cuhTQRO3eDeTJo3cV5/1LIC4uTvzbAf/xwOkXBH12usMAPabHzieQOc6Q38vO99mIxwzA6q8PBmD1HshU4DMAa3d/teeAhwzR3/qFRS/AfcaNhAcS9C/SO/PyZaBGjdTb0j176l3Fef8SSElJQWRkJHk4nAB9drjB4vToMT12PoHMcYb8Xna+z0Y8ZgBWf30wAKv3QKYCnwH4hReAM2eAceP0t567fi7il8Vjdexq/YuCmTlzJjB0KJCcDGTNGsxKziUBEiABEiABEiABEiCBsCDAAKzeJgZg9R7IVOAzAI8cCawWOfajj/S33uXehbJjy+LowKO4Puf1+hfqnXnuHFCmTGoqf/hhvas4jwRIgARIgARIgARIgATChgADsHqrGIDVeyBTgc8APGsW8M47wE8/Bdc6akwUpjwwBU3LNQ1uod7ZE8Q+w5MmAWvXAtmy6V2V6eclJiYiJiYm03NwOgD67HSHAXpMj51PIHOcIb+Xne+zEY8ZgNVfHwzA6j2QqcBnANbeOfXkk6k7DwVzdP68M0q6SuK1xq8Fs0z/XO0ucIUKwLBhQKdO+tdl8plz5sxBu3btMjkF558+fabHzifg/DPk97HzPdbOkD4732cjHjMAq78+GIDVeyBTgc8AfGXrXe054CxBXAHvrX4P09dOx09PBHnrOJgznDYNGD4c2LAByJEjmJWcSwIkQAIkQAIkQAIkQAK2JsAArN6eIOKPerFUEDQBnwH41KnU3Yb++Qe44Qb9Nbce3orKEyvj6ICjyJUjl/6Fwcy8cCF1T+D+/VPfCs2DBEiABEiABEiABEiABBxCgAFYvZEMwOo9kKnAZwDWGhYsCCxeDNx2m/72l8V2RaXGlMLUB6fKew5YkzN3buomxZs2AS7tFHhkROCMuJUfERFBSA4nQJ8dbrA4PXpMj51PIHOcIb+Xne+zEY8ZgNVfHwzA6j2QqcBvAK5SBXj9daB58+Dad/uiG/JelxejY0YHtzCY2dq+wHffnZrOR40KZmWmnNu3b1+MHi3Rj0xJ1X4nTZ/t54nZiuix2UTtV48e288TGYroswyq9qppxGMGYPVeMgCr90CmAr8B+J57gJYtgdjY4Np/uvFTvLj4RWzstTG4hcHO1p4BrlEDWLECuPXWYFdnqvlG/hUyU4EK85Olz2FuoA759FgHpDCfQo/D3ECd8umzTlBhPM2IxwzA6o1nAFbvgUwFfgOw9nht8eLAq68G1/7Y2WMoNLIQtjyzBVH5o4JbHOzs558HVq4EliwJ7m1dwfbhfBIgARIgARIgARIgARKwgAADsAWQA7RgAFbvgUwFfgPw//4H7NkDvPde8O0bzWiEhys9jKdrPR384mBWHD8O3HILMHgw8NRTwazkXBIgARIgARIgARIgARKwHQEGYPWWMACr90CmAr8BePJkYN48IDEx+PZv//o2Pk3+FEs6izuzso9Fi4BWrYDffwfKlZPdLSzrG9mLLixPOJOKps/ON54e02PnE8gcZ8jvZef7bMRjBmD11wcDsHoPZCrwG4C/+grQPmGsPWob7PH3sb8RNTYKe/rsQdHriwa7PPj5T4s7zWvXAkuXAtmyBb/e4SsSxb9ixMTEOPwseXr02fnXAD2mx84nkDnOkN/LzvfZiMcMwOqvDwZg9R7IVOA3AG/ZAmhvgj55MrRMWW9qPXSq0gk9avaQqT+1tiayenXg8ceBQYPk92MHEiABEiABEiABEiABEpBAgAFYAtQgSzIABwkszKb7DcAXLgC5cwPJyUDZssGf1bhfx2Huhrn46Ymfgl8cyopVq4C77gK++AJo0iSUClxDAiRAAiRAAiRAAiRAAkoJMAArxe9pzgCs3gOZCvwGYK1ppUqp2+zed1/wEg6eOogSo0vgzx5/4qZCNwVfIJQVU6cCAwYAWhguVSqUCo5ck5KSgsjISEeeG0/qPwL02flXAz2mx84nkDnOkN/LzvfZiMcMwOqvDwZg9R7IVJBhANb2AdZuqvbpE5qE1h+3xs2FbsawJsNCKxDKKm3j4tWrgR9+SL2FzQNxcXGIj48nCYcToM8ON1icHj2mx84nkDnOkN/LzvfZiMcMwOqvDwZg9R7IVJBhAB44EDhyBEhICE3CV1u+QtcvuuKv5/5Cjmw5QisS7KqzZ4FmzYD8+VNfY509e7AVOJ8ESIAESIAESIAESIAElBBgAFaC3aspA7B6D2QqyDAAT5sGzJiR+nLlUI5Lly+hwtsVMLTRUHSo0iGUEqGt0VJ7/fpA3brAO++ID/LzMg4NJFeRAAmQAAmQAAmQAAlYSYAB2EravnsxOaj3QKaCDAPwL7+kbrG7b1/oErSXYc3+YzaSuiaFXiSUlbt3A3XqAJ07A6+9xhAcCkOuIQESIAESIAESIAESsJQAA7CluH02YwBW74FMBRkGYO1GasGCwKFDqV9DOY6dPYZSb5XC/Pbz0SCqQSglQl+jvcK6USPgySczdQhOEJ9hj9WejebhaAL02dH2ek6OHtNj5xPIHGfI72Xn+2zEYwZg9dcHA7B6D2QqyDAAa43LlQMmTUp9rDbU439L/oflu5fju8e+C7VE6Os2bUoNwY89BvEmqEx5JzgpKQnR0dGhM+TKsCBAn8PCJkMi6bEhfGGxmB6HhU2GRdJnwwhtX8CIxwzA6u1lAFbvgUwFAQNwx46p2yENHhy6jMOnDyNqTBS+7Pgl7iotXitt9bF5M9C0KdC4MTB5MpDDohdyWX2e7EcCJEACJEACJEACJBDWBBiA1dvHAKzeA5kKAgbgMWOA778HFiwwJuO1H1/DF5u+8DwLnDVLVmPFQlm9d2/qhsbafrgffwy4tFPnQQIkQAIkQAIkQAIkQAL2IcAArN4LBmD1HshUEDAA//wz0KIFsH+/sU8Pnzp/Cje9fRPeaPoGOlYRt5VVHMeOAW3bAn/9BXz2GVCxogoVlvdMFs9CV8wk52o5XBs1pM82MkOSFHosCayNytJjG5khUQp9lgjXJqWNeMwArN5EBmD1HshUEDAAnz6derN0yxYgKsqYFO1t0P2+7YeNvTYif4TYp1fFcfEi8NJLwMSJgLbPk/aaa4cfI0aMwIABAxx+ljw9+uz8a4Ae02PnE8gcZ8jvZef7bMRjBmD11wcDsHoPZCoIGIC15rVrAz17pu4oZOS4fPkymn3QDGXzl0XCAwlGShlfO28e0KUL0K4dMHo0kCeP8ZqsQAIkQAIkQAIkQAIkQAIGCDAAG4Bn0lIGYJNA2rSMrgD8v/8B2nukPvzQ+FnsPLoTt71zG6Y+NBWtKim++6p9FPrRR1M/3/3ee0C9esZPkBVIgARIgARIgARIgARIIEQCDMAhgjNxGQOwiTBtWEpXAP7lF+D++4F//gGyZTN+FnPXz8VTXz6F32N/R+n8pY0XNFJB+0i0dgf4lVcA7ZXX4uPCKFDASEWuJQESIAESIAESIAESIIGQCDAAh4TN1EUMwKbitF0xXQFYy4hFigALF0LsJ2vOOXT/sjv++OcPLOm8BDmz5TSnqJEqO3akfs579WrgzTeBTp2ArAreVm3kHPysNfIcigQ5LCmJAH2WBNZGZemxjcyQJIUeSwJrs7L02WaGSJBjxGMGYAmGBFmSAThIYGE2XVcA1s5JuzlaWtysjY835wxPnz+NulPronKRypjRYoaarZGuPRXxjLJni6T+/YHChVPvBmv7B4f5YeRNhGF+6plKPn12vt30mB47n0DmOEN+LzvfZyMeMwCrvz4YgNV7IFOB7gD85ZepN0jhYwjHAAAe0klEQVR37jTvxmjKiRTc+d6deLjSw3ij2RsyzzO42mfOAOPHA8OHAzVqAEOHmnfrOzglnE0CJEACJEACJEACJJCJCDAAqzebAVi9BzIV6A7A588DN96Y+iKsxo3Nk7T18FZPCO5duzderP8ismSx0SV35EjqXeAJE1KD8MCBQEyMsQ2RzUPHSiRAAiRAAiRAAiRAAg4jwACs3lAbpRH1MByoQHcA1s69Tx/gwAHggw/MJbE2ZS1iPohBxyod8WazN+3xceirT1ELwtq+wWPHAsWLA08/DXToEDZbJyUlJYlnt016eNtc61nNRAL02USYNi1Fj21qjImy6LGJMG1cij7b2ByTpBnxmAHYJBMMlGEANgAvDJYGFYC3bAGqVEndEqlUKXPPbtvhbZ49guvcWAfvPvguIrJHmNvAjGqnTgHvvw9MmgRoWyg99hjw1FPArbeaUV1ajYSEBMTGxkqrz8L2IECf7eGDTBX0WCZde9Smx/bwQbYK+iybsPr6RjxmAFbvHwOweg9kKggqAGtC2rUDihYFxo0zX5b2THDLOS1x5sIZzG0zF+ULlje/iRkVtZdlaXtDaUH4k0+Am29OfUuYdle4ZEkzOrAGCZAACZAACZAACZBAJiTAAKzedAZg9R7IVBB0AP79d+DOO4H164EyZcyXdu7iOQxYNABTf5+K8feOxyNVH7HXc8HXnvKxY8DnnwOzZgGLFwN16wJt26ZunGz2bXLzcbMiCZAACZAACZAACZCAjQgwAKs3gwFYvQcyFQQdgDUxXboAhw8Dn30mT9r85PnosbAHqhatiknNJ6FMAQlp22z5+/cDc+akglm2DKhcGXjgAeDBB1NfouWQfYXNxsZ6JEACJEACJEACJEACqQQYgNVfCQzA6j2QqSCkAPzPP0DFisDkyUDr1vLkHT1zFC8segEfrPsAz9Z+FgPqDUD+iPzyGppZWXtx1tdfAwsWpH7Nlg1o0ABo1Ch1aOHYojdex8XFif2bTdrA2UxGrGUqAfpsKk5bFqPHtrTFVFH02FScti1Gn21rjWnCjHjMAGyaDSEXYgAOGV1YLAwpAGtnpj362q0bsGYNEBUl91xX7V2F/ov6Y+3+tegb3Rc9a/ZEgVwF5DY1s/qFC8CqVcCSJalDuzucJw/QsCFQrx5QqxZw221AhJwXf6WkpCAyMtLMM2ItGxKgzzY0xWRJ9NhkoDYsR49taIoESfRZAlSblTTiMQOwejMZgNV7IFNByAFYE9W7N/Ddd8Dy5UAByXn0snjx1LfbvkX8snis2rcKXap3Qbfbu6FyEXEnNdyOc+eAFStSw7D2Mq1ff9U+7wJUqwbUrp0aiG+/PfXlWjlyhNvZUS8JkAAJkAAJkAAJkECIBBiAQwRn4jIGYBNh2rCUoQB88SLw8MPA3r2pn/ItVMiaM0zak4Txv43HvI3zUD2yOrre3hWtb2kN13Xa6YThob1VeseO1CB8ZaxbB5w/D1SqlLr3lDaqVk39WqKEZR+fDkOalEwCJEACJEACJEACYUuAAVi9dQzA6j2QqcBQANaEnT2buvvPxo2pL0PWblpadRw5fQSz/piF99a8hw0HNqBJmSZoVakVHrz5QRTJU8QqGXL6XLoEbN8O/PFH6tACsfZ161Ygb17gppuAChW8v2q/lj/9M9KJiYmIiYmRo5NVbUOAPtvGCmlC6LE0tLYpTI9tY4VUIfRZKl5bFDfiMQOwegsZgNV7IFOB4QCsidMecX3xxdRtcbV3LfXoYf0Lj7ce3orPNn6GT5M/xW9//+Z5e3TjqMZoXKYx6peuH753h691//RpIDkZ2LLlv7F5c+qPDx4EChdOfSi7dOm0MWf3brTr1Cn151pAtujlWzIvXNZOT2COeAN5O22jbh6OJUCPHWtt2onRY+d7rJ0hfXa+z0Y8ZgBWf30wAKv3QKYCUwLwFYHffpsafouIm69jxqQ+zqri2H9iP5buXIrFOxZjyc4l2H5kO6oXq45axWvhjuJ3eEalGyohe9bsKuTJ66m9eVq7Q7xzJ/DXX8CuXalfr4yjR1PvHt94I1CsGMSbsVK/Xju0X8+Xj0FZnlOsTAIkQAIkQAIkQAI+CTAAq78wGIDVeyBTgakBWBN66hQwbBgwbhxQsybw/PMQH79N3QVI1bHbvRvLdi3Dyr0rsXLfSqzetxoXL11ElaJVUKlwJc+45YZbPKG4TP4yyJZVoViZkLQXbWlh+O+/gX37vId4U3Tar2l3mXPlSg3I2r9maHeVtQe8M/pasCCQM6dM9axNAiRAAiRAAiRAAo4nwACs3mIGYPUeyFRgegC+Ila7GTlhAjBxIqC946ljR6BFC6BOHSC74huvWvjdfGizZ1uljQc2YuPB1KH9Whbxv/IFy6N0/tIonS91/L+9cwGypCrv+JmZfSC7AUHNohFcIpqgRiGiQUzC+iaUm0StrRgEgwmVGBMTXYIRIgq+Aj7WqKSIBnFNWI2iYtiIxi2RIEajQGIqooiRJSKy4j5wd2Hfk/+/u8+dMz33zvTs3Ef3nd+p+ld3nz73nK9/370z/fV59PKHLm8dL1u6LIyOjPbSJ12ve9euXXrDUsVXLNlZDpRjgHzffSFs3pwPr+603b49t9m9yw6E3XucysOuy3ntjv1qqNFmse26s+ZQ4az8PId2+OjgCODjwbHvV8v4uF+kB9sOfh4s/360PhcfEwD3w0PTt0EAPHgfRAsu1s45kiKM8HXpVdK3OpjnlxJdJr2wOL9e2z+R7i+V71kAHNvxStHXXx/CunUhXHddCH4DkF9/6+HRJ58cwkkn5XFTHdK+A/vCnVvvzALhu+6/K9y1TdJ247aN2fbeHfeGRWOLwrIly8JRS48KDoaPWnLUxL7zdO4RSx4RjjjkiOxdxS4/6LR69eqwZs2a3plhpzo4trZs0bdMX7OyPPy6Xb7zduyYsO3QQ/N3JC9dOnmb5s103nU44Lfckx33vR3005feeSH03M89tJ2qqxHAx9U4NbkUPm6y96rbjp+rs2pqybn4mAB48F4nAB68D2zBedJrJfWhBk3yDBdKqySvubyzjYmfVZ6iiHCWZB/+o6Q+2ezzaep5AJw25oWNb701hBtumHjbz913h3Dssfnq0amOOSaERz0qj1/qknbt2xU8nNqB8Kadm/Kt5htPOlb+Tx74SXhgr8aCKx268NBWMByD4mxbBMiHLz48LF20dFotWbRkTvOV169fH1auXFkXjFPt8FMS9zo7EN6pr3Pcpvvt8jqV9RBuSz3f2TLlaXIA3Ck4ToPlcuDsYw/xTuV3NJfzfNwpv9M5l+/CwmS193N9v4GNsQwfN8ZVB20oPj5odI36IH5ulLsOyti5+JgA+KCQd/VDBMBdxXnQleklsUHLSoX3FjV4ELEmcWZB8VWlWrXUb3D5E6VvFue8f4uksDIo5GylvgbA7a7eI21vuy1f2Pj223N5UWNPU/VrcI9QX7YDYcuvv/VUVOdFeXRteuyRtY4zuhBPHLSz/MHd+3aHbbu2ha27tga/rsnbLQ9uae3HvO17tocde3a0VQyiXd/iscWtINkB8SELDmmvsan5Gy7fEFa9dtWU8osXLA4LRxeGhWPSLLZePGxk0ICresdPXdxDHQNiB8Xpfvm40znn+wvpujqp6vl2tjswLwfXDoydX0WaZL9aP6I1J5xQrXyVOl3Gk/djWe9bHqY+qO08HyI/lx6Fqj8Zyg2WAD4eLP9+tY6f+0V6cO3MxccEwIPzW2yZAHjwPlBIl/XeniJ9LTFHay4HvRg2nFsy8bd0/HGpPOnTXWEvkf6lTgFwJ7yOWzyi1oHwPffk8r5H2Hp+cTs5lnHyPbJHwbaTO/LSfB87zoiddnG/U17sxEvLxbwYE6TxgffLx53KlfPHw/7w4L4Hws69UwPk3ft3B/dIV9FXr/hqOP7M49uW3Xtgb9i7X2qz9ZDwTslBcNWg2WXHRsayudNeYMz7cdsuz+eyfJdLyk7Kn209SXnXbXm+d7ZVMJ/ux3PO73o5t7TvQFiwb38Y3bsv09he7etdYqPO2+OttGdvGNk/Hsb2H9B2f6ZRfS7bxjyXPzCu+vLz519zbbj09NNa5d3OiOryuZCV0b62oTj2+8t8PnuPmduI+y6Tfa44Vxxnn9MPM6vPP9BubWf7N7YbAbjr8EOcTts6nYs2yqbVN90U1px66lS7e2Wv601lX3U6nu5cfGAWP9uPehra5upLLglrLrgg/1VU4dWN62zd8ZVu+dIHneWHnp3OVS0Xr6+bbc+lztn+HZpj+bkER3Nsmo/3icBcfEwA3CcnTdMMAfDgfXC0TNDSveF4Sf2jreQg13N6/7Bkooc9v1PSEr6T0iYducf4o0lu1gP8A70n9rDDvNvs5ADYI2njCFivSO08b50Xt+V9d9z53t8de3E/duZNd86f8flY1utHOS5IY4P02OcPJsV7206BdHq+3f3S5s2rtIDz1W3vpWxP+X425o0HBVejusixvWF8VBda7Ctqy/dH8nNhRPJWeePF8bjPq9y4z2VlBcYaVfA0Imk77m2Rn+/n+YqsdM7l8/Otc232J+qYqM95fniQ1Z3VVT7nfDkjOz+x9fXKe8r3nveLrdstzo3rXFZmyjnXEz9XlG99TvmxLX22VXdWl4/yNlv7zmuVn/zZab8/V+usJ0YMLPnfRfyXUWzH860fMORpYhvzfOmj0th+PXDQdoE+4+3ogXw7VpxfkB2PhDF/L7Xv/DGX9deqVc7HenDgcrHepB63FfNHVMbW+Dja4G227zP6wbo9l3H9rW22b1vy8/Fc9lXKyubn8jJ5fW3rSNs1mcLeqWVjfSFcecf94ZzjDm9bNn7e36PYru3IqGfXFNuwbcU1Fbbl163PJWXzz+Vls69nkfLrnag35sfrbHm49Nm0nnx/otL42ayu+Ln4jWnZWLSZ2BPrTO3J2i+qzr+RE5+LLPJvoq6tqDvml22fVE9kWXyLI5N29bRgtWWQM81tmGAb63mZHnytG9O3p8R5Cj/7cMIt7HWRgP/Cx5R89fOvZ3qudIc8+Vzn22f/WTxDfv6o/JzXOVG2+JM5pa2sXPJwoWxXevlpuZltbt/2RH3F+YrXOoVX8rn0Ols/gKKh8rlpOXTgNfGryvfSOqZySK67/N2ZhnP612SKDyYxGgmv/umO8P7DtJ5JyZYp15q2X9SxQ//HnrUlW7bHnWC6syX1m0DnX3C/LZm/7XXqAd4gJB7irBcNTUqz6QHWoOJJQ6LnL2WuHAIQgAAEIAABCEAAAvUh8GiZovGPpH4TIADuN/H27X1f2XqzbjYP2EmDdoMGBYfXSFpfeVJ6jI7ulH5Z+q/ijPdvlspzgO1fza4NxXts6nGxWAEBCEAAAhCAAAQgAIF5TMDvSPG9/nQd/vMYT28vnQC4t3yr1u5eXg9ffrF0h/RGyfN5vQp0vtzw5OR5vh538XLJPvQq0Jo9O2UV6KrtUw4CEIAABCAAAQhAAAIQgMDQEyAAro+LL5Ypnu/rd/x6MSy/19fvAV4uuYd4hXRjYW75PcDXFuWZR1Aff2IJBCAAAQhAAAIQgAAEIFAzAgTANXMI5kAAAhCAAAQgAAEIQAACEIBAbwgQAPeGa11qda/yOdKR0telV0nuVSbVn8BLZaJHATxZ8jwRvxs6XbzS+ZdJT5M8/P2Dkv2dJvxfbz+/TeadLh0n7ZS+JL1O+kFiNn6utw9nsu5CFfBUFS9IqLXqwzekv5TiO9z9eXw8E8Vmnb9G5nqxyudJXyxMx8fN8mE7ay9SpqenpekzOvDUNX7HzfdvegXP0IH/Pz9d8qsr/ErSX5M8V5ff8pD4mgB4SBzZ5jLOU57nFf+29D3JN2J+iYrnFftmm1RvAs+XeR7qrjcehw9JaQDsgPi70sekt0iPl3zT9Q4pLqSG/+vtX1v3XumTkhezs099bF8+pTAdP9ffhzNZ+CQV8AOqHxe/ZT+E9OKGj5R8M4WPZyLYrPN+2HGG5L/fz5Wux8fNcuA01l6kc8+Wfr1NGX7HQ+Pm4OD385IfVH5C0gs0w1Olf+O3PDxO9pUQAA+XP9Or8UrRDoZ8U+3kAOpHkoPiq4b3sofuylboinwTlQbAv6fjd0l+F7SfTjrZr+4xdm+iE/5v3lfhRJl8i+QHH35BIH5ung+ns9g3yV7nwQ+qflbajI+HysF+nclXpF+V7pJiAMzveDjcfJEu4zmSewLLCR8Ph499FV8u/g/7QSV+Hh6/TrkSAuDhdG6ndwt/QZfroRznDudlD+VVrdBVlQPg9yjveOm05IqfWfzhPkzbMWmrdIrkBdViwv/1/op4NfhXSvEhBn6ut7+qWudROJ8uCrvX136N73fHx1Up1ruc76X+VXKP0RWSp6vEABgf19t3Va17kwq6V9C+3SH5YYePPcIOH1elWO9yHnHnxWTfKXkKwxOk/5XeKn0cP9fbebO1jgB4tsSaUf5omekn0A6Sbk9M9g/YPUvuhSA1g8AKmVkOgD0keonkecIx+Q/1/0juhXAAjP+b4d9opW+WHSS9SIrzBvFzs3w4k7UesXGmtFHy0HcnfDwTtWac99B2z/t9QWFuGgDj42b4cCYrf0kFPI/f/1t9j3WJ5DU4nO+RdvxPnolg/c/7/un/JE9Z8atIb5X8APMj0grp9yW/gpR7r/r7ckYLCYBnRNTIAp16gDfoarz4Sux9aOTFzTOj/Ue3HACvUd4TpXizZSRVeoDxfz2/PL8psz4sOTj6XGIifq6nv+Zi1ag+7NEZHibr0Tj4eC406/HZx8oMD5s8WfLNs5MD4LgIFj6uh5+6bcViVbhN8oMPj8bif3K3Cfe/vnjvfKmaPj9p3qM7vFbHQvzcf6f0qkUC4F6RHXy9fnfw+6S4KJJ/uPdIntewbvDmYUFFAitUrhwAe6GVd0teSGdfUc9qbf9YelxxjP8rAh5wsVcUvvRNlG+i04SfB+ycHjTvv8O+aT5Lco8/Pu4B5D5Xebba+4DkoZMxPaw49qgrD5Xl73WfndKH5mIA7AeY/l+Mj/sAvQ9N3KE2PiW9PmnL08dulr6Dn/vggT41QQDcJ9ADaMa9vF4YyUv0+wft5fs9pMOrQD8wAHtocnYE3FO0SPKKk16R0MNu3KuwW/JQK68C7ZurNxc+9c10ugo0/p8d70GU9iuPvFq3X4Xk1+OUk32Onwfhme616V4E/05/KPkm2a8mWyl5esqm4neNj7vHexA1PUSNeuG6mHxf5VeZeZikb5z9kBIfD8Iz3W3TDyv9MPpeya81e7vkIdB+LY59jo+7y3tQtf2ZGn6D5KHP7vX1A461kkftOADGz4PyTJfbJQDuMtCaVeebLc/39T9nL4bkVYJ5D3DNnNTBnLOVf2VxzgvnxN/qCu3fKHne0d9Kfk+dh1ReLjkYThP+r7ev/UAj9W20NvrYx/i53j6cyTq/nsw3yQ+X/Dokv4/dv1PPLYsJH89EsXnn0znA/I6b5792FrtX0AtLHindJ/m1OH69pEdb4ePh8HG8Cvf+el6/R3J8W/K91Hr8PFxOJgAeLn9yNRCAAAQgAAEIQAACEIAABCDQgQABMF8NCEAAAhCAAAQgAAEIQAACEJgXBAiA54WbuUgIQAACEIAABCAAAQhAAAIQIADmOwABCEAAAhCAAAQgAAEIQAAC84IAAfC8cDMXCQEIQAACEIAABCAAAQhAAAIEwHwHIAABCEAAAhCAAAQgAAEIQGBeECAAnhdu5iIhAAEIQAACEIAABCAAAQhAgACY7wAEIAABCEAAAhCAAAQgAAEIzAsCBMDzws1cJAQgAAEIQAACEIAABCAAAQgQAPMdgAAEIAABCNSDwFqZMSad1UVzzlFdfyUd28U6qQoCEIAABCDQWAIEwI11HYZDAAIQgECPCbxC9X9IulQ6v8dt9ap6AuBekaVeCEAAAhBoJAEC4Ea6DaMhAAEIQKAPBL6hNpZLB6SjpT19aLPbTRAAd5so9UEAAhCAQKMJEAA32n0YDwEIQAACPSLwNNX7H9Jp0rXSH0jrkrZ+Rvvvl14o7ZLeLl0gebjxR4pyv6jtu6RfkRw8f1p6nfRgB5vXKj8dAr1Rxx+UniE9W/qR9BfSZ6a55hcUbf68tl+RbpLckx2HQL9E++7Nfry0W/p36c8lt3WYdI90unRj0sZl2v856UXScyX3iPva/PlvSSulbdPYxCkIQAACEIBAbQgQANfGFRgCAQhAAAI1IvBh2fJk6anSx6RjpGcm9l1ZnP8dbbdK75F+V3KP6z9ID5e+LTkAvlx6qOTA+HbplR2u0206AH55cX6jtqPSGdIt0mrJAbSD0R1t6nCQ+x3pPMn2OfD+J2m75IDYycHtFum/pYdJtu1I6ZTi/N9p6+D+ZcXxEm3vlnydX5AcIL+lqP8Qbc3HDwp2trGHLAhAAAIQgEDtCBAA184lGAQBCEAAAgMmcEQR9Dng/ID0LOmL0gmSA0cHqQ74XixdV9h6uLYOLN3b6gDYn3Vvaxo0O8h0PQ/pcH1ri7rjIlh36th5Fxfll2r7U8mBrYdnl5N7n91Le1JyYk2R12kRrBN13sG1g15fk4N+B7QOsn09DuhfLx1X1Pk9bT0v2j3TmztcB9kQgAAEIACB2hIgAK6tazAMAhCAAAQGRMDB65ulR0ruPfX/yu9KDl7de7tM8nDkJ0ru5Y3pPu2cKzkAds/qH7Wxf1x5nk/sntRyWquMdAi0A+DY2xrLej6yhyFf3+bzbtM9z6uSc39a2BQD4Ofo+KLCdvdKO9kmB7huz8nDpq+R3i3dLF0tediz0y9IDohXSO6Fdu/4JZLtIkEAAhCAAARqT4AAuPYuwkAIQAACEOgjAf9f9DDl5VLaw+ke3v2Sg2LP4XVvqXt4P1vY5mDS5WMP8Bu1f6rkgLNq8hDoBVLaAzybANhzkG2ThyXHlPYAL1Kme3Ud3P+95Hm77tV2D7AD4O8XH/KQ6zdJZ0oOhh8tObgvJwfDX5LeIHnINQkCEIAABCBQewIEwLV3EQZCAAIQgEAfCTxfbX1e8rDntHfXC0T9p+QFpLwolAO+p0jpHOCX6jjOAXYv7zelt0ruEXZvqfM8xPhTHa5nrfLn0gPsXl7b7IWyPN/46ZJ7aB2s+5zn83q+snu4ryjs8bU8T0oD4IU69rzfTdJtkq/LyQG0r+9z0g8lB8AbJDNx8E6CAAQgAAEI1J4AAXDtXYSBEIAABCDQRwJeqdmBoldTLicvdOVg8UmS58w6eIyrQP+19i+UXi19ovigA0TnexVnB9AbpauKvHaXVF4Ea7ZDoF3nb0jvkB4reYVnr+Z8thQXwfICW55T7J5sr+Dsa3Kw/Dgp9gC7Hq9q7aHOXn36hsJYB8YeDu3A2gto3Vtcj3uAPYyaBAEIQAACEKg9AQLg2rsIAyEAAQhAoAEEPPf2x5KDXS8i1fTkucOWX3dEggAEIAABCAwNAQLgoXElFwIBCEAAAn0k8Bi19QTpy5JfI/Q+yT2+Xhir6QtC+ZVPntvrnmSvgk2CAAQgAAEIDA0BAuChcSUXAgEIQAACfSTgIcWfLILeXdp+TXqNdEcfbehFU3+jSr3S9T9Lfq9x04P5XjCiTghAAAIQaDABAuAGOw/TIQABCEAAAhCAAAQgAAEIQKA6AQLg6qwoCQEIQAACEIAABCAAAQhAAAINJkAA3GDnYToEIAABCEAAAhCAAAQgAAEIVCdAAFydFSUhAAEIQAACEIAABCAAAQhAoMEECIAb7DxMhwAEIAABCEAAAhCAAAQgAIHqBAiAq7OiJAQgAAEIQAACEIAABCAAAQg0mAABcIOdh+kQgAAEIAABCEAAAhCAAAQgUJ0AAXB1VpSEAAQgAAEIQAACEIAABCAAgQYTIABusPMwHQIQgAAEIAABCEAAAhCAAASqEyAArs6KkhCAAAQgAAEIQAACEIAABCDQYAIEwA12HqZDAAIQgAAEIAABCEAAAhCAQHUCBMDVWVESAhCAAAQgAAEIQAACEIAABBpMgAC4wc7DdAhAAAIQgAAEIAABCEAAAhCoToAAuDorSkIAAhCAAAQgAAEIQAACEIBAgwkQADfYeZgOAQhAAAIQgAAEIAABCEAAAtUJEABXZ0VJCEAAAhCAAAQgAAEIQAACEGgwAQLgBjsP0yEAAQhAAAIQgAAEIAABCECgOgEC4OqsKAkBCEAAAhCAAAQgAAEIQAACDSZAANxg52E6BCAAAQhAAAIQgAAEIAABCFQnQABcnRUlIQABCEAAAhCAAAQgAAEIQKDBBAiAG+w8TIcABCAAAQhAAAIQgAAEIACB6gQIgKuzoiQEIAABCEAAAhCAAAQgAAEINJgAAXCDnYfpEIAABCAAAQhAAAIQgAAEIFCdAAFwdVaUhAAEIAABCEAAAhCAAAQgAIEGEyAAbrDzMB0CEIAABCAAAQhAAAIQgAAEqhMgAK7OipIQgAAEIAABCEAAAhCAAAQg0GACBMANdh6mQwACEIAABCAAAQhAAAIQgEB1AgTA1VlREgIQgAAEIAABCEAAAhCAAAQaTOD/Acq5dZrDk44IAAAAAElFTkSuQmCC\">" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"start_date = date(year=begin_year, month=1, day=1)\n", | |
"end_date = date.today()\n", | |
"\n", | |
"delta_days = np.array([(date.today() - d).days for d in list(period_range(start_date, end_date))])\n", | |
"\n", | |
"fig, ax = plt.subplots(figsize=(12, 8))\n", | |
"\n", | |
"for readers in [5, 25, 100]:\n", | |
" ax.plot(delta_days, [calculate_score(days, readers) for days in delta_days], label='{} readers'.format(readers))\n", | |
"\n", | |
"ax.legend()\n", | |
"\n", | |
"ax.grid()\n", | |
"ax.set_xlim([0, np.max(delta_days)])\n", | |
"ax.set_ylim([0, 1])\n", | |
"\n", | |
"ax.set_title('Score decay by time')\n", | |
"ax.set_xlabel('Age in days')\n", | |
"_ = ax.set_ylabel('Score')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 156, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"data['Score'] = [calculate_elem_score(elem[1]) for elem in data.iterrows()]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Results" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 157, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Date</th>\n", | |
" <th>Readers</th>\n", | |
" <th>Authors</th>\n", | |
" <th>Title</th>\n", | |
" <th>arXiv</th>\n", | |
" <th>Mendeley</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Score</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0.092487</th>\n", | |
" <td>2015-08-05</td>\n", | |
" <td>72</td>\n", | |
" <td>Zhang, Wang</td>\n", | |
" <td>Relation Classification via Recurrent Neural Network</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1508.01006v1\">1508.01006v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/relation-classification-via-convolutional-deep-neural-network\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.011518</th>\n", | |
" <td>2015-07-03</td>\n", | |
" <td>34</td>\n", | |
" <td>Wood, Meent, Mansinghka</td>\n", | |
" <td>A New Approach to Probabilistic Programming Inference</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1507.00996v2\">1507.00996v2</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/new-approach-probabilistic-programming-inference\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.009359</th>\n", | |
" <td>2015-05-19</td>\n", | |
" <td>73</td>\n", | |
" <td>Kato, Harada</td>\n", | |
" <td>Image Reconstruction from Bag-of-Visual-Words</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1505.05190v1\">1505.05190v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/image-reconstruction-bagofvisualwords\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.009236</th>\n", | |
" <td>2015-06-02</td>\n", | |
" <td>56</td>\n", | |
" <td>Ipeirotis, Gabrilovich</td>\n", | |
" <td>Quizz: Targeted crowdsourcing with a billion (potential) users</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1506.01062v1\">1506.01062v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/quizz-targeted-crowdsourcing-billion-potential-users\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.008141</th>\n", | |
" <td>2015-07-05</td>\n", | |
" <td>23</td>\n", | |
" <td>Mirowski, Vlachos</td>\n", | |
" <td>Dependency Recurrent Neural Language Models for Sentence Completion</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1507.01193v1\">1507.01193v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/dependency-language-models-sentence-completion\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.005800</th>\n", | |
" <td>2015-05-28</td>\n", | |
" <td>39</td>\n", | |
" <td>Karaletsos, Rätsch</td>\n", | |
" <td>Automatic Relevance Determination For Deep Generative Models</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1505.07765v3\">1505.07765v3</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/automatic-relevance-determination-multiway-models\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.004865</th>\n", | |
" <td>2015-07-08</td>\n", | |
" <td>13</td>\n", | |
" <td>Steeg, Galstyan</td>\n", | |
" <td>The Information Sieve</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1507.02284v1\">1507.02284v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/information-647\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.004676</th>\n", | |
" <td>2014-04-30</td>\n", | |
" <td>617</td>\n", | |
" <td>Schmidhuber</td>\n", | |
" <td>Deep Learning in Neural Networks: An Overview</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1404.7828v4\">1404.7828v4</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/deep-learning-neural-networks-overview-7\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.004497</th>\n", | |
" <td>2015-05-15</td>\n", | |
" <td>38</td>\n", | |
" <td>Ramdas, Peña</td>\n", | |
" <td>Margins, Kernels and Non-linear Smoothed Perceptrons</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1505.04123v1\">1505.04123v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/margins-kernels-nonlinear-smoothed-perceptrons\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.004333</th>\n", | |
" <td>2015-04-27</td>\n", | |
" <td>48</td>\n", | |
" <td>Hu, Zhu, Xu, Zhang</td>\n", | |
" <td>Fast Sampling for Bayesian Max-Margin Models</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1504.07107v4\">1504.07107v4</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/stochastic-subgradient-methods\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.004306</th>\n", | |
" <td>2015-03-11</td>\n", | |
" <td>84</td>\n", | |
" <td>Hu, Lu, Li, Chen</td>\n", | |
" <td>Convolutional Neural Network Architectures for Matching Natural Language\\n Sentences</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1503.03244v1\">1503.03244v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/convolutional-neural-network-architectures-matching-natural-language-sentences\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.003273</th>\n", | |
" <td>2015-04-30</td>\n", | |
" <td>35</td>\n", | |
" <td>Aodha, Campbell, Kautz, Brostow</td>\n", | |
" <td>Hierarchical Subquery Evaluation for Active Learning on a Graph</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1504.08219v1\">1504.08219v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/hierarchical-subquery-evaluation-active-learning-graph\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.003243</th>\n", | |
" <td>2015-07-08</td>\n", | |
" <td>9</td>\n", | |
" <td>Landesa-Vázquez, Alba-Castro</td>\n", | |
" <td>Double-Base Asymmetric AdaBoost</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1507.02154v1\">1507.02154v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/doublebase-asymmetric-adaboost\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.003203</th>\n", | |
" <td>2015-02-10</td>\n", | |
" <td>83</td>\n", | |
" <td>Deisenroth, Fox, Rasmussen</td>\n", | |
" <td>Gaussian Processes for Data-Efficient Learning in Robotics and Control</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1502.02860v1\">1502.02860v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/gaussian-processes-dataefficient-learning-robotics-control\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.003058</th>\n", | |
" <td>2014-03-12</td>\n", | |
" <td>483</td>\n", | |
" <td>Brigadir, Greene, Cunningham</td>\n", | |
" <td>Adaptive Representations for Tracking Breaking News on Twitter</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1403.2923v3\">1403.2923v3</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/indexing-latent-semantic-analysis-16\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.002651</th>\n", | |
" <td>2015-04-24</td>\n", | |
" <td>31</td>\n", | |
" <td>Neelakantan, Collins</td>\n", | |
" <td>Learning Dictionaries for Named Entity Recognition using Minimal\\n Supervision</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1504.06650v1\">1504.06650v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/learning-dictionaries-named-entity-recognition-using-minimal-supervision\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.002585</th>\n", | |
" <td>2015-06-01</td>\n", | |
" <td>17</td>\n", | |
" <td>Roudi, Taylor</td>\n", | |
" <td>Learning with hidden variables</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1506.00354v2\">1506.00354v2</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/learning-hidden-variables-1\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.002513</th>\n", | |
" <td>2015-05-20</td>\n", | |
" <td>20</td>\n", | |
" <td>Sartakhti, Ghadiri, Afrabandpey</td>\n", | |
" <td>Fuzzy Least Squares Twin Support Vector Machines</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1505.05451v1\">1505.05451v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/fuzzy-least-squares-support-vector-machines-multiclass-problems\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.002120</th>\n", | |
" <td>2014-12-23</td>\n", | |
" <td>82</td>\n", | |
" <td>Firat, Aksan, Oztekin, Vural</td>\n", | |
" <td>Learning Deep Temporal Representations for Brain Decoding</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1412.7522v4\">1412.7522v4</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/d-eep-l-earning\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001799</th>\n", | |
" <td>2014-08-25</td>\n", | |
" <td>143</td>\n", | |
" <td>Kim</td>\n", | |
" <td>Convolutional Neural Networks for Sentence Classification</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1408.5882v2\">1408.5882v2</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/convolutional-neural-networks-sentence-classification\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001673</th>\n", | |
" <td>2015-07-09</td>\n", | |
" <td>5</td>\n", | |
" <td>Yu, Li</td>\n", | |
" <td>Parameter Sensitivity Analysis of Social Spider Algorithm</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1507.02491v1\">1507.02491v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/social-spider-algorithm-global-optimization\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001649</th>\n", | |
" <td>2015-07-02</td>\n", | |
" <td>6</td>\n", | |
" <td>Zhan, Taylor</td>\n", | |
" <td>Online Transfer Learning in Reinforcement Learning Domains</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1507.00436v2\">1507.00436v2</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/learning-domains\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001473</th>\n", | |
" <td>2015-03-09</td>\n", | |
" <td>30</td>\n", | |
" <td>Hinton, Vinyals, Dean</td>\n", | |
" <td>Distilling the Knowledge in a Neural Network</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1503.02531v1\">1503.02531v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/distilling-knowledge-neural-network-2\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001445</th>\n", | |
" <td>2015-07-24</td>\n", | |
" <td>3</td>\n", | |
" <td>Krijthe, Loog</td>\n", | |
" <td>Implicitly Constrained Semi-Supervised Least Squares Classification</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1507.06802v1\">1507.06802v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/implicitly-constrained-semisupervised-least-squares-classification\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001445</th>\n", | |
" <td>2015-07-24</td>\n", | |
" <td>3</td>\n", | |
" <td>Doncieux, Liénard, Girard, Hamdaoui, Chaskalovic</td>\n", | |
" <td>Multi-objective analysis of computational models</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1507.06877v1\">1507.06877v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/multiobjective-analysis-computational-models-1\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001419</th>\n", | |
" <td>2015-06-18</td>\n", | |
" <td>7</td>\n", | |
" <td>Runge, Donner, Kurths</td>\n", | |
" <td>Optimal model-free prediction from multivariate time series</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1506.05822v1\">1506.05822v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/optimal-modelfree-prediction-multivariate-time-series\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001402</th>\n", | |
" <td>2014-12-12</td>\n", | |
" <td>59</td>\n", | |
" <td>Abraham, Pedregosa, Eickenberg, Gervais, Muller, Kossaifi, Gramfort, Thirion, Varoquaux</td>\n", | |
" <td>Machine Learning for Neuroimaging with Scikit-Learn</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1412.3919v1\">1412.3919v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/machine-learning-neuroimaging-scikitlearn\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001355</th>\n", | |
" <td>2015-06-17</td>\n", | |
" <td>7</td>\n", | |
" <td>Liang, Ganesh, Raman, Czarnecki</td>\n", | |
" <td>SAT-based Analysis of Large Real-world Feature Models is Easy</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1506.05198v3\">1506.05198v3</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/satbased-analysis-large-realworld-feature-models-easy\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001289</th>\n", | |
" <td>2014-08-13</td>\n", | |
" <td>109</td>\n", | |
" <td>Le, Sarlos, Smola</td>\n", | |
" <td>Fastfood: Approximate Kernel Expansions in Loglinear Time</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1408.3060v1\">1408.3060v1</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/fastfood-approximating-kernel-expansions-loglinear-time\">link</a></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>0.001239</th>\n", | |
" <td>2015-06-12</td>\n", | |
" <td>7</td>\n", | |
" <td>Andreas, Rabinovich, Klein, Jordan</td>\n", | |
" <td>On the accuracy of self-normalized log-linear models</td>\n", | |
" <td><a href=\"http://arxiv.org/abs/1506.04147v2\">1506.04147v2</a></td>\n", | |
" <td><a href=\"http://www.mendeley.com/research/accuracy-62\">link</a></td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"execution_count": 157, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"pd.set_option('display.max_colwidth', 100000)\n", | |
"\n", | |
"data_out = data.sort(['Score'], ascending=[0])[['Score', 'Date', 'Readers', 'Authors','Title', 'arXiv', 'Mendeley']]\n", | |
"data_out['Date'] = [parse(date).replace(tzinfo=timezone('EST5EDT')).date() for date in data_out['Date']]\n", | |
"data_out['arXiv'] = ['<a href=\"{}\">{}</a>'.format(link, link.rsplit('/')[-1]) for link in data_out['arXiv']]\n", | |
"data_out['Mendeley'] = ['<a href=\"{}\">{}</a>'.format(link, 'link') for link in data_out['Mendeley']]\n", | |
"data_out['Authors'] = [', '.join([author['name'].rsplit()[-1] for author in elem]) for elem in data_out['Authors']]\n", | |
"\n", | |
"data_out.set_index('Score', inplace=True)\n", | |
"\n", | |
"with open('Papers.html', 'w') as f:\n", | |
" f.write(data_out.to_html(escape=False))\n", | |
"\n", | |
"HTML(data_out.head(n=30).to_html(escape=False))" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.4.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Good