spykeviewer-0.4.1/0000755000175000017500000000000012262550403012216 5ustar robrobspykeviewer-0.4.1/spykeviewer/0000755000175000017500000000000012262550403014573 5ustar robrobspykeviewer-0.4.1/spykeviewer/__init__.py0000644000175000017500000000010112262550403016674 0ustar robrob__version__ = '0.4.1' import matplotlib matplotlib.use('Qt4Agg')spykeviewer-0.4.1/spykeviewer/start.py0000644000175000017500000000212312262550403016300 0ustar robrobimport sys import os import platform import locale # Hack to circumvent OS X locale bug if platform.system() == 'Darwin': if os.getenv('LC_CTYPE') == 'UTF-8': os.environ['LC_CTYPE'] = '' else: locale.setlocale(locale.LC_ALL, '') # Use new style API import sip sip.setapi('QString', 2) sip.setapi('QDate', 2) sip.setapi('QDateTime', 2) sip.setapi('QTextStream', 2) sip.setapi('QTime', 2) sip.setapi('QVariant', 2) sip.setapi('QUrl', 2) sip.setapi('QVariant', 2) from PyQt4 import QtGui from PyQt4.QtCore import Qt import api import splash_rc # The entry point for Spyke Viewer def main(): api.app = QtGui.QApplication(sys.argv) splash_pic = QtGui.QPixmap(':/splash/splashimg') splash = QtGui.QSplashScreen(splash_pic) splash.setMask(splash_pic.mask()) splash.showMessage('Starting application...', Qt.AlignCenter | Qt.AlignBottom) splash.show() splash.raise_() api.app.processEvents() from ui.main_window_neo import MainWindowNeo ui = MainWindowNeo(splash=splash) splash.finish(ui) ui.show() ui.raise_() sys.exit(api.app.exec_())spykeviewer-0.4.1/spykeviewer/ui/0000755000175000017500000000000012262550403015210 5ustar robrobspykeviewer-0.4.1/spykeviewer/ui/ipython_connection.py0000644000175000017500000000712012262550403021473 0ustar robrobimport sys import logging ipython_available = False try: # Ipython 0.12, 0.13 import IPython from IPython.zmq.ipkernel import IPKernelApp from IPython.frontend.qt.kernelmanager import QtKernelManager from IPython.frontend.qt.console.rich_ipython_widget \ import RichIPythonWidget from IPython.lib.kernel import find_connection_file from PyQt4.QtCore import QTimer import atexit class LocalKernelApp(IPKernelApp): def initialize(self, argv=None): if argv is None: argv = [] super(LocalKernelApp, self).initialize(argv) self.kernel.eventloop = self.loop_qt4_nonblocking self.kernel.start() self.start() def loop_qt4_nonblocking(self, kernel): """ Non-blocking version of the ipython qt4 kernel loop """ kernel.timer = QTimer() kernel.timer.timeout.connect(kernel.do_one_iteration) kernel.timer.start(1000 * kernel._poll_interval) def push(self, d): for k, v in d.iteritems(): self.kernel.shell.user_ns[k] = v class IPythonConnection(): def __init__(self): self._stdout = sys.stdout self._stderr = sys.stderr self._dishook = sys.displayhook sys.stderr = sys.__stderr__ # Prevent message on kernel creation self.kernel_app = LocalKernelApp.instance() self.kernel_app.initialize() sys.stdout = self._stdout sys.stderr = self._stderr sys.displayhook = self._dishook def get_widget(self, droplist_completion=True): if IPython.__version__ < '0.13': completion = droplist_completion else: completion = 'droplist' if droplist_completion else 'plain' widget = RichIPythonWidget(gui_completion=completion) cf = find_connection_file(self.kernel_app.connection_file) km = QtKernelManager(connection_file=cf, config=widget.config) km.load_connection_file() km.start_channels() widget.kernel_manager = km atexit.register(km.cleanup_connection_file) sys.stdout = self._stdout sys.stderr = self._stderr sys.displayhook = self._dishook return widget def push(self, d): self.kernel_app.push(d) ipython_available = True except ImportError: try: # Ipython >= 1.0 from IPython.qt.inprocess import QtInProcessKernelManager from IPython.qt.console.rich_ipython_widget import RichIPythonWidget class IPythonConnection(): def __init__(self): self.kernel_manager = QtInProcessKernelManager() self.kernel_manager.start_kernel() self.kernel = self.kernel_manager.kernel self.kernel.gui = 'qt4' self.kernel_client = self.kernel_manager.client() self.kernel_client.start_channels() # Suppress debug messages self.kernel.log.setLevel(logging.WARNING) def get_widget(self, droplist_completion=True): completion = 'droplist' if droplist_completion else 'plain' widget = RichIPythonWidget(gui_completion=completion) widget.kernel_manager = self.kernel_manager widget.kernel_client = self.kernel_client return widget def push(self, d): self.kernel.shell.push(d) ipython_available = True except ImportError: pass spykeviewer-0.4.1/spykeviewer/ui/__init__.py0000644000175000017500000000000012262550403017307 0ustar robrobspykeviewer-0.4.1/spykeviewer/ui/settings_ui.py0000644000175000017500000001627012262550403020125 0ustar robrob# -*- coding: utf-8 -*- # Form implementation generated from reading ui file '/home/rob/Spyke/viewer/spykeviewer/ui/settings.ui' # # Created: Wed Oct 16 10:24:01 2013 # by: PyQt4 UI code generator 4.9.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_Settings(object): def setupUi(self, Settings): Settings.setObjectName(_fromUtf8("Settings")) Settings.resize(647, 438) Settings.setStyleSheet(_fromUtf8("QGroupBox {\n" " border: 1px solid gray;\n" " border-radius: 5px;\n" " margin-top: 1ex; /* leave space at the top for the title */\n" "}\n" "QGroupBox::title {\n" " subcontrol-origin: margin;\n" " subcontrol-position: top left; /* position at the top center */\n" " padding: 0 2px;\n" " left: 10px;\n" "}")) self.gridLayout_2 = QtGui.QGridLayout(Settings) self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.groupBox = QtGui.QGroupBox(Settings) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.gridLayout = QtGui.QGridLayout(self.groupBox) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.pathListWidget = QtGui.QListWidget(self.groupBox) self.pathListWidget.setObjectName(_fromUtf8("pathListWidget")) self.gridLayout.addWidget(self.pathListWidget, 0, 0, 1, 2) self.addPathButton = QtGui.QPushButton(self.groupBox) self.addPathButton.setObjectName(_fromUtf8("addPathButton")) self.gridLayout.addWidget(self.addPathButton, 1, 0, 1, 1) self.removePathButton = QtGui.QPushButton(self.groupBox) self.removePathButton.setObjectName(_fromUtf8("removePathButton")) self.gridLayout.addWidget(self.removePathButton, 1, 1, 1, 1) self.gridLayout_2.addWidget(self.groupBox, 4, 0, 1, 1) self.buttonBox = QtGui.QDialogButtonBox(Settings) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(_fromUtf8("buttonBox")) self.gridLayout_2.addWidget(self.buttonBox, 5, 0, 1, 1) self.groupBox_2 = QtGui.QGroupBox(Settings) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.horizontalLayout_2 = QtGui.QHBoxLayout(self.groupBox_2) self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.filterPath = QtGui.QLineEdit(self.groupBox_2) self.filterPath.setReadOnly(True) self.filterPath.setObjectName(_fromUtf8("filterPath")) self.horizontalLayout_2.addWidget(self.filterPath) self.changeFilterPathButton = QtGui.QPushButton(self.groupBox_2) self.changeFilterPathButton.setObjectName(_fromUtf8("changeFilterPathButton")) self.horizontalLayout_2.addWidget(self.changeFilterPathButton) self.gridLayout_2.addWidget(self.groupBox_2, 1, 0, 1, 1) self.groupBox_3 = QtGui.QGroupBox(Settings) self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) self.horizontalLayout = QtGui.QHBoxLayout(self.groupBox_3) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.selectionPath = QtGui.QLineEdit(self.groupBox_3) self.selectionPath.setReadOnly(True) self.selectionPath.setObjectName(_fromUtf8("selectionPath")) self.horizontalLayout.addWidget(self.selectionPath) self.changeSelectionPathButton = QtGui.QPushButton(self.groupBox_3) self.changeSelectionPathButton.setObjectName(_fromUtf8("changeSelectionPathButton")) self.horizontalLayout.addWidget(self.changeSelectionPathButton) self.gridLayout_2.addWidget(self.groupBox_3, 0, 0, 1, 1) self.groupBox_4 = QtGui.QGroupBox(Settings) self.groupBox_4.setObjectName(_fromUtf8("groupBox_4")) self.horizontalLayout_3 = QtGui.QHBoxLayout(self.groupBox_4) self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.dataPath = QtGui.QLineEdit(self.groupBox_4) self.dataPath.setReadOnly(True) self.dataPath.setObjectName(_fromUtf8("dataPath")) self.horizontalLayout_3.addWidget(self.dataPath) self.changeDataPathButton = QtGui.QPushButton(self.groupBox_4) self.changeDataPathButton.setObjectName(_fromUtf8("changeDataPathButton")) self.horizontalLayout_3.addWidget(self.changeDataPathButton) self.gridLayout_2.addWidget(self.groupBox_4, 2, 0, 1, 1) self.groupBox_5 = QtGui.QGroupBox(Settings) self.groupBox_5.setObjectName(_fromUtf8("groupBox_5")) self.horizontalLayout_4 = QtGui.QHBoxLayout(self.groupBox_5) self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.remoteScriptPath = QtGui.QLineEdit(self.groupBox_5) self.remoteScriptPath.setReadOnly(True) self.remoteScriptPath.setObjectName(_fromUtf8("remoteScriptPath")) self.horizontalLayout_4.addWidget(self.remoteScriptPath) self.changeRemoteScriptButton = QtGui.QPushButton(self.groupBox_5) self.changeRemoteScriptButton.setObjectName(_fromUtf8("changeRemoteScriptButton")) self.horizontalLayout_4.addWidget(self.changeRemoteScriptButton) self.gridLayout_2.addWidget(self.groupBox_5, 3, 0, 1, 1) self.retranslateUi(Settings) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Settings.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Settings.reject) QtCore.QMetaObject.connectSlotsByName(Settings) def retranslateUi(self, Settings): Settings.setWindowTitle(QtGui.QApplication.translate("Settings", "Settings", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox.setTitle(QtGui.QApplication.translate("Settings", "Plugin paths", None, QtGui.QApplication.UnicodeUTF8)) self.addPathButton.setText(QtGui.QApplication.translate("Settings", "Add", None, QtGui.QApplication.UnicodeUTF8)) self.removePathButton.setText(QtGui.QApplication.translate("Settings", "Remove", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_2.setTitle(QtGui.QApplication.translate("Settings", "Filter path", None, QtGui.QApplication.UnicodeUTF8)) self.changeFilterPathButton.setText(QtGui.QApplication.translate("Settings", "Change", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_3.setTitle(QtGui.QApplication.translate("Settings", "Selection path", None, QtGui.QApplication.UnicodeUTF8)) self.changeSelectionPathButton.setText(QtGui.QApplication.translate("Settings", "Change", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_4.setTitle(QtGui.QApplication.translate("Settings", "Data path", None, QtGui.QApplication.UnicodeUTF8)) self.changeDataPathButton.setText(QtGui.QApplication.translate("Settings", "Change", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_5.setTitle(QtGui.QApplication.translate("Settings", "Remote script", None, QtGui.QApplication.UnicodeUTF8)) self.changeRemoteScriptButton.setText(QtGui.QApplication.translate("Settings", "Change", None, QtGui.QApplication.UnicodeUTF8)) spykeviewer-0.4.1/spykeviewer/ui/remote_thread.py0000644000175000017500000000177412262550403020415 0ustar robrobfrom PyQt4.QtCore import SIGNAL, QThread class RemoteThread(QThread): """ A thread to catch either stdout or stderr of a remote process. Emits a signal ``output(id, message)`` whenever the remote process writes an output line and ``execution_complete(id)`` when the process exits. """ def __init__(self, process, id_code, err, parent=None): QThread.__init__(self, parent) self.id = id_code self.err = err self.process = process def run(self): if self.err: it = iter(self.process.stderr.readline, b'') for line in it: self.emit(SIGNAL('output(int, QString)'), self.id, line.rstrip().decode('ascii')) else: it = iter(self.process.stdout.readline, b'') for line in it: self.emit(SIGNAL('output(int, QString)'), self.id, line.rstrip().decode('ascii')) self.emit(SIGNAL('execution_complete(int)'), self.id)spykeviewer-0.4.1/spykeviewer/ui/neo_navigation.ui0000644000175000017500000000745512262550403020562 0ustar robrob neoNavigationDock 0 0 352 559 Navigation Blocks: Qt::CustomContextMenu QAbstractItemView::NoEditTriggers QAbstractItemView::ExtendedSelection Channel Groups: Qt::CustomContextMenu QAbstractItemView::NoEditTriggers QAbstractItemView::ExtendedSelection Channels: Qt::CustomContextMenu QAbstractItemView::NoEditTriggers QAbstractItemView::ExtendedSelection Segments: Qt::CustomContextMenu QAbstractItemView::NoEditTriggers QAbstractItemView::ExtendedSelection Units: Qt::CustomContextMenu QAbstractItemView::NoEditTriggers QAbstractItemView::ExtendedSelection spykeviewer-0.4.1/spykeviewer/ui/checkable_item_delegate.py0000644000175000017500000000620012262550403022331 0ustar robrobfrom PyQt4.QtCore import Qt from PyQt4.QtGui import QStyledItemDelegate, QStyle, QApplication class CheckableItemDelegate(QStyledItemDelegate): """ A StyledItemDelegate for checkable items with support for both checkboxes and radio buttons. """ CheckTypeRole = Qt.UserRole + 102 CheckedRole = Qt.UserRole + 103 CheckBoxCheckType = 1 RadioCheckType = 2 def __init__(self, viewWidget): QStyledItemDelegate.__init__(self) self.viewWidget = viewWidget self.counter = 0 def paint(self, painter, option, index): #noinspection PyArgumentList style = QApplication.instance().style() if index.data(CheckableItemDelegate.CheckTypeRole): # Size and spacing in current style is_radio = index.data(CheckableItemDelegate.CheckTypeRole) ==\ CheckableItemDelegate.RadioCheckType if is_radio: button_width = style.pixelMetric( QStyle.PM_ExclusiveIndicatorWidth, option) spacing = style.pixelMetric( QStyle.PM_RadioButtonLabelSpacing, option) else: button_width = style.pixelMetric( QStyle.PM_IndicatorWidth, option) spacing = style.pixelMetric( QStyle.PM_CheckBoxLabelSpacing, option) # Draw default appearance shifted to right myOption = option left = myOption.rect.left() myOption.rect.setLeft(left + spacing + button_width) QStyledItemDelegate.paint(self, painter, myOption, index) # Draw check button to open space (where expand indicator would be) myOption.rect.setLeft(left) myOption.rect.setWidth(button_width) if index.data(CheckableItemDelegate.CheckedRole): myOption.state |= QStyle.State_On else: myOption.state |= QStyle.State_Off if is_radio: style.drawPrimitive(QStyle.PE_IndicatorRadioButton, myOption, painter) else: style.drawPrimitive(QStyle.PE_IndicatorCheckBox, myOption, painter) else: QStyledItemDelegate.paint(self, painter, option, index) def sizeHint(self, option, index): s = QStyledItemDelegate.sizeHint(self, option, index) # sizeHint is for some reason only called once, so set # size globally #if index.data(CheckableItemDelegate.CheckTypeRole): # # Determine size of check buttons in current style # #noinspection PyArgumentList # button_height = QApplication.style().pixelMetric(QStyle.PM_ExclusiveIndicatorHeight, option) # # Ensure that row is tall enough to draw check button # print button_height # s.setHeight(max(s.height(), button_height)) radio_height = QApplication.style().pixelMetric( QStyle.PM_ExclusiveIndicatorHeight, option) check_height = QApplication.style().pixelMetric( QStyle.PM_IndicatorHeight, option) s.setHeight(max(s.height(), radio_height, check_height)) return sspykeviewer-0.4.1/spykeviewer/ui/settings.py0000644000175000017500000000621712262550403017430 0ustar robrobimport os import os.path as osp from PyQt4.QtGui import QDialog, QFileDialog from PyQt4.QtCore import Qt from settings_ui import Ui_Settings class SettingsWindow(QDialog, Ui_Settings): def __init__(self, selection_path, filter_path, data_path, remote_script, plugin_paths, parent=None): QDialog.__init__(self, parent) self.setupUi(self) self.selectionPath.setText(selection_path) self.filterPath.setText(filter_path) self.dataPath.setText(data_path) self.remoteScriptPath.setText(remote_script) for p in plugin_paths: self.pathListWidget.addItem(p) def selection_path(self): return self.selectionPath.text() def filter_path(self): return self.filterPath.text() def data_path(self): return self.dataPath.text() def remote_script(self): return self.remoteScriptPath.text() def plugin_paths(self): return [i.text() for i in self.pathListWidget.findItems('*', Qt.MatchWrap | Qt.MatchWildcard)] def _makeDirDialog(self, name): d = QFileDialog(self, name, os.getcwd()) d.setAcceptMode(QFileDialog.AcceptOpen) d.setFileMode(QFileDialog.Directory) d.setOption(QFileDialog.ShowDirsOnly, True) d.setNameFilter("Directories") return d def on_changeSelectionPathButton_pressed(self): d = self._makeDirDialog('Choose selection path') if d.exec_() == d.Accepted: filename = osp.realpath(unicode(d.selectedFiles()[0])) self.selectionPath.setText(osp.normpath(filename)) else: return def on_changeFilterPathButton_pressed(self): d = self._makeDirDialog('Choose filter path') if d.exec_() == d.Accepted: filename = osp.realpath(unicode(d.selectedFiles()[0])) self.filterPath.setText(osp.normpath(filename)) else: return def on_changeDataPathButton_pressed(self): d = self._makeDirDialog('Choose data path') if d.exec_() == d.Accepted: filename = osp.realpath(unicode(d.selectedFiles()[0])) self.dataPath.setText(osp.normpath(filename)) else: return def on_changeRemoteScriptButton_pressed(self): d = QFileDialog(self, 'Choose remote script', self.remote_script()) d.setAcceptMode(QFileDialog.AcceptOpen) d.setFileMode(QFileDialog.ExistingFile) if d.exec_() == d.Accepted: filename = osp.realpath(unicode(d.selectedFiles()[0])) self.remoteScriptPath.setText(osp.normpath(filename)) else: return def on_addPathButton_pressed(self): d = self._makeDirDialog('Choose plugin path') if d.exec_() == d.Accepted: filename = osp.realpath(unicode(d.selectedFiles()[0])) if filename not in self.plugin_paths(): self.pathListWidget.addItem(osp.normpath(filename)) else: return def on_removePathButton_pressed(self): if not self.pathListWidget.currentItem(): return self.pathListWidget.takeItem(self.pathListWidget.currentRow())spykeviewer-0.4.1/spykeviewer/ui/io_settings.py0000644000175000017500000002014012262550403020106 0ustar robrobfrom guidata.qt.QtCore import SIGNAL, SLOT from PyQt4.QtGui import QVBoxLayout, QDialog, QDialogButtonBox, QMessageBox from guidata.dataset.datatypes import DataSet from guidata.dataset.dataitems import (FloatItem, IntItem, BoolItem, ChoiceItem, StringItem) from guidata.dataset.qtwidgets import DataSetEditGroupBox, DataSetEditLayout from guidata.dataset.qtitemwidgets import LineEditWidget class IntOrNoneItem(IntItem): """ Like the normal guidata IntItem, but allows empty input that is interpreted as None. """ def check_value(self, value): #raise Exception if value is None: return True return super(IntOrNoneItem, self).check_value(value) def from_string(self, value): if value == 'None' or value == '': # None is allowed return None ret = super(IntOrNoneItem, self).from_string(value) if ret is None: # But None from super is an error return 'Error' return ret class FloatOrNoneItem(FloatItem): """ Like the normal guidata FloatItem, but allows empty input that is interpreted as None. """ def check_value(self, value): #raise Exception if value is None: return True return super(FloatOrNoneItem, self).check_value(value) def from_string(self, value): if value == 'None' or value == '': # None is allowed return None ret = super(FloatOrNoneItem, self).from_string(value) if ret is None: # But None from super is an error return 'Error' return ret DataSetEditLayout.register(IntOrNoneItem, LineEditWidget) DataSetEditLayout.register(FloatOrNoneItem, LineEditWidget) def valid_params(params): if not params: return False if not params.values()[0]: return False return True def has_ui_params(io): if valid_params(io.read_params): return True return valid_params(io.write_params) class ParamDialog(QDialog): """ A Dialog with read and write option for a Neo IO. """ def __init__(self, io, params_read, params_write, parent): super(ParamDialog, self).__init__(parent) self.setWindowTitle('Options for %s' % (io.name or io.__name__)) self.io = io self.setModal(True) self.mainLayout = QVBoxLayout() self.setLayout(self.mainLayout) buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.connect(buttons, SIGNAL("accepted()"), SLOT("accept()")) self.connect(buttons, SIGNAL("rejected()"), SLOT("reject()")) self.read_params_edit = None self.read_params = params_read if valid_params(io.read_params): params = self.neo_to_guidata(io.read_params.values()[0], self.read_params) self.read_params_edit = DataSetEditGroupBox( "Read", params, show_button=False) self.mainLayout.addWidget(self.read_params_edit) self.write_params_edit = None self.write_params = params_write if valid_params(io.write_params): params = self.neo_to_guidata(io.write_params.values()[0], self.write_params) self.write_params_edit = DataSetEditGroupBox( "Write", params, show_button=False) self.mainLayout.addWidget(self.write_params_edit) self.mainLayout.addWidget(buttons) def neo_to_guidata(self, paramlist, param_dict): """ Take a list of parameter description in Neo format and return a respective guidata DataSet. :param list paramlist: List of (name, parameters) tuples that describe load or save parameters Neo style. :param dict param_dict: Dictionary with default values. Is modified to include new default values when the respective parameter is not present. """ # Normal widgets guidata_types = { bool: BoolItem, float: FloatItem, int: IntItem, str: StringItem, unicode: StringItem } # Widgets where parameter can be None guidata_types_with_none = { bool: BoolItem, float: FloatOrNoneItem, int: IntOrNoneItem, str: StringItem, unicode: StringItem } # Build up parameter items dictionary items = {} for name, params in paramlist: if 'label' in params: label = params['label'] else: label = name if name in param_dict: default = param_dict[name] else: if 'value' in params: default = params['value'] else: default = None if 'type' in params: if default is None: classitem = guidata_types_with_none[params['type']] else: classitem = guidata_types[params['type']] else: if default is None: classitem = guidata_types_with_none[type(default)] else: classitem = guidata_types[type(default)] if 'possible' in params: possible = params['possible'][:] for i, p in enumerate(possible): if possible[i] == ' ': possible[i] = 'Space' elif possible[i] == '\t': possible[i] = 'Tab' def_choice = 0 if name in param_dict and name in params['possible']: def_choice = params['possible'].index(param_dict[name]) elif default in params['possible']: def_choice = params['possible'].index(default) items[name] = ChoiceItem(label, possible, default=def_choice) else: items[name] = classitem(label, default=default) if name not in param_dict: param_dict[name] = default guidata_class = type('Parameters', (DataSet,), items) return guidata_class def accept(self): """ Validate inputs """ ok = True if self.read_params_edit: if self.read_params_edit.edit.check_all_values(): self.read_params_edit.edit.accept_changes() else: ok = False if self.write_params_edit: if self.write_params_edit.edit.check_all_values(): self.write_params_edit.edit.accept_changes() else: ok = False if not ok: QMessageBox.warning(self, 'Invalid parameters', "Some required entries are incorrect.\n", "Please check highlighted fields.") else: QDialog.accept(self) def _get_choice_value(self, name, value, params): """ Make sure that a parameter value is the actual value, not an index into the choises for parameters with a list of possible values. """ for n, d in params.values()[0]: if name != n: continue if not 'possible' in d: return value return d['possible'][value] # Should not happen, just return original value return value def get_read_params(self): """ Return a dictionary of read parameter values suitable for passing to Neo IO read function. """ d = {} for name in self.read_params.iterkeys(): d[name] = self._get_choice_value( name, getattr(self.read_params_edit.dataset, name), self.io.read_params) return d def get_write_params(self): """ Return a dictionary of write parameter values suitable for passing to Neo IO write function. """ d = {} for name in self.write_params.iterkeys(): d[name] = self._get_choice_value( name, getattr(self.write_params_edit.dataset, name,), self.io.write_params) return dspykeviewer-0.4.1/spykeviewer/ui/neo_navigation.py0000644000175000017500000005436112262550403020573 0ustar robrobfrom PyQt4.QtGui import (QDockWidget, QMenu, QAction, QMessageBox, QItemSelectionRange, QItemSelection, QStandardItemModel, QStandardItem, QItemSelectionModel) from PyQt4.QtCore import Qt, pyqtSignal from spyderlib.utils.qthelpers import get_icon import neo from spykeutils.plugin.data_provider_neo import NeoDataProvider import spykeutils.tools from neo_navigation_ui import Ui_neoNavigationDock from .. import api class NeoNavigationDock(QDockWidget, Ui_neoNavigationDock): """ Implements a navigation dock for Neo hierarchies. Tightly coupled with :class:`main_window_neo.MainWindowNeo`, the main reason for this class to exist is to keep the dock out of the general ui file. """ object_removed = pyqtSignal() # Signal to remove an object def __init__(self, parent): QDockWidget.__init__(self, parent) self.parent = parent self.setupUi(self) self.block_model = QStandardItemModel() self.segment_model = QStandardItemModel() self.channelgroup_model = QStandardItemModel() self.channel_model = QStandardItemModel() self.unit_model = QStandardItemModel() self.neoBlockList.setModel(self.block_model) self.neoSegmentList.setModel(self.segment_model) self.neoChannelGroupList.setModel(self.channelgroup_model) self.neoChannelList.setModel(self.channel_model) self.neoUnitList.setModel(self.unit_model) self.neoBlockList.doubleClicked.connect( lambda x: self._edit_item_annotations(x, self.block_model)) self.neoSegmentList.doubleClicked.connect( lambda x: self._edit_item_annotations(x, self.segment_model)) self.neoChannelGroupList.doubleClicked.connect( lambda x: self._edit_item_annotations(x, self.channelgroup_model)) self.neoChannelList.doubleClicked.connect( lambda x: self._edit_item_annotations(x, self.channel_model)) self.neoUnitList.doubleClicked.connect( lambda x: self._edit_item_annotations(x, self.unit_model)) self.neoBlockList.selectionModel().selectionChanged.connect( self.selected_blocks_changed) self.neoChannelGroupList.selectionModel().selectionChanged.connect( self.selected_channel_groups_changed) self.neoChannelList.selectionModel().selectionChanged.connect( self.selected_channels_changed) self.neoUnitList.selectionModel().selectionChanged.connect( self.selected_units_changed) self.neoSegmentList.selectionModel().selectionChanged.connect( self.selected_segments_changed) def clear(self): """ Clear all lists """ self.neoBlockList.clearSelection() self.block_model.clear() def get_letter_id(self, id_, small=False): """ Return a name consisting of letters given an integer """ if id_ < 0: return '' name = '' id_ += 1 if small: start = ord('a') else: start = ord('A') while id_ > 26: id_ -= 1 name += chr(start + (id_ % 26)) id_ /= 26 name += chr(start + id_ - 1) return name[::-1] def ensure_not_filtered(self, objects, all_objects, filters): """ Deactivates all filters that prevent the the given sequence of objects to be displayed. The passed filter tuple list is modified to only include valid filters. :param sequence objects: The objects that need to be visible. :param sequence all_objects: The whole object list to be filtered, including objects that are allowed to be hidden. :param sequence filters: A sequence of (Filter, name) tuples. """ objset = set(objects) if not objset.issubset( set(self.parent.filter_list(all_objects, filters))): i = 1 while i <= len(filters): test_filters = filters[:i] if objset.issubset(set(self.parent.filter_list( all_objects, test_filters))): i += 1 else: test_filters[-1][0].active = False filters.pop(i - 1) for o in objects: i = 0 while i < len(filters): if self.parent.is_filtered(o, [filters[i]]): filters[i][0].active = False filters.pop(i) else: i += 1 def filter_ordered(self, objects, filters): """ Filter a sequence of objects with a sequence of filters. Apply the filters in the order given by the sequence. Return the filtered list. """ for f in filters: if f[0].combined: objects = self.parent.filter_list(objects, [f]) else: objects = [o for o in objects if not self.parent.is_filtered(o, [f])] return objects def populate_neo_block_list(self): """ Fill the block list with appropriate entries. Qt.UserRole: The :class:`neo.Block` object """ self.block_model.clear() filters = self.parent.get_active_filters('Block') blocks = self.filter_ordered( self.parent.block_names.keys(), filters) for b in blocks: item = QStandardItem(self.parent.block_names[b]) item.setData(b, Qt.UserRole) self.block_model.appendRow(item) self.neoBlockList.setCurrentIndex(self.block_model.index(0, 0)) self.set_blocks_label() if not blocks: self.selected_blocks_changed() def populate_neo_segment_list(self): """ Fill the segment list with appropriate entries. Qt.UserRole: The :class:`neo.Segment` object """ self.segment_model.clear() segments = [] for b in self.blocks(): segments.extend(b.segments) filters = self.parent.get_active_filters('Segment') segments = self.filter_ordered(segments, filters) for i, s in enumerate(segments): if s.name: name = s.name + ' (%s-%i)' % \ (self.parent.block_ids[s.block], i) else: name = '%s-%i' % (self.parent.block_ids[s.block], i) new_item = QStandardItem(name) new_item.setData(s, Qt.UserRole) self.segment_model.appendRow(new_item) self.neoSegmentList.setCurrentIndex(self.segment_model.index(0, 0)) if api.config.autoselect_segments: self.neoSegmentList.selectAll() self.selected_segments_changed() def populate_neo_channel_group_list(self): """ Fill the channel group list with appropriate entries. Qt.UserRole: The :class:`neo.RecordingChannelGroup` object """ self.neoChannelGroupList.clearSelection() self.channelgroup_model.clear() self.parent.channel_group_names.clear() rcgs = [] for b in self.blocks(): rcgs.extend(b.recordingchannelgroups) filters = self.parent.get_active_filters( 'Recording Channel Group') rcgs = self.filter_ordered(rcgs, filters) for i, rcg in enumerate(rcgs): self.parent.channel_group_names[rcg] = '%s-%s' % ( self.parent.block_ids[rcg.block], self.get_letter_id(i, True)) if rcg.name: name = rcg.name + ' (%s)' % \ self.parent.channel_group_names[rcg] else: name = self.parent.channel_group_names[rcg] new_item = QStandardItem(name) new_item.setData(rcg, Qt.UserRole) self.channelgroup_model.appendRow(new_item) self.neoChannelGroupList.setCurrentIndex( self.channelgroup_model.index(0, 0)) if api.config.autoselect_channel_groups: self.neoChannelGroupList.selectAll() elif not rcgs: self.selected_channel_groups_changed() def populate_neo_channel_list(self): """ Fill the channel list with appropriate entries. Data slots: Qt.UserRole: The :class:`neo.RecordingChannel` Qt.UserRole+1: The channel index """ self.channel_model.clear() channels = set() rcs = [] rc_group_name = {} for rcg in self.recording_channel_groups(): for rc in rcg.recordingchannels: if not api.config.duplicate_channels and rc in channels: continue channels.add(rc) rcs.append(rc) rc_group_name[rc] = self.parent.channel_group_names[rcg] filters = self.parent.get_active_filters( 'Recording Channel') rcs = self.filter_ordered(rcs, filters) for rc in rcs: identifier = '%s.%d' % \ (rc_group_name[rc], rc.index) if rc.name: name = rc.name + ' (%s)' % identifier else: name = identifier new_item = QStandardItem(name) new_item.setData(rc, Qt.UserRole) new_item.setData(rc.index, Qt.UserRole + 1) self.channel_model.appendRow(new_item) if api.config.autoselect_channels: self.neoChannelList.selectAll() self.selected_channels_changed() def populate_neo_unit_list(self): """ Fill the unit list with appropriate entries. Qt.UserRole: The :class:`neo.Unit` object """ self.unit_model.clear() units = [] for rcg in self.recording_channel_groups(): units.extend(rcg.units) filters = self.parent.get_active_filters('Unit') units = self.filter_ordered(units, filters) for i, u in enumerate(units): if self.parent.is_filtered(u, filters): continue if u.name: name = u.name + ' (%s-%d)' % \ (self.parent.channel_group_names[rcg], i) else: name = '%s-%d' % (self.parent.channel_group_names[rcg], i) new_item = QStandardItem(name) new_item.setData(u, Qt.UserRole) self.unit_model.appendRow(new_item) if api.config.autoselect_units: self.neoUnitList.selectAll() self.selected_units_changed() def set_blocks_label(self): self.blocksLabel.setText( 'Blocks (%d/%d):' % (len(self.neoBlockList.selectedIndexes()), self.block_model.rowCount())) def set_channel_groups_label(self): self.channelGroupsLabel.setText( 'Channel Groups (%d/%d):' % ( len(self.neoChannelGroupList.selectedIndexes()), self.channelgroup_model.rowCount())) def selected_blocks_changed(self): self.set_blocks_label() self.populate_neo_channel_group_list() self.populate_neo_segment_list() def selected_channel_groups_changed(self): self.set_channel_groups_label() self.populate_neo_channel_list() self.populate_neo_unit_list() def selected_channels_changed(self): self.channelsLabel.setText( 'Channels (%d/%d):' % ( len(self.neoChannelList.selectedIndexes()), self.channel_model.rowCount())) def selected_units_changed(self): self.unitsLabel.setText( 'Units (%d/%d):' % ( len(self.neoUnitList.selectedIndexes()), self.unit_model.rowCount())) def selected_segments_changed(self): self.segmentsLabel.setText( 'Segments (%d/%d):' % ( len(self.neoSegmentList.selectedIndexes()), self.segment_model.rowCount())) def _edit_item_annotations(self, index, model): api.annotation_editor(model.data(index, Qt.UserRole)) def remove_selected(self, list_widget): """ Remove all selected objects from the given list widget. """ items = list_widget.selectedIndexes() if len(items) < 1: return model = list_widget.model() question = ('Do you really want to remove %d %s' % (len(items), type(model.data(items[0], Qt.UserRole)).__name__)) if len(items) > 1: question += 's' question += '?' if QMessageBox.question( self, 'Please confirm', question, QMessageBox.Yes | QMessageBox.No) == QMessageBox.No: return for i in list_widget.selectedIndexes(): data = model.data(i, Qt.UserRole) if isinstance(data, neo.Block): self.parent.block_names.pop(data) else: spykeutils.tools.remove_from_hierarchy(data) list_widget.selectionModel().select(i, QItemSelectionModel.Deselect) self.object_removed.emit() def _context_actions(self, list_widget): idx = list_widget.currentIndex() if not idx: return [] data = list_widget.model().data(idx, Qt.UserRole) edit_action = QAction(get_icon('edit.png'), 'Edit annotations...', self) edit_action.triggered.connect( lambda x: self._edit_item_annotations(idx, list_widget.model())) delete_name = 'Delete %s' % type(data).__name__ if len(list_widget.selectedIndexes()) > 1: delete_name += 's' delete_action = QAction(get_icon('editdelete.png'), delete_name, self) delete_action.triggered.connect( lambda x: self.remove_selected(list_widget)) return [edit_action, delete_action] def on_neoBlockList_customContextMenuRequested(self, pos): if not self.neoBlockList.selectedIndexes(): return context_menu = QMenu(self) context_menu.addActions(self._context_actions(self.neoBlockList)) context_menu.popup(self.neoBlockList.mapToGlobal(pos)) def on_neoSegmentList_customContextMenuRequested(self, pos): if not self.neoSegmentList.selectedIndexes(): return context_menu = QMenu(self) context_menu.addActions(self._context_actions(self.neoSegmentList)) context_menu.popup(self.neoSegmentList.mapToGlobal(pos)) def on_neoChannelGroupList_customContextMenuRequested(self, pos): if not self.neoChannelGroupList.selectedIndexes(): return context_menu = QMenu(self) context_menu.addActions(self._context_actions(self.neoChannelGroupList)) context_menu.popup(self.neoChannelGroupList.mapToGlobal(pos)) def on_neoChannelList_customContextMenuRequested(self, pos): if not self.neoChannelList.selectedIndexes(): return context_menu = QMenu(self) context_menu.addActions(self._context_actions(self.neoChannelList)) context_menu.popup(self.neoChannelList.mapToGlobal(pos)) def on_neoUnitList_customContextMenuRequested(self, pos): if not self.neoUnitList.selectedIndexes(): return context_menu = QMenu(self) context_menu.addActions(self._context_actions(self.neoUnitList)) context_menu.popup(self.neoUnitList.mapToGlobal(pos)) def blocks(self): """ Return selected :class:`neo.Block` objects. """ return [self.block_model.data(i, Qt.UserRole) for i in self.neoBlockList.selectedIndexes()] def segments(self): """ Return selected :class:`neo.Segment` objects. """ return [self.segment_model.data(i, Qt.UserRole) for i in self.neoSegmentList.selectedIndexes()] def recording_channel_groups(self): """ Return selected :class:`neo.RecordingChannelGroup` objects. """ return [self.channelgroup_model.data(i, Qt.UserRole) for i in self.neoChannelGroupList.selectedIndexes()] def recording_channels(self): """ Return selected :class:`neo.RecordingChannel` objects. """ return [self.channel_model.data(i, Qt.UserRole) for i in self.neoChannelList.selectedIndexes()] def units(self): """ Return selected :class:`neo.Unit` objects. """ return [self.unit_model.data(i, Qt.UserRole) for i in self.neoUnitList.selectedIndexes()] def set_selection(self, data): """ Set the selected data. """ block_list = [] for b in data['blocks']: cl = None rp = None if len(b) > 2: cl = NeoDataProvider.find_io_class(b[2]) if len(b) > 3: rp = b[3] loaded = NeoDataProvider.get_block( b[1], b[0], force_io=cl, read_params=rp) if loaded is None: raise IOError('One of the files contained in the ' 'selection could not be loaded!') block_list.append(loaded) block_set = set([(b[0], b[1]) for b in data['blocks']]) # Select blocks self.ensure_not_filtered(block_list, self.parent.block_names.keys(), self.parent.get_active_filters('Block')) self.populate_neo_block_list() selection = QItemSelection() for i in self.block_model.findItems( '*', Qt.MatchWrap | Qt.MatchWildcard): block = i.data(Qt.UserRole) t = (NeoDataProvider.block_indices[block], self.parent.block_files[block]) if t in block_set: selection.append(QItemSelectionRange( self.block_model.indexFromItem(i))) self.neoBlockList.selectionModel().select( selection, QItemSelectionModel.ClearAndSelect) # Select segments seg_list = [block_list[idx[1]].segments[idx[0]] for idx in data['segments']] all_segs = [] for b in self.blocks(): all_segs.extend(b.segments) self.ensure_not_filtered(seg_list, all_segs, self.parent.get_active_filters('Segment')) self.populate_neo_segment_list() selection = QItemSelection() for i in self.segment_model.findItems( '*', Qt.MatchWrap | Qt.MatchWildcard): segment = i.data(Qt.UserRole) if not segment.block in block_list: continue seg_idx = segment.block.segments.index(segment) block_idx = block_list.index(segment.block) if [seg_idx, block_idx] in data['segments']: selection.append(QItemSelectionRange( self.segment_model.indexFromItem(i))) self.neoSegmentList.selectionModel().select( selection, QItemSelectionModel.ClearAndSelect) # Select recording channel groups rcg_list = [block_list[rcg[1]].recordingchannelgroups[rcg[0]] for rcg in data['channel_groups']] all_rcgs = [] for b in self.blocks(): all_rcgs.extend(b.recordingchannelgroups) self.ensure_not_filtered( rcg_list, all_rcgs, self.parent.get_active_filters('Recording Channel Group')) self.populate_neo_channel_group_list() selection = QItemSelection() for i in self.channelgroup_model.findItems( '*', Qt.MatchWrap | Qt.MatchWildcard): rcg = i.data(Qt.UserRole) if not rcg.block in block_list: continue rcg_idx = rcg.block.recordingchannelgroups.index(rcg) block_idx = block_list.index(rcg.block) if [rcg_idx, block_idx] in data['channel_groups']: selection.append(QItemSelectionRange( self.channelgroup_model.indexFromItem(i))) self.neoChannelGroupList.selectionModel().select( selection, QItemSelectionModel.ClearAndSelect) # Select channels rc_list = [rcg_list[rc[1]].recordingchannels[rc[0]] for rc in data['channels']] all_rcs = [] for rcg in self.recording_channel_groups(): for rc in rcg.recordingchannels: if not api.config.duplicate_channels and rc in all_rcs: continue all_rcs.append(rc) self.ensure_not_filtered( rc_list, all_rcs, self.parent.get_active_filters('Recording Channel')) self.populate_neo_channel_list() selection = QItemSelection() rcg_set = set(rcg_list) for i in self.channel_model.findItems( '*', Qt.MatchWrap | Qt.MatchWildcard): channel = i.data(Qt.UserRole) if not set(channel.recordingchannelgroups).intersection(rcg_set): continue for rcg in channel.recordingchannelgroups: if [rcg.recordingchannels.index(channel), rcg_list.index(rcg)] in data['channels']: selection.append(QItemSelectionRange( self.channel_model.indexFromItem(i))) break self.neoChannelList.selectionModel().select( selection, QItemSelectionModel.ClearAndSelect) # Select units unit_list = [rcg_list[u[1]].units[u[0]] for u in data['units']] all_units = [] for rcg in self.recording_channel_groups(): all_units.extend(rcg.units) self.ensure_not_filtered( unit_list, all_units, self.parent.get_active_filters('Unit')) self.populate_neo_unit_list() selection = QItemSelection() for i in self.unit_model.findItems( '*', Qt.MatchWrap | Qt.MatchWildcard): unit = i.data(Qt.UserRole) if unit.recordingchannelgroup not in rcg_list: continue rcg_idx = rcg_list.index(unit.recordingchannelgroup) unit_idx = unit.recordingchannelgroup.units.index(unit) if [unit_idx, rcg_idx] in data['units']: selection.append(QItemSelectionRange( self.unit_model.indexFromItem(i))) self.neoUnitList.selectionModel().select( selection, QItemSelectionModel.ClearAndSelect) self.parent.refresh_filters()spykeviewer-0.4.1/spykeviewer/ui/main_ui.py0000644000175000017500000007661012262550403017215 0ustar robrob# -*- coding: utf-8 -*- # Form implementation generated from reading ui file '/home/rob/Spyke/viewer/spykeviewer/ui/main.ui' # # Created: Mon Nov 4 17:46:37 2013 # by: PyQt4 UI code generator 4.9.3 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: _fromUtf8 = lambda s: s class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(819, 867) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) MainWindow.setMinimumSize(QtCore.QSize(790, 580)) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/Application/Main")), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon) MainWindow.setAutoFillBackground(False) MainWindow.setStyleSheet(_fromUtf8("QGroupBox {\n" " border: 1px solid gray;\n" " border-radius: 5px;\n" " margin-top: 1ex; /* leave space at the top for the title */\n" "}\n" "QGroupBox::title {\n" " subcontrol-origin: margin;\n" " subcontrol-position: top left; /* position at the top center */\n" " padding: 0 2px;\n" " left: 10px;\n" "}")) MainWindow.setTabShape(QtGui.QTabWidget.Rounded) MainWindow.setDockOptions(QtGui.QMainWindow.AllowNestedDocks|QtGui.QMainWindow.AllowTabbedDocks|QtGui.QMainWindow.AnimatedDocks) self.centralWidget = QtGui.QWidget(MainWindow) self.centralWidget.setObjectName(_fromUtf8("centralWidget")) self.horizontalLayout_2 = QtGui.QHBoxLayout(self.centralWidget) self.horizontalLayout_2.setMargin(4) self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) MainWindow.setCentralWidget(self.centralWidget) self.mainMenu = QtGui.QMenuBar(MainWindow) self.mainMenu.setGeometry(QtCore.QRect(0, 0, 819, 25)) self.mainMenu.setObjectName(_fromUtf8("mainMenu")) self.menuFile = QtGui.QMenu(self.mainMenu) self.menuFile.setObjectName(_fromUtf8("menuFile")) self.menuRead_Mode = QtGui.QMenu(self.menuFile) self.menuRead_Mode.setObjectName(_fromUtf8("menuRead_Mode")) self.menuCascade_Mode = QtGui.QMenu(self.menuFile) self.menuCascade_Mode.setObjectName(_fromUtf8("menuCascade_Mode")) self.menuHelp = QtGui.QMenu(self.mainMenu) self.menuHelp.setObjectName(_fromUtf8("menuHelp")) self.menuSelections = QtGui.QMenu(self.mainMenu) self.menuSelections.setObjectName(_fromUtf8("menuSelections")) self.menuPlugins = QtGui.QMenu(self.mainMenu) self.menuPlugins.setObjectName(_fromUtf8("menuPlugins")) self.menuFilter = QtGui.QMenu(self.mainMenu) self.menuFilter.setObjectName(_fromUtf8("menuFilter")) MainWindow.setMenuBar(self.mainMenu) self.consoleDock = QtGui.QDockWidget(MainWindow) self.consoleDock.setObjectName(_fromUtf8("consoleDock")) self.dockWidgetContents = QtGui.QWidget() self.dockWidgetContents.setObjectName(_fromUtf8("dockWidgetContents")) self.verticalLayout_19 = QtGui.QVBoxLayout(self.dockWidgetContents) self.verticalLayout_19.setObjectName(_fromUtf8("verticalLayout_19")) self.consoleDock.setWidget(self.dockWidgetContents) MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(8), self.consoleDock) self.variableExplorerDock = QtGui.QDockWidget(MainWindow) self.variableExplorerDock.setObjectName(_fromUtf8("variableExplorerDock")) self.dockWidgetContents_2 = QtGui.QWidget() self.dockWidgetContents_2.setObjectName(_fromUtf8("dockWidgetContents_2")) self.variableExplorerDock.setWidget(self.dockWidgetContents_2) MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(8), self.variableExplorerDock) self.historyDock = QtGui.QDockWidget(MainWindow) self.historyDock.setObjectName(_fromUtf8("historyDock")) self.dockWidgetContents_3 = QtGui.QWidget() self.dockWidgetContents_3.setObjectName(_fromUtf8("dockWidgetContents_3")) self.historyDock.setWidget(self.dockWidgetContents_3) MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(8), self.historyDock) self.pluginDock = QtGui.QDockWidget(MainWindow) self.pluginDock.setObjectName(_fromUtf8("pluginDock")) self.dockWidgetContents_6 = QtGui.QWidget() self.dockWidgetContents_6.setObjectName(_fromUtf8("dockWidgetContents_6")) self.gridLayout_11 = QtGui.QGridLayout(self.dockWidgetContents_6) self.gridLayout_11.setObjectName(_fromUtf8("gridLayout_11")) self.pluginsTreeView = QtGui.QTreeView(self.dockWidgetContents_6) self.pluginsTreeView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.pluginsTreeView.setUniformRowHeights(True) self.pluginsTreeView.setHeaderHidden(True) self.pluginsTreeView.setObjectName(_fromUtf8("pluginsTreeView")) self.pluginsTreeView.header().setVisible(False) self.pluginsTreeView.header().setDefaultSectionSize(0) self.gridLayout_11.addWidget(self.pluginsTreeView, 0, 0, 1, 2) self.pluginDock.setWidget(self.dockWidgetContents_6) MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(4), self.pluginDock) self.filesDock = QtGui.QDockWidget(MainWindow) self.filesDock.setObjectName(_fromUtf8("filesDock")) self.dockWidgetContents_8 = QtGui.QWidget() self.dockWidgetContents_8.setObjectName(_fromUtf8("dockWidgetContents_8")) self.gridLayout_6 = QtGui.QGridLayout(self.dockWidgetContents_8) self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) self.formLayout = QtGui.QFormLayout() self.formLayout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow) self.formLayout.setObjectName(_fromUtf8("formLayout")) self.label = QtGui.QLabel(self.dockWidgetContents_8) self.label.setObjectName(_fromUtf8("label")) self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label) self.neoIOComboBox = QtGui.QComboBox(self.dockWidgetContents_8) self.neoIOComboBox.setObjectName(_fromUtf8("neoIOComboBox")) self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.neoIOComboBox) self.gridLayout_6.addLayout(self.formLayout, 1, 0, 1, 1) self.fileTreeView = QtGui.QTreeView(self.dockWidgetContents_8) self.fileTreeView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.fileTreeView.setUniformRowHeights(True) self.fileTreeView.setHeaderHidden(True) self.fileTreeView.setObjectName(_fromUtf8("fileTreeView")) self.fileTreeView.header().setVisible(False) self.fileTreeView.header().setCascadingSectionResizes(False) self.fileTreeView.header().setStretchLastSection(False) self.gridLayout_6.addWidget(self.fileTreeView, 0, 0, 1, 1) self.loadFilesButton = QtGui.QPushButton(self.dockWidgetContents_8) self.loadFilesButton.setObjectName(_fromUtf8("loadFilesButton")) self.gridLayout_6.addWidget(self.loadFilesButton, 5, 0, 1, 1) self.configureIOButton = QtGui.QPushButton(self.dockWidgetContents_8) self.configureIOButton.setObjectName(_fromUtf8("configureIOButton")) self.gridLayout_6.addWidget(self.configureIOButton, 2, 0, 1, 1) self.filesDock.setWidget(self.dockWidgetContents_8) MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.filesDock) self.filterToolbar = QtGui.QToolBar(MainWindow) self.filterToolbar.setObjectName(_fromUtf8("filterToolbar")) MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.filterToolbar) self.pluginToolBar = QtGui.QToolBar(MainWindow) self.pluginToolBar.setObjectName(_fromUtf8("pluginToolBar")) MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.pluginToolBar) self.actionExit = QtGui.QAction(MainWindow) self.actionExit.setMenuRole(QtGui.QAction.QuitRole) self.actionExit.setIconVisibleInMenu(False) self.actionExit.setObjectName(_fromUtf8("actionExit")) self.actionSave_selection = QtGui.QAction(MainWindow) self.actionSave_selection.setObjectName(_fromUtf8("actionSave_selection")) self.actionLoad_selection = QtGui.QAction(MainWindow) self.actionLoad_selection.setObjectName(_fromUtf8("actionLoad_selection")) self.actionAbout = QtGui.QAction(MainWindow) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/Application/Info")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionAbout.setIcon(icon1) self.actionAbout.setObjectName(_fromUtf8("actionAbout")) self.actionSwitch_Modes = QtGui.QAction(MainWindow) self.actionSwitch_Modes.setVisible(False) self.actionSwitch_Modes.setObjectName(_fromUtf8("actionSwitch_Modes")) self.actionNewSelection = QtGui.QAction(MainWindow) self.actionNewSelection.setObjectName(_fromUtf8("actionNewSelection")) self.actionClearCache = QtGui.QAction(MainWindow) self.actionClearCache.setVisible(True) self.actionClearCache.setObjectName(_fromUtf8("actionClearCache")) self.actionSave_Selected_Data = QtGui.QAction(MainWindow) self.actionSave_Selected_Data.setObjectName(_fromUtf8("actionSave_Selected_Data")) self.actionSettings = QtGui.QAction(MainWindow) self.actionSettings.setObjectName(_fromUtf8("actionSettings")) self.actionClearSelections = QtGui.QAction(MainWindow) self.actionClearSelections.setObjectName(_fromUtf8("actionClearSelections")) self.actionNewPlugin = QtGui.QAction(MainWindow) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/Plugins/New")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionNewPlugin.setIcon(icon2) self.actionNewPlugin.setObjectName(_fromUtf8("actionNewPlugin")) self.actionEditPlugin = QtGui.QAction(MainWindow) self.actionEditPlugin.setEnabled(False) icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(_fromUtf8(":/Plugins/Edit")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionEditPlugin.setIcon(icon3) self.actionEditPlugin.setObjectName(_fromUtf8("actionEditPlugin")) self.actionRefreshPlugins = QtGui.QAction(MainWindow) icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/Plugins/Reload")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionRefreshPlugins.setIcon(icon4) self.actionRefreshPlugins.setObjectName(_fromUtf8("actionRefreshPlugins")) self.actionSavePlugin = QtGui.QAction(MainWindow) self.actionSavePlugin.setEnabled(False) icon5 = QtGui.QIcon() icon5.addPixmap(QtGui.QPixmap(_fromUtf8(":/Plugins/Save")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionSavePlugin.setIcon(icon5) self.actionSavePlugin.setObjectName(_fromUtf8("actionSavePlugin")) self.actionConfigurePlugin = QtGui.QAction(MainWindow) self.actionConfigurePlugin.setEnabled(False) icon6 = QtGui.QIcon() icon6.addPixmap(QtGui.QPixmap(_fromUtf8(":/Plugins/Config")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionConfigurePlugin.setIcon(icon6) self.actionConfigurePlugin.setObjectName(_fromUtf8("actionConfigurePlugin")) self.actionRunPlugin = QtGui.QAction(MainWindow) self.actionRunPlugin.setEnabled(False) icon7 = QtGui.QIcon() icon7.addPixmap(QtGui.QPixmap(_fromUtf8(":/Plugins/Run")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionRunPlugin.setIcon(icon7) self.actionRunPlugin.setObjectName(_fromUtf8("actionRunPlugin")) self.actionRemotePlugin = QtGui.QAction(MainWindow) self.actionRemotePlugin.setEnabled(False) icon8 = QtGui.QIcon() icon8.addPixmap(QtGui.QPixmap(_fromUtf8(":/Plugins/Remote")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionRemotePlugin.setIcon(icon8) self.actionRemotePlugin.setObjectName(_fromUtf8("actionRemotePlugin")) self.actionNewFilter = QtGui.QAction(MainWindow) icon9 = QtGui.QIcon() icon9.addPixmap(QtGui.QPixmap(_fromUtf8(":/Filter/New Filter")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionNewFilter.setIcon(icon9) self.actionNewFilter.setObjectName(_fromUtf8("actionNewFilter")) self.actionCopyFilter = QtGui.QAction(MainWindow) self.actionCopyFilter.setEnabled(False) icon10 = QtGui.QIcon() icon10.addPixmap(QtGui.QPixmap(_fromUtf8(":/Filter/Copy Filter")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionCopyFilter.setIcon(icon10) self.actionCopyFilter.setObjectName(_fromUtf8("actionCopyFilter")) self.actionEditFilter = QtGui.QAction(MainWindow) self.actionEditFilter.setEnabled(False) icon11 = QtGui.QIcon() icon11.addPixmap(QtGui.QPixmap(_fromUtf8(":/Filter/Edit Filter")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionEditFilter.setIcon(icon11) self.actionEditFilter.setObjectName(_fromUtf8("actionEditFilter")) self.actionDeleteFilter = QtGui.QAction(MainWindow) self.actionDeleteFilter.setEnabled(False) icon12 = QtGui.QIcon() icon12.addPixmap(QtGui.QPixmap(_fromUtf8(":/Filter/Remove Filter")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionDeleteFilter.setIcon(icon12) self.actionDeleteFilter.setObjectName(_fromUtf8("actionDeleteFilter")) self.actionNewFilterGroup = QtGui.QAction(MainWindow) icon13 = QtGui.QIcon() icon13.addPixmap(QtGui.QPixmap(_fromUtf8(":/Filter/New Filter Group")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionNewFilterGroup.setIcon(icon13) self.actionNewFilterGroup.setObjectName(_fromUtf8("actionNewFilterGroup")) self.actionSavePluginAs = QtGui.QAction(MainWindow) self.actionSavePluginAs.setEnabled(False) icon14 = QtGui.QIcon() icon14.addPixmap(QtGui.QPixmap(_fromUtf8(":/Plugins/Save As")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionSavePluginAs.setIcon(icon14) self.actionSavePluginAs.setObjectName(_fromUtf8("actionSavePluginAs")) self.actionDocumentation = QtGui.QAction(MainWindow) icon15 = QtGui.QIcon() icon15.addPixmap(QtGui.QPixmap(_fromUtf8(":/Application/Help")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionDocumentation.setIcon(icon15) self.actionDocumentation.setObjectName(_fromUtf8("actionDocumentation")) self.actionSave_Data = QtGui.QAction(MainWindow) self.actionSave_Data.setObjectName(_fromUtf8("actionSave_Data")) self.actionShowPluginFolder = QtGui.QAction(MainWindow) self.actionShowPluginFolder.setEnabled(False) icon16 = QtGui.QIcon() icon16.addPixmap(QtGui.QPixmap(_fromUtf8(":/Plugins/Show Folder")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionShowPluginFolder.setIcon(icon16) self.actionShowPluginFolder.setObjectName(_fromUtf8("actionShowPluginFolder")) self.actionEdit_Startup_Script = QtGui.QAction(MainWindow) self.actionEdit_Startup_Script.setObjectName(_fromUtf8("actionEdit_Startup_Script")) self.actionRestorePluginConfigurations = QtGui.QAction(MainWindow) icon17 = QtGui.QIcon() icon17.addPixmap(QtGui.QPixmap(_fromUtf8(":/Plugins/Restore Config")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionRestorePluginConfigurations.setIcon(icon17) self.actionRestorePluginConfigurations.setObjectName(_fromUtf8("actionRestorePluginConfigurations")) self.actionLoad_Python_File = QtGui.QAction(MainWindow) self.actionLoad_Python_File.setObjectName(_fromUtf8("actionLoad_Python_File")) self.actionFull_Load = QtGui.QAction(MainWindow) self.actionFull_Load.setCheckable(True) self.actionFull_Load.setChecked(True) self.actionFull_Load.setObjectName(_fromUtf8("actionFull_Load")) self.actionLazy_Load = QtGui.QAction(MainWindow) self.actionLazy_Load.setCheckable(True) self.actionLazy_Load.setObjectName(_fromUtf8("actionLazy_Load")) self.actionLoad_Data = QtGui.QAction(MainWindow) self.actionLoad_Data.setObjectName(_fromUtf8("actionLoad_Data")) self.actionSpyke_Repository = QtGui.QAction(MainWindow) icon18 = QtGui.QIcon() icon18.addPixmap(QtGui.QPixmap(_fromUtf8(":/Application/Repository")), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionSpyke_Repository.setIcon(icon18) self.actionSpyke_Repository.setObjectName(_fromUtf8("actionSpyke_Repository")) self.actionCached_Lazy_Load = QtGui.QAction(MainWindow) self.actionCached_Lazy_Load.setCheckable(True) self.actionCached_Lazy_Load.setObjectName(_fromUtf8("actionCached_Lazy_Load")) self.actionFull = QtGui.QAction(MainWindow) self.actionFull.setCheckable(True) self.actionFull.setChecked(True) self.actionFull.setObjectName(_fromUtf8("actionFull")) self.actionLazy = QtGui.QAction(MainWindow) self.actionLazy.setCheckable(True) self.actionLazy.setObjectName(_fromUtf8("actionLazy")) self.menuRead_Mode.addAction(self.actionFull_Load) self.menuRead_Mode.addAction(self.actionLazy_Load) self.menuRead_Mode.addAction(self.actionCached_Lazy_Load) self.menuCascade_Mode.addAction(self.actionFull) self.menuCascade_Mode.addAction(self.actionLazy) self.menuFile.addAction(self.actionLoad_Data) self.menuFile.addAction(self.menuRead_Mode.menuAction()) self.menuFile.addAction(self.menuCascade_Mode.menuAction()) self.menuFile.addAction(self.actionClearCache) self.menuFile.addAction(self.actionSave_Data) self.menuFile.addAction(self.actionSave_Selected_Data) self.menuFile.addAction(self.actionSwitch_Modes) self.menuFile.addSeparator() self.menuFile.addAction(self.actionSave_selection) self.menuFile.addAction(self.actionLoad_selection) self.menuFile.addSeparator() self.menuFile.addAction(self.actionLoad_Python_File) self.menuFile.addAction(self.actionEdit_Startup_Script) self.menuFile.addAction(self.actionSettings) self.menuFile.addAction(self.actionExit) self.menuHelp.addAction(self.actionDocumentation) self.menuHelp.addAction(self.actionSpyke_Repository) self.menuHelp.addAction(self.actionAbout) self.menuSelections.addAction(self.actionNewSelection) self.menuSelections.addAction(self.actionClearSelections) self.menuSelections.addSeparator() self.menuPlugins.addAction(self.actionRunPlugin) self.menuPlugins.addAction(self.actionRemotePlugin) self.menuPlugins.addAction(self.actionConfigurePlugin) self.menuPlugins.addSeparator() self.menuPlugins.addAction(self.actionRefreshPlugins) self.menuPlugins.addAction(self.actionRestorePluginConfigurations) self.menuPlugins.addSeparator() self.menuPlugins.addAction(self.actionNewPlugin) self.menuPlugins.addAction(self.actionEditPlugin) self.menuPlugins.addAction(self.actionSavePlugin) self.menuPlugins.addAction(self.actionSavePluginAs) self.menuPlugins.addAction(self.actionShowPluginFolder) self.menuFilter.addAction(self.actionNewFilter) self.menuFilter.addAction(self.actionNewFilterGroup) self.menuFilter.addAction(self.actionCopyFilter) self.menuFilter.addAction(self.actionEditFilter) self.menuFilter.addAction(self.actionDeleteFilter) self.mainMenu.addAction(self.menuFile.menuAction()) self.mainMenu.addAction(self.menuSelections.menuAction()) self.mainMenu.addAction(self.menuFilter.menuAction()) self.mainMenu.addAction(self.menuPlugins.menuAction()) self.mainMenu.addAction(self.menuHelp.menuAction()) self.filterToolbar.addAction(self.actionNewFilter) self.filterToolbar.addAction(self.actionNewFilterGroup) self.filterToolbar.addAction(self.actionCopyFilter) self.filterToolbar.addAction(self.actionEditFilter) self.filterToolbar.addAction(self.actionDeleteFilter) self.pluginToolBar.addAction(self.actionNewPlugin) self.pluginToolBar.addAction(self.actionEditPlugin) self.pluginToolBar.addAction(self.actionSavePlugin) self.pluginToolBar.addAction(self.actionSavePluginAs) self.pluginToolBar.addAction(self.actionRefreshPlugins) self.pluginToolBar.addAction(self.actionConfigurePlugin) self.pluginToolBar.addAction(self.actionRunPlugin) self.pluginToolBar.addAction(self.actionRemotePlugin) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Spyke Viewer", None, QtGui.QApplication.UnicodeUTF8)) self.menuFile.setTitle(QtGui.QApplication.translate("MainWindow", "&File", None, QtGui.QApplication.UnicodeUTF8)) self.menuRead_Mode.setTitle(QtGui.QApplication.translate("MainWindow", "Data Read Mode", None, QtGui.QApplication.UnicodeUTF8)) self.menuCascade_Mode.setTitle(QtGui.QApplication.translate("MainWindow", "Cascade Mode", None, QtGui.QApplication.UnicodeUTF8)) self.menuHelp.setTitle(QtGui.QApplication.translate("MainWindow", "&Help", None, QtGui.QApplication.UnicodeUTF8)) self.menuSelections.setTitle(QtGui.QApplication.translate("MainWindow", "&Selections", None, QtGui.QApplication.UnicodeUTF8)) self.menuPlugins.setTitle(QtGui.QApplication.translate("MainWindow", "&Plugins", None, QtGui.QApplication.UnicodeUTF8)) self.menuFilter.setTitle(QtGui.QApplication.translate("MainWindow", "&Filter", None, QtGui.QApplication.UnicodeUTF8)) self.consoleDock.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Console", None, QtGui.QApplication.UnicodeUTF8)) self.variableExplorerDock.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Variable Explorer", None, QtGui.QApplication.UnicodeUTF8)) self.historyDock.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Command History", None, QtGui.QApplication.UnicodeUTF8)) self.pluginDock.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Plugins", None, QtGui.QApplication.UnicodeUTF8)) self.filesDock.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Files", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("MainWindow", "Format:", None, QtGui.QApplication.UnicodeUTF8)) self.loadFilesButton.setText(QtGui.QApplication.translate("MainWindow", "Load", None, QtGui.QApplication.UnicodeUTF8)) self.configureIOButton.setText(QtGui.QApplication.translate("MainWindow", "Configure Selected IO", None, QtGui.QApplication.UnicodeUTF8)) self.filterToolbar.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Filter Toolbar", None, QtGui.QApplication.UnicodeUTF8)) self.pluginToolBar.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Plugin Toolbar", None, QtGui.QApplication.UnicodeUTF8)) self.actionExit.setText(QtGui.QApplication.translate("MainWindow", "&Exit", None, QtGui.QApplication.UnicodeUTF8)) self.actionSave_selection.setText(QtGui.QApplication.translate("MainWindow", "&Save Selection Set...", None, QtGui.QApplication.UnicodeUTF8)) self.actionLoad_selection.setText(QtGui.QApplication.translate("MainWindow", "&Load Selection Set...", None, QtGui.QApplication.UnicodeUTF8)) self.actionAbout.setText(QtGui.QApplication.translate("MainWindow", "&About", None, QtGui.QApplication.UnicodeUTF8)) self.actionSwitch_Modes.setText(QtGui.QApplication.translate("MainWindow", "Switch Modes", None, QtGui.QApplication.UnicodeUTF8)) self.actionNewSelection.setText(QtGui.QApplication.translate("MainWindow", "&New", None, QtGui.QApplication.UnicodeUTF8)) self.actionClearCache.setText(QtGui.QApplication.translate("MainWindow", "&Clear Data", None, QtGui.QApplication.UnicodeUTF8)) self.actionSave_Selected_Data.setText(QtGui.QApplication.translate("MainWindow", "Save Selected Data &as...", None, QtGui.QApplication.UnicodeUTF8)) self.actionSettings.setText(QtGui.QApplication.translate("MainWindow", "Settings...", None, QtGui.QApplication.UnicodeUTF8)) self.actionClearSelections.setText(QtGui.QApplication.translate("MainWindow", "&Clear", None, QtGui.QApplication.UnicodeUTF8)) self.actionNewPlugin.setText(QtGui.QApplication.translate("MainWindow", "&New Plugin", None, QtGui.QApplication.UnicodeUTF8)) self.actionNewPlugin.setToolTip(QtGui.QApplication.translate("MainWindow", "Create a new plugin", None, QtGui.QApplication.UnicodeUTF8)) self.actionEditPlugin.setText(QtGui.QApplication.translate("MainWindow", "&Edit Plugin", None, QtGui.QApplication.UnicodeUTF8)) self.actionEditPlugin.setToolTip(QtGui.QApplication.translate("MainWindow", "Edit selected plugin", None, QtGui.QApplication.UnicodeUTF8)) self.actionEditPlugin.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+E", None, QtGui.QApplication.UnicodeUTF8)) self.actionRefreshPlugins.setText(QtGui.QApplication.translate("MainWindow", "&Refresh Plugins", None, QtGui.QApplication.UnicodeUTF8)) self.actionRefreshPlugins.setToolTip(QtGui.QApplication.translate("MainWindow", "Refresh all plugins", None, QtGui.QApplication.UnicodeUTF8)) self.actionRefreshPlugins.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+R", None, QtGui.QApplication.UnicodeUTF8)) self.actionSavePlugin.setText(QtGui.QApplication.translate("MainWindow", "&Save Plugin", None, QtGui.QApplication.UnicodeUTF8)) self.actionSavePlugin.setToolTip(QtGui.QApplication.translate("MainWindow", "Save current file", None, QtGui.QApplication.UnicodeUTF8)) self.actionSavePlugin.setShortcut(QtGui.QApplication.translate("MainWindow", "Ctrl+S", None, QtGui.QApplication.UnicodeUTF8)) self.actionConfigurePlugin.setText(QtGui.QApplication.translate("MainWindow", "&Configure Plugin", None, QtGui.QApplication.UnicodeUTF8)) self.actionConfigurePlugin.setToolTip(QtGui.QApplication.translate("MainWindow", "Configure selected plugin", None, QtGui.QApplication.UnicodeUTF8)) self.actionConfigurePlugin.setShortcut(QtGui.QApplication.translate("MainWindow", "F6", None, QtGui.QApplication.UnicodeUTF8)) self.actionRunPlugin.setText(QtGui.QApplication.translate("MainWindow", "Run &Plugin", None, QtGui.QApplication.UnicodeUTF8)) self.actionRunPlugin.setToolTip(QtGui.QApplication.translate("MainWindow", "Run selected plugin", None, QtGui.QApplication.UnicodeUTF8)) self.actionRunPlugin.setShortcut(QtGui.QApplication.translate("MainWindow", "F5", None, QtGui.QApplication.UnicodeUTF8)) self.actionRemotePlugin.setText(QtGui.QApplication.translate("MainWindow", "Start with Remote Script", None, QtGui.QApplication.UnicodeUTF8)) self.actionRemotePlugin.setToolTip(QtGui.QApplication.translate("MainWindow", "Start selected plugin with Remote Script", None, QtGui.QApplication.UnicodeUTF8)) self.actionRemotePlugin.setShortcut(QtGui.QApplication.translate("MainWindow", "F9", None, QtGui.QApplication.UnicodeUTF8)) self.actionNewFilter.setText(QtGui.QApplication.translate("MainWindow", "&New Filter", None, QtGui.QApplication.UnicodeUTF8)) self.actionNewFilter.setToolTip(QtGui.QApplication.translate("MainWindow", "Create a new filter", None, QtGui.QApplication.UnicodeUTF8)) self.actionCopyFilter.setText(QtGui.QApplication.translate("MainWindow", "&Copy", None, QtGui.QApplication.UnicodeUTF8)) self.actionCopyFilter.setToolTip(QtGui.QApplication.translate("MainWindow", "Duplicate selected filter or group", None, QtGui.QApplication.UnicodeUTF8)) self.actionEditFilter.setText(QtGui.QApplication.translate("MainWindow", "&Edit", None, QtGui.QApplication.UnicodeUTF8)) self.actionEditFilter.setToolTip(QtGui.QApplication.translate("MainWindow", "Edit selected filter or filter group", None, QtGui.QApplication.UnicodeUTF8)) self.actionDeleteFilter.setText(QtGui.QApplication.translate("MainWindow", "&Delete", None, QtGui.QApplication.UnicodeUTF8)) self.actionDeleteFilter.setToolTip(QtGui.QApplication.translate("MainWindow", "Delete selected filter or filter group", None, QtGui.QApplication.UnicodeUTF8)) self.actionNewFilterGroup.setText(QtGui.QApplication.translate("MainWindow", "New Filter &Group", None, QtGui.QApplication.UnicodeUTF8)) self.actionNewFilterGroup.setToolTip(QtGui.QApplication.translate("MainWindow", "Create a new filter group", None, QtGui.QApplication.UnicodeUTF8)) self.actionSavePluginAs.setText(QtGui.QApplication.translate("MainWindow", "Save Plugin &as...", None, QtGui.QApplication.UnicodeUTF8)) self.actionSavePluginAs.setToolTip(QtGui.QApplication.translate("MainWindow", "Save current file as...", None, QtGui.QApplication.UnicodeUTF8)) self.actionDocumentation.setText(QtGui.QApplication.translate("MainWindow", "&Documentation", None, QtGui.QApplication.UnicodeUTF8)) self.actionDocumentation.setToolTip(QtGui.QApplication.translate("MainWindow", "Open documentation website\n" "(requires Internet access)", None, QtGui.QApplication.UnicodeUTF8)) self.actionSave_Data.setText(QtGui.QApplication.translate("MainWindow", "Save All &Data as...", None, QtGui.QApplication.UnicodeUTF8)) self.actionShowPluginFolder.setText(QtGui.QApplication.translate("MainWindow", "&Open containing folder...", None, QtGui.QApplication.UnicodeUTF8)) self.actionShowPluginFolder.setToolTip(QtGui.QApplication.translate("MainWindow", "Open folder that contains selected plugin", None, QtGui.QApplication.UnicodeUTF8)) self.actionEdit_Startup_Script.setText(QtGui.QApplication.translate("MainWindow", "Edit Startup Script", None, QtGui.QApplication.UnicodeUTF8)) self.actionRestorePluginConfigurations.setText(QtGui.QApplication.translate("MainWindow", "Restore Plugin configurations", None, QtGui.QApplication.UnicodeUTF8)) self.actionRestorePluginConfigurations.setToolTip(QtGui.QApplication.translate("MainWindow", "Restore Plugin configurations to their default values", None, QtGui.QApplication.UnicodeUTF8)) self.actionLoad_Python_File.setText(QtGui.QApplication.translate("MainWindow", "Load &Python File...", None, QtGui.QApplication.UnicodeUTF8)) self.actionFull_Load.setText(QtGui.QApplication.translate("MainWindow", "Full Load", None, QtGui.QApplication.UnicodeUTF8)) self.actionLazy_Load.setText(QtGui.QApplication.translate("MainWindow", "Lazy Load", None, QtGui.QApplication.UnicodeUTF8)) self.actionLoad_Data.setText(QtGui.QApplication.translate("MainWindow", "Load Data...", None, QtGui.QApplication.UnicodeUTF8)) self.actionSpyke_Repository.setText(QtGui.QApplication.translate("MainWindow", "Spyke Repository", None, QtGui.QApplication.UnicodeUTF8)) self.actionCached_Lazy_Load.setText(QtGui.QApplication.translate("MainWindow", "Cached Lazy Load", None, QtGui.QApplication.UnicodeUTF8)) self.actionFull.setText(QtGui.QApplication.translate("MainWindow", "Regular", None, QtGui.QApplication.UnicodeUTF8)) self.actionLazy.setText(QtGui.QApplication.translate("MainWindow", "Lazy", None, QtGui.QApplication.UnicodeUTF8)) import icons_rc spykeviewer-0.4.1/spykeviewer/ui/main_window.py0000644000175000017500000016156712262550403020115 0ustar robrobimport os import sys import json import re import traceback import logging import webbrowser import copy import pickle import platform import subprocess import time from PyQt4.QtGui import (QMainWindow, QMessageBox, QApplication, QFileDialog, QInputDialog, QLineEdit, QMenu, QDrag, QPainter, QPen, QPalette, QDesktopServices, QFont, QPixmap, QFileSystemModel, QHeaderView, QActionGroup, QDockWidget) from PyQt4.QtCore import (Qt, pyqtSignature, SIGNAL, QMimeData, QTimer, QSettings, QCoreApplication, QUrl) from spyderlib.widgets.internalshell import InternalShell from spyderlib.widgets.externalshell.namespacebrowser import NamespaceBrowser from spyderlib.widgets.sourcecode.codeeditor import CodeEditor from spyderlib.utils.misc import get_error_match import spykeutils from spykeutils.plugin.data_provider import DataProvider from spykeutils.plugin.analysis_plugin import AnalysisPlugin from spykeutils.progress_indicator import CancelException from spykeutils import SpykeException from spykeutils.plot.helper import ProgressIndicatorDialog from .. import api from main_ui import Ui_MainWindow from settings import SettingsWindow from filter_dock import FilterDock from filter_dialog import FilterDialog from filter_group_dialog import FilterGroupDialog from plugin_editor_dock import PluginEditorDock import ipython_connection as ipy from plugin_model import PluginModel from remote_thread import RemoteThread logger = logging.getLogger('spykeviewer') # Monkeypatch variable editor from spyderlib.widgets.dicteditor import DictDelegate _orig_createEditor = DictDelegate.createEditor def _patched_createEditor(*args, **kwargs): try: return _orig_createEditor(*args, **kwargs) except Exception: QMessageBox.critical(None, 'Edit item', 'Could not create editor for selected data!') DictDelegate.createEditor = _patched_createEditor #noinspection PyCallByClass,PyTypeChecker,PyArgumentList class MainWindow(QMainWindow, Ui_MainWindow): """ The main window of Spyke Viewer. """ def __init__(self, parent=None, splash=None): QMainWindow.__init__(self, parent) api.window = self self.splash = splash self.update_splash_screen('Creating user interface....') QCoreApplication.setOrganizationName('SpykeUtils') QCoreApplication.setApplicationName('Spyke Viewer') self.data_path = QDesktopServices.storageLocation( QDesktopServices.DataLocation) self.startup_script = os.path.join(self.data_path, 'startup.py') self.setupUi(self) self.dir = os.getcwd() # Threads providing output from remotely started plugins self.process_threads = {} self.remote_process_counter = 0 QTimer.singleShot(1000, self.clean_finished_process_threads) # Lazy load mode menu self.load_actions = QActionGroup(self) self.load_actions.setExclusive(True) self.actionFull_Load.setActionGroup(self.load_actions) self.actionLazy_Load.setActionGroup(self.load_actions) self.actionCached_Lazy_Load.setActionGroup(self.load_actions) # Cascading mode menu self.cascade_actions = QActionGroup(self) self.cascade_actions.setExclusive(True) self.actionFull.setActionGroup(self.cascade_actions) self.actionLazy.setActionGroup(self.cascade_actions) # Python console self.console = None self.progress = ProgressIndicatorDialog(self) self.provider_factory = DataProvider self.selections = [] self.provider = None self.plugin_paths = [] self.init_python() # IPython menu option self.ipy_kernel = None if ipy.ipython_available: self.ipyDock = QDockWidget() self.ipyDock.setObjectName('ipythonDock') self.ipyDock.setWindowTitle('IPython') self.addDockWidget(Qt.BottomDockWidgetArea, self.ipyDock) self.ipyDock.setVisible(False) self.ipyDock.visibilityChanged.connect(self.on_ipyDock_visibilityChanged) # Drag and Drop for selections menu self.menuSelections.setAcceptDrops(True) self.menuSelections.paintEvent =\ self.on_menuSelections_paint self.menuSelections.mousePressEvent =\ self.on_menuSelections_mousePressed self.menuSelections.mouseMoveEvent =\ self.on_menuSelections_mouseMoved self.menuSelections.dragEnterEvent =\ self.on_menuSelections_dragEnter self.menuSelections.dragMoveEvent =\ self.on_menuSelections_dragMoved self.menuSelections.dropEvent =\ self.on_menuSelections_drop self.seldrag_start_pos = None self.seldrag_selection = None self.seldrag_target = None self.seldrag_target_upper = False # Filters settings = QSettings() if not settings.contains('filterPath'): data_path = QDesktopServices.storageLocation( QDesktopServices.DataLocation) self.filter_path = os.path.join(data_path, 'filters') else: self.filter_path = settings.value('filterPath') filter_types = self.get_filter_types() self.filterDock = FilterDock(self.filter_path, filter_types, menu=self.menuFilter, parent=self) self.filterDock.setObjectName('filterDock') self.filterDock.current_filter_changed.connect( self.on_current_filter_changed) self.filterDock.filters_changed.connect( self.on_filters_changed) self.addDockWidget(Qt.RightDockWidgetArea, self.filterDock) self.show_filter_exceptions = True # Plugins self.menuPluginsContext = QMenu(self) self.menuPluginsContext.addAction(self.actionRunPlugin) self.menuPluginsContext.addAction(self.actionRemotePlugin) self.menuPluginsContext.addAction(self.actionConfigurePlugin) self.menuPluginsContext.addAction(self.actionEditPlugin) self.menuPluginsContext.addAction(self.actionShowPluginFolder) # Plugin Editor self.pluginEditorDock = PluginEditorDock() self.pluginEditorDock.setObjectName('editorDock') self.addDockWidget(Qt.RightDockWidgetArea, self.pluginEditorDock) self.pluginEditorDock.setVisible(False) self.pluginEditorDock.plugin_saved.connect(self.plugin_saved) self.pluginEditorDock.file_available.connect(self.on_file_available) self.consoleDock.edit_script = lambda (path): \ self.pluginEditorDock.add_file(path) def p(x): match = get_error_match(unicode(x)) if match: fname, lnb = match.groups() self.pluginEditorDock.show_position(fname, int(lnb)) self.connect(self.console, SIGNAL("go_to_error(QString)"), p) # File navigation self.file_system_model = QFileSystemModel() self.file_system_model.setRootPath('') self.fileTreeView.setModel(self.file_system_model) self.fileTreeView.setCurrentIndex( self.file_system_model.index(self.dir)) self.fileTreeView.expand(self.file_system_model.index(self.dir)) self.fileTreeView.setColumnHidden(1, True) self.fileTreeView.setColumnHidden(2, True) self.fileTreeView.setColumnHidden(3, True) self.fileTreeView.header().setResizeMode(QHeaderView.ResizeToContents) # Docks self.setCentralWidget(None) # Finish initialization if we are not a subclass if type(self) is MainWindow: self.finish_initialization() ##### Startup ######################################################## def update_splash_screen(self, message): if not self.splash: return self.splash.showMessage(message, Qt.AlignCenter | Qt.AlignBottom) self.splash.show() QCoreApplication.processEvents() def finish_initialization(self): """ This should to be called at the end of the initialization phase of the program (e.g. at the end of the ``__init__()`` method of a domain-specific subclass). """ self.update_view_menu() self.update_splash_screen('Restoring saved state...') self.restore_state() self.update_splash_screen('Running startup script...') self.run_startup_script() self.set_config_options() if api.config.load_mode == 1: self.actionLazy_Load.trigger() elif api.config.load_mode == 2: self.actionCached_Lazy_Load.trigger() else: self.actionFull_Load.trigger() if api.config.lazy_cascading: self.actionLazy.trigger() else: self.actionFull.trigger() self.update_splash_screen('Loading plugins...') self.reload_plugins() self.load_plugin_configs() if api.config.load_selection_on_start: self.update_splash_screen('Loading previous selection...') self.load_current_selection() def get_filter_types(self): """ Return a list of filter type tuples as required by :class:`filter_dock.FilterDock. Override in domain-specific subclass. """ return [] def update_view_menu(self): """ Recreate the "View" menu. """ if hasattr(self, 'menuView'): a = self.menuView.menuAction() self.mainMenu.removeAction(a) self.menuView.clear() self.menuView = self.createPopupMenu() self.menuView.setTitle('&View') self.mainMenu.insertMenu(self.menuHelp.menuAction(), self.menuView) def set_default_plugin_path(self): """ Set the default plugin path (contains the standard plugins after installation). """ if hasattr(sys, 'frozen'): module_path = os.path.dirname(sys.executable) else: file_path = os.path.abspath(os.path.dirname(__file__)) module_path = os.path.dirname(file_path) plugin_path = os.path.join(module_path, 'plugins') if os.path.isdir(plugin_path): self.plugin_paths.append(plugin_path) else: logger.warning('Plugin path "%s" does not exist, no plugin ' 'path set!' % plugin_path) def restore_state(self): """ Restore previous state of the GUI and settings from saved configuration. """ settings = QSettings() if not settings.contains('windowGeometry') or \ not settings.contains('windowState'): self.set_initial_layout() else: self.restoreGeometry(settings.value('windowGeometry')) self.restoreState(settings.value('windowState')) if not settings.contains('pluginPaths'): self.set_default_plugin_path() else: paths = settings.value('pluginPaths') self.plugin_paths = [] if paths is not None: for p in paths: if not os.path.isdir(p): logger.warning('Plugin path "%s" does not exist, ' 'removing from configuration...' % p) else: self.plugin_paths.append(p) if not self.plugin_paths: logger.warning('No plugin paths set! Setting default path...') self.set_default_plugin_path() if not settings.contains('selectionPath'): self.selection_path = os.path.join(self.data_path, 'selections') else: self.selection_path = settings.value('selectionPath') if not settings.contains('dataPath'): AnalysisPlugin.data_dir = os.path.join(self.data_path, 'data') else: AnalysisPlugin.data_dir = settings.value('dataPath') if not settings.contains('remoteScript') or not os.path.isfile( settings.value('remoteScript')): if settings.contains('remoteScript'): logger.warning('Remote script not found! Reverting to ' 'default location...') if hasattr(sys, 'frozen'): path = os.path.dirname(sys.executable) else: path = os.path.dirname(spykeutils.__file__) path = os.path.join(os.path.abspath(path), 'plugin') self.remote_script = os.path.join(path, 'startplugin.py') else: self.remote_script = settings.value('remoteScript') if self.plugin_paths: self.pluginEditorDock.set_default_path(self.plugin_paths[-1]) def set_initial_layout(self): """ Set an initial layout for the docks (when no previous configuration could be loaded). """ self.filesDock.setMinimumSize(100, 100) self.resize(800, 750) self.removeDockWidget(self.filesDock) self.removeDockWidget(self.filterDock) self.removeDockWidget(self.pluginDock) self.addDockWidget(Qt.RightDockWidgetArea, self.filesDock) self.addDockWidget(Qt.RightDockWidgetArea, self.filterDock) self.addDockWidget(Qt.RightDockWidgetArea, self.pluginDock) self.tabifyDockWidget(self.filterDock, self.pluginDock) self.filesDock.setVisible(True) self.filterDock.setVisible(True) self.pluginDock.setVisible(True) self.consoleDock.setVisible(False) self.variableExplorerDock.setVisible(False) self.historyDock.setVisible(False) self.tabifyDockWidget(self.consoleDock, self.variableExplorerDock) self.tabifyDockWidget(self.variableExplorerDock, self.historyDock) def run_startup_script(self): """ Run the startup script that can be used for configuration. """ if not os.path.isfile(self.startup_script): content = ('# Startup script for Spyke Viewer\n' 'import spykeviewer.api as spyke') try: path = os.path.dirname(self.startup_script) if not os.path.isdir(path): os.makedirs(path) with open(self.startup_script, 'w') as f: f.write(content) except: logger.warning('Could not create startup script ' + self.startup_script + ':\n' + traceback.format_exc() + '\n') return try: with open(self.startup_script, 'r') as f: # We turn all encodings to UTF-8, so remove encoding # comments manually lines = f.readlines() if lines: if re.findall('coding[:=]\s*([-\w.]+)', lines[0]): lines.pop(0) elif re.findall('coding[:=]\s*([-\w.]+)', lines[1]): lines.pop(1) source = ''.join(lines).decode('utf-8') code = compile(source, self.startup_script, 'exec') exec(code, {}) except Exception: logger.warning('Error during execution of startup script ' + self.startup_script + ':\n' + traceback.format_exc() + '\n') def set_config_options(self): self.console.set_codecompletion_enter( api.config.codecomplete_console_enter) self.pluginEditorDock.enter_completion = \ api.config.codecomplete_editor_enter ##### Interactive Python ############################################# def get_console_objects(self): """ Return a dictionary of objects that should be included in the console on startup. These objects will also not be displayed in variable explorer. Override this function in domain-specific subclasses, e.g. for imports. """ import numpy import scipy import matplotlib.pyplot as plt import guiqwt.pyplot as guiplt plt.ion() guiplt.ion() return {'np': numpy, 'sp': scipy, 'plt': plt, 'guiplt': guiplt, 'spyke': api} def init_python(self): """ Initialize the Python docks: console, history and variable explorer. """ class StreamDuplicator(): def __init__(self, out_list): self.outs = out_list def write(self, s): for o in self.outs: o.write(s) def flush(self): for o in self.outs: if hasattr(o, 'flush'): o.flush() def set_parent(self, _): # Called when connecting IPython 0.13 pass # Fixing bugs in the internal shell class FixedInternalShell(InternalShell): def __init__(self, *args, **kwargs): super(FixedInternalShell, self).__init__(*args, **kwargs) # Do not try to show a completion list when completions is None def show_completion_list(self, completions, completion_text="", automatic=True): if completions is None: return super(FixedInternalShell, self).show_completion_list( completions, completion_text, automatic) # Do not get dir() for non-text objects def get_dir(self, objtxt): if not isinstance(objtxt, (str, unicode)): return return super(FixedInternalShell, self).get_dir(objtxt) # Fix exception when using non-ascii characters def run_command(self, cmd, history=True, new_prompt=True): """Run command in interpreter""" if not cmd: cmd = '' else: if history: self.add_to_history(cmd) cmd_line = cmd + '\n' self.interpreter.stdin_write.write(cmd_line.encode('utf-8')) if not self.multithreaded: self.interpreter.run_line() self.emit(SIGNAL("refresh()")) # Console msg = ('current and selections can be used to access selected data' '\n\nModules imported at startup: ') ns = self.get_console_objects() excludes = ['execfile', 'guiplt', 'help', 'raw_input', 'runfile'] first_item = True for n, o in ns.iteritems(): if type(o) == type(sys): if not first_item: msg += ', ' first_item = False msg += o.__name__ if n != o.__name__: msg += ' as ' + n excludes.append(n) ns['current'] = self.provider ns['selections'] = self.selections font = QFont("Monospace") font.setStyleHint(font.TypeWriter, font.PreferDefault) if not platform.system() == 'Darwin': font.setPointSize(9) self.console = FixedInternalShell( self.consoleDock, namespace=ns, multithreaded=False, message=msg, max_line_count=10000, font=font) #self.console.clear_terminal() self.console.set_codecompletion_auto(True) self.console.set_calltips(True) self.console.setup_calltips(size=600, font=font) self.console.setup_completion(size=(370, 240), font=font) self.consoleDock.setWidget(self.console) # Variable browser self.browser = NamespaceBrowser(self.variableExplorerDock) self.browser.set_shellwidget(self.console) self.browser.setup( check_all=True, exclude_private=True, exclude_uppercase=False, exclude_capitalized=False, exclude_unsupported=False, truncate=False, minmax=False, collvalue=False, remote_editing=False, inplace=False, autorefresh=False, excluded_names=excludes) self.variableExplorerDock.setWidget(self.browser) # History self.history = CodeEditor(self.historyDock) self.history.setup_editor(linenumbers=False, language='py', scrollflagarea=False) self.history.setReadOnly(True) self.history.set_text('\n'.join(self.console.history)) self.history.set_cursor_position('eof') self.historyDock.setWidget(self.history) self.console.connect(self.console, SIGNAL("refresh()"), self._append_python_history) # Duplicate stdout and stderr for console # Not using previous stdout, only stderr. Using StreamDuplicator # because spyder stream does not have flush() method... ch = logging.StreamHandler() ch.setLevel(logging.WARNING) logger.addHandler(ch) sys.stdout = StreamDuplicator([sys.stdout]) sys.stderr = StreamDuplicator([sys.stderr, sys.__stderr__]) def _append_python_history(self): self.browser.refresh_table() self.history.append('\n' + self.console.history[-1]) self.history.set_cursor_position('eof') def on_ipyDock_visibilityChanged(self, visible): if visible and not self.ipyDock.widget(): self.create_ipython_kernel() widget = self.ipy_kernel.get_widget() self.ipyDock.setWidget(widget) def create_ipython_kernel(self): """ Create a new IPython kernel. Does nothing if a kernel already exists. """ if not ipy.ipython_available or self.ipy_kernel: return self.ipy_kernel = ipy.IPythonConnection() self.ipy_kernel.push({'current': self.provider, 'selections': self.selections}) def on_variableExplorerDock_visibilityChanged(self, visible): if visible: self.browser.refresh_table() def on_historyDock_visibilityChanged(self, visible): if visible: self.history.set_cursor_position('eof') ##### Selections ##################################################### def on_menuSelections_mousePressed(self, event): if event.button() == Qt.LeftButton: action = self.menuSelections.actionAt(event.pos()) if action: selection = action.data() if selection: self.seldrag_start_pos = event.pos() self.seldrag_selection = selection else: self.seldrag_start_pos = None self.seldrag_selection = None self.seldrag_target = None QMenu.mousePressEvent(self.menuSelections, event) def on_menuSelections_mouseMoved(self, event): if event.buttons() & Qt.LeftButton and self.seldrag_start_pos: if ((event.pos() - self.seldrag_start_pos).manhattanLength() >= QApplication.startDragDistance()): drag = QDrag(self.menuSelections) data = QMimeData() data.setText(self.seldrag_selection.name) drag.setMimeData(data) drag.exec_() self.seldrag_start_pos = None self.seldrag_selection = None self.seldrag_target = None QMenu.mouseMoveEvent(self.menuSelections, event) def on_menuSelections_paint(self, event): QMenu.paintEvent(self.menuSelections, event) if self.seldrag_target: # Paint line where selection will be dropped p = QPainter() color = QPalette().color(self.menuSelections.foregroundRole()) pen = QPen(color, 2, Qt.SolidLine) p.begin(self.menuSelections) p.setPen(pen) rect = self.menuSelections.actionGeometry(self.seldrag_target) if self.seldrag_target_upper: p.drawLine(rect.topLeft(), rect.topRight()) else: p.drawLine(rect.bottomLeft(), rect.bottomRight()) p.end() def _menuSelections_pos_is_drop_target(self, pos): """ Return if selection can be dropped at this position and prepare information needed for drawing and dropping """ action = self.menuSelections.actionAt(pos) if not action or not action.data(): self.seldrag_target = None return False self.seldrag_target = action rect = self.menuSelections.actionGeometry(action) if pos.y() < rect.top() + rect.height() / 2: self.seldrag_target_upper = True else: self.seldrag_target_upper = False return True def on_menuSelections_dragEnter(self, event): event.setDropAction(Qt.MoveAction) if self._menuSelections_pos_is_drop_target(event.pos()): event.accept() else: event.ignore() QMenu.dragEnterEvent(self.menuSelections, event) def on_menuSelections_dragMoved(self, event): event.setDropAction(Qt.MoveAction) if self._menuSelections_pos_is_drop_target(event.pos()): event.accept() self.menuSelections.update() else: event.ignore() QMenu.dragMoveEvent(self.menuSelections, event) def on_menuSelections_drop(self, event): source = self.seldrag_selection target = self.seldrag_target.data() if source != target: self.selections.remove(source) target_index = self.selections.index(target) if not self.seldrag_target_upper: target_index += 1 self.selections.insert(target_index, source) self.populate_selection_menu() QMenu.dropEvent(self.menuSelections, event) def populate_selection_menu(self): self.menuSelections.clear() a = self.menuSelections.addAction('New') a.triggered.connect(self.on_selection_new) a = self.menuSelections.addAction('Clear') a.triggered.connect(self.on_selection_clear) self.menuSelections.addSeparator() for i, s in enumerate(self.selections): m = self.menuSelections.addMenu(s.name) m.menuAction().setData(s) a = m.addAction('Load') self.connect(a, SIGNAL('triggered()'), lambda sel=s: self.on_selection_load(sel)) a = m.addAction('Save') self.connect(a, SIGNAL('triggered()'), lambda sel=s: self.on_selection_save(sel)) a = m.addAction('Rename') self.connect(a, SIGNAL('triggered()'), lambda sel=s: self.on_selection_rename(sel)) a = m.addAction('Remove') self.connect(a, SIGNAL('triggered()'), lambda sel=s: self.on_selection_remove(sel)) def on_selection_load(self, selection): self.set_current_selection(selection.data_dict()) def on_selection_save(self, selection): i = self.selections.index(selection) self.selections[i] = self.provider_factory( self.selections[i].name, self) self.populate_selection_menu() def on_selection_clear(self): if QMessageBox.question( self, 'Please confirm', 'Do you really want to remove all selections?', QMessageBox.Yes | QMessageBox.No) == QMessageBox.No: return del self.selections[:] self.populate_selection_menu() def on_selection_rename(self, selection): (name, ok) = QInputDialog.getText( self, 'Edit selection name', 'New name:', QLineEdit.Normal, selection.name) if ok and name: selection.name = name self.populate_selection_menu() def on_selection_remove(self, selection): if QMessageBox.question( self, 'Please confirm', 'Do you really want to remove the selection "%s"?' % selection.name, QMessageBox.Yes | QMessageBox.No) == QMessageBox.No: return self.selections.remove(selection) self.populate_selection_menu() def on_selection_new(self): self.selections.append(self.provider_factory( 'Selection %d' % (len(self.selections) + 1), self)) self.populate_selection_menu() def serialize_selections(self): sl = list() # Selection list, current selection as first item sl.append(self.provider_factory('__current__', self).data_dict()) for s in self.selections: sl.append(s.data_dict()) return json.dumps(sl, sort_keys=True, indent=2) def save_selections_to_file(self, filename): f = open(filename, 'w') f.write(self.serialize_selections()) f.close() def load_selections_from_file(self, filename): try: f = open(filename, 'r') p = json.load(f) f.close() for s in p: if not s: continue if s['name'] == '__current__': self.set_current_selection(s) else: self.add_selection(s) except Exception, e: QMessageBox.critical(self, 'Error loading selection', str(e).decode('utf8')) logger.warning('Error loading selection:\n' + traceback.format_exc() + '\n') finally: self.progress.done() self.populate_selection_menu() def load_current_selection(self): """ Load the displayed (current) selection from a file. """ current_selection = os.path.join( self.selection_path, '.current.sel') if os.path.isfile(current_selection): self.load_selections_from_file(current_selection) else: self.populate_selection_menu() @pyqtSignature("") def on_actionSave_selection_triggered(self): d = QFileDialog(self, 'Choose where to save selection', self.selection_path) d.setAcceptMode(QFileDialog.AcceptSave) d.setNameFilter("Selection files (*.sel)") d.setDefaultSuffix('sel') if d.exec_(): filename = str(d.selectedFiles()[0]) else: return self.save_selections_to_file(filename) @pyqtSignature("") def on_actionLoad_selection_triggered(self): d = QFileDialog(self, 'Choose selection file', self.selection_path) d.setAcceptMode(QFileDialog.AcceptOpen) d.setFileMode(QFileDialog.ExistingFile) d.setNameFilter("Selection files (*.sel)") if d.exec_(): filename = unicode(d.selectedFiles()[0]) else: return self.load_selections_from_file(filename) def set_current_selection(self, data): """ Set the current selection based on a dictionary of selection data. Override in domain-specific subclasses. """ raise NotImplementedError('No selection model defined!') def add_selection(self, data): """ Add a selection based on a dictionary of selection data. Override in domain-specific subclasses. """ raise NotImplementedError('No selection model defined!') ##### Filters ######################################################## def on_current_filter_changed(self): enabled = self.filterDock.current_is_data_item() self.actionEditFilter.setEnabled(enabled) self.actionDeleteFilter.setEnabled(enabled) self.actionCopyFilter.setEnabled(enabled) def on_filters_changed(self, filter_type): self.filter_populate_function[filter_type]() def editFilter(self, copy_item): top = self.filterDock.current_filter_type() group = self.filterDock.current_filter_group() name = self.filterDock.current_name() item = self.filterDock.current_item() group_filters = None if not self.filterDock.is_current_group(): dialog = FilterDialog( self.filterDock.filter_group_dict(), top, group, name, item.code, item.combined, item.on_exception, self) else: group_filters = self.filterDock.group_filters(top, name) group = None dialog = FilterGroupDialog(top, name, item.exclusive, self) while dialog.exec_(): if copy_item and name == dialog.name(): QMessageBox.critical( self, 'Error saving', 'Please select a different name for the copied element') continue try: if not copy_item and name != dialog.name(): self.filterDock.delete_item(top, name, group) if not self.filterDock.is_current_group(): self.filterDock.add_filter( dialog.name(), dialog.group(), dialog.type(), dialog.code(), dialog.on_exception(), dialog.combined(), overwrite=True) else: self.filterDock.add_filter_group( dialog.name(), dialog.type(), dialog.exclusive(), copy.deepcopy(group_filters), overwrite=True) break except ValueError as e: QMessageBox.critical(self, 'Error saving', str(e)) def get_active_filters(self, filter_type): """ Return a list of active filters for the selected filter type """ return self.filterDock.get_active_filters(filter_type) def is_filtered(self, item, filters): """ Return if one of the filter functions in the given list applies to the given item. Combined filters are ignored. """ for f, n in filters: if f.combined or not f.active: continue try: if not f.function()(item): return True except Exception, e: if self.show_filter_exceptions: sys.stderr.write( 'Exception in filter ' + n + ':\n' + str(e) + '\n') if not f.on_exception: return True return False def filter_list(self, items, filters): """ Return a filtered list of the given list with the given filter functions. Only combined filters are used. """ if not items: return items item_type = type(items[0]) for f, n in filters: if not f.combined or not f.active: continue try: items = [i for i in f.function()(items) if isinstance(i, item_type)] except Exception, e: if self.show_filter_exceptions: sys.stderr.write( 'Exception in filter ' + n + ':\n' + str(e) + '\n') if not f.on_exception: return [] return items def refresh_filters(self): """ Refresh the list of possible filters. Call if filters are changed programmatically. """ self.filterDock.populate_filter_tree() @pyqtSignature("") def on_actionNewFilterGroup_triggered(self): top = self.filterDock.current_filter_type() dialog = FilterGroupDialog(top, parent=self) while dialog.exec_(): try: self.filterDock.add_filter_group(dialog.name(), dialog.type(), dialog.exclusive()) break except ValueError as e: QMessageBox.critical(self, 'Error creating group', str(e)) @pyqtSignature("") def on_actionNewFilter_triggered(self): top = self.filterDock.current_filter_type() group = self.filterDock.current_filter_group() dialog = FilterDialog(self.filterDock.filter_group_dict(), type=top, group=group, parent=self) while dialog.exec_(): try: self.filterDock.add_filter(dialog.name(), dialog.group(), dialog.type(), dialog.code(), dialog.on_exception(), dialog.combined()) break except ValueError as e: QMessageBox.critical(self, 'Error creating filter', str(e)) @pyqtSignature("") def on_actionDeleteFilter_triggered(self): self.filterDock.delete_current_filter() @pyqtSignature("") def on_actionEditFilter_triggered(self): self.editFilter(False) @pyqtSignature("") def on_actionCopyFilter_triggered(self): self.editFilter(True) ##### Plugins ######################################################## def get_plugin_configs(self): """ Return dictionary indexed by (name,path) tuples with configuration dictionaries for all plugins. """ indices = self.plugin_model.get_all_indices() c = {} for idx in indices: path = self.plugin_model.data( idx, self.plugin_model.FilePathRole) plug = self.plugin_model.data(idx, self.plugin_model.DataRole) if plug: c[(plug.get_name(), path)] = plug.get_parameters() return c def set_plugin_configs(self, configs): """ Takes a dictionary indexed by plugin name with configuration dictionaries for plugins and sets configurations of plugins. """ indices = self.plugin_model.get_all_indices() d = {} for idx in indices: path = self.plugin_model.data( idx, self.plugin_model.FilePathRole) plug = self.plugin_model.data(idx, self.plugin_model.DataRole) if plug: d[(plug.get_name(), path)] = plug for n, c in configs.iteritems(): if n in d: d[n].set_parameters(c) def reload_plugins(self, keep_configs=True): """ Reloads all plugins. :param bool keep_configs: If ``True``, try to restore all plugin configuration parameters after reloading. Default: ``True`` """ old_closed = self._get_closed_folders() old_path = None old_configs = {} if hasattr(self, 'plugin_model'): if keep_configs: old_configs = self.get_plugin_configs() item = self.pluginsTreeView.currentIndex() if item: old_path = self.plugin_model.data( item, self.plugin_model.FilePathRole) try: self.plugin_model = PluginModel() for p in self.plugin_paths: self.plugin_model.add_path(p) except Exception, e: QMessageBox.critical(self, 'Error loading plugins', str(e)) return self.pluginsTreeView.setModel(self.plugin_model) selected_index = None if old_path: indices = self.plugin_model.get_indices_for_path(old_path) if indices: selected_index = indices[0] self.pluginsTreeView.setCurrentIndex(selected_index) self.pluginsTreeView.expandAll() self.pluginsTreeView.selectionModel().currentChanged.connect( self.selected_plugin_changed) self.selected_plugin_changed(selected_index) self.set_plugin_configs(old_configs) self.restore_closed_plugin_folders(old_closed) def _equal_path(self, index, path): path_list = list(reversed(path.split('/'))) while index.row() >= 0: if not path_list or index.data() != path_list.pop(0): return False index = index.parent() return True def restore_closed_plugin_folders(self, paths): if paths is not None: folders = self.plugin_model.get_all_folders() for p in paths: for f in folders: if self._equal_path(f, p): self.pluginsTreeView.setExpanded(f, False) break def load_plugin_configs(self, closed_folders=None): # Restore closed plugin folders paths = closed_folders if paths is None: settings = QSettings() if settings.contains('closedPluginFolders'): paths = settings.value('closedPluginFolders') self.restore_closed_plugin_folders(paths) # Restore plugin configurations configs_path = os.path.join(self.data_path, 'plugin_configs.p') if os.path.isfile(configs_path): with open(configs_path, 'r') as f: try: configs = pickle.load(f) self.set_plugin_configs(configs) except: pass # It does not matter if we can't load plugin configs def selected_plugin_changed(self, current): enabled = True if not current: enabled = False elif not self.plugin_model.data(current, Qt.UserRole): enabled = False self.actionRunPlugin.setEnabled(enabled) self.actionEditPlugin.setEnabled(enabled) self.actionConfigurePlugin.setEnabled(enabled) self.actionRemotePlugin.setEnabled(enabled) self.actionShowPluginFolder.setEnabled(enabled) @pyqtSignature("") def on_actionRunPlugin_triggered(self): plugin = self._save_plugin_before_run() if not plugin: return self._run_plugin(plugin) def _save_plugin_before_run(self): ana = self.current_plugin() if not ana: return None if api.config.save_plugin_before_starting: e = self.pluginEditorDock.get_editor(ana.source_file) if self.pluginEditorDock.file_was_changed(e): if not self.pluginEditorDock.save_file(e): return None ana = self.current_plugin() if not ana: return None return ana def _run_plugin(self, plugin, current=None, selections=None): if current is None: current = self.provider if selections is None: selections = self.selections try: return plugin.start(current, selections) except SpykeException, err: QMessageBox.critical(self, 'Error executing plugin', str(err)) except CancelException: return None except Exception, e: # Only print stack trace from plugin on tb = sys.exc_info()[2] while not ('self' in tb.tb_frame.f_locals and tb.tb_frame.f_locals['self'] == plugin): if tb.tb_next is not None: tb = tb.tb_next else: break traceback.print_exception(type(e), e, tb) return None finally: self.progress.done() @pyqtSignature("") def on_actionEditPlugin_triggered(self): item = self.pluginsTreeView.currentIndex() path = '' if item: path = self.plugin_model.data( item, self.plugin_model.FilePathRole) if not path and self.plugin_paths: path = self.plugin_paths[0] self.pluginEditorDock.add_file(path) @pyqtSignature("") def on_actionLoad_Python_File_triggered(self): path = '' if self.plugin_paths: path = self.plugin_paths[-1] d = QFileDialog(self, 'Choose file to edit', path) d.setAcceptMode(QFileDialog.AcceptOpen) d.setFileMode(QFileDialog.ExistingFiles) d.setNameFilter("Python files (*.py)") if not d.exec_(): return for p in d.selectedFiles(): self.pluginEditorDock.add_file(unicode(p)) @pyqtSignature("") def on_actionConfigurePlugin_triggered(self): ana = self.current_plugin() if not ana: return ana.configure() @pyqtSignature("") def on_actionRefreshPlugins_triggered(self): self.reload_plugins() @pyqtSignature("") def on_actionNewPlugin_triggered(self): self.pluginEditorDock.new_file() @pyqtSignature("") def on_actionSavePlugin_triggered(self): self.pluginEditorDock.save_current() @pyqtSignature("") def on_actionSavePluginAs_triggered(self): self.pluginEditorDock.save_current(True) @pyqtSignature("") def on_actionShowPluginFolder_triggered(self): QDesktopServices.openUrl(QUrl.fromLocalFile( os.path.dirname(self.current_plugin_path()))) @pyqtSignature("") def on_actionRemotePlugin_triggered(self): plugin = self._save_plugin_before_run() if not plugin: return self._execute_remote_plugin(plugin) def send_plugin_info(self, name, path, selections, config, io_files): """ Send information to start a plugin to the configured remote script. :param str name: Name of the plugin class :param str path: Path of the plugin file :param str selections: Serialized selections to use :param str config: Pickled plugin configuration :param list io_files: List of paths to required IO plugins. """ # Save files to circumvent length limit for command line selection_path = os.path.join( self.selection_path, '.temp_%f_.sel' % time.time()) with open(selection_path, 'w') as f: f.write(selections) params = ['python', self.remote_script, name, path, selection_path, '-cf', '-sf', '-c', config, '-dd', AnalysisPlugin.data_dir] if io_files: params.append('-io') params.extend(io_files) params.extend(api.config.remote_script_parameters) p = subprocess.Popen( params, stdout=subprocess.PIPE, stderr=subprocess.PIPE) std = RemoteThread(p, self.remote_process_counter, False, self) err = RemoteThread(p, self.remote_process_counter, True, self) self.connect(std, SIGNAL("output(int, QString)"), self.output_std) self.connect(err, SIGNAL("output(int, QString)"), self.output_err) self.connect(err, SIGNAL("execution_complete(int)"), self.remote_plugin_done) std.start() err.start() self.process_threads[self.remote_process_counter] = (std, err, p) print '[#%d started]' % self.remote_process_counter self.remote_process_counter += 1 def output_std(self, id_, line): print '[#%d]' % id_, line def output_err(self, id_, line): sys.stderr.write(line + '\n') def remote_plugin_done(self, id_): print '[#%d done]' % id_ def clean_finished_process_threads(self): """ Periodically checks if threads for remote plugin output are still running, removes them otherwise. """ for k in self.process_threads.keys(): t = self.process_threads[k] if not t[0].isRunning() and not t[1].isRunning(): t[2].wait() del self.process_threads[k] QTimer.singleShot(1000, self.clean_finished_process_threads) @pyqtSignature("") def on_actionEdit_Startup_Script_triggered(self): self.pluginEditorDock.add_file(self.startup_script) @pyqtSignature("") def on_actionRestorePluginConfigurations_triggered(self): self.reload_plugins(False) def on_pluginsTreeView_doubleClicked(self, index): self.on_actionRunPlugin_triggered() def on_pluginsTreeView_customContextMenuRequested(self, pos): self.menuPluginsContext.popup(self.pluginsTreeView.mapToGlobal(pos)) def plugin_saved(self, path): if path == self.startup_script: return plugin_path = os.path.normpath(os.path.realpath(path)) in_dirs = False for p in self.plugin_paths: directory = os.path.normpath(os.path.realpath(p)) if os.path.commonprefix([plugin_path, directory]) == directory: in_dirs = True break if in_dirs: self.reload_plugins() elif api.config.ask_plugin_path: if QMessageBox.question(self, 'Warning', 'The file "%s"' % plugin_path + ' is not in the currently valid plugin ' 'directories. Do you want to open the ' 'directory' 'settings now?', QMessageBox.Yes | QMessageBox.No) == \ QMessageBox.No: return self.on_actionSettings_triggered() def current_plugin(self): """ Return the currently selected plugin object """ item = self.pluginsTreeView.currentIndex() if not item: return None return self.plugin_model.data(item, self.plugin_model.DataRole) def current_plugin_path(self): """ Return the path of the file from which the currently selected plugin has been loaded. """ item = self.pluginsTreeView.currentIndex() if not item: return None return self.plugin_model.data(item, self.plugin_model.FilePathRole) def get_plugin(self, name): """ Get plugin with the given name. Raises a SpykeException if multiple plugins with this name exist. Returns None if no such plugin exists. """ plugins = self.plugin_model.get_plugins_for_name(name) if not plugins: return None if len(plugins) > 1: raise SpykeException('Multiple plugins named "%s" exist!' % name) return plugins[0] def start_plugin(self, name, current=None, selections=None): """ Start first plugin with given name and return result of start() method. Raises a SpykeException if not exactly one plugins with this name exist. """ plugins = self.plugin_model.get_plugins_for_name(name) if not plugins: raise SpykeException('No plugin named "%s" exists!' % name) if len(plugins) > 1: raise SpykeException('Multiple plugins named "%s" exist!' % name) if api.config.save_plugin_before_starting: e = self.pluginEditorDock.get_editor(plugins[0].source_file) if self.pluginEditorDock.file_was_changed(e): if not self.pluginEditorDock.save_file(e): return plugins = self.plugin_model.get_plugins_for_name(name) if not plugins: return None if len(plugins) > 1: raise SpykeException( 'Multiple plugins named "%s" exist!' % name) return self._run_plugin(plugins[0], current, selections) def start_plugin_remote(self, name, current=None, selections=None): """ Start first plugin with given name remotely. Does not return any value. Raises a SpykeException if not exactly one plugins with this name exist. """ plugins = self.plugin_model.get_plugins_for_name(name) if not plugins: raise SpykeException('No plugin named "%s" exists!' % name) if len(plugins) > 1: raise SpykeException('Multiple plugins named "%s" exist!' % name) self._execute_remote_plugin(plugins[0], current, selections) def on_file_available(self, available): """ Callback when availability of a file for a plugin changes. """ self.actionSavePlugin.setEnabled(available) self.actionSavePluginAs.setEnabled(available) ##### General housekeeping ########################################### @pyqtSignature("") def on_actionSettings_triggered(self): settings = SettingsWindow(self.selection_path, self.filter_path, AnalysisPlugin.data_dir, self.remote_script, self.plugin_paths, self) if settings.exec_() == settings.Accepted: try: self.clean_temporary_selection_files(self.selection_path) except: pass # Does not matter if e.g. old directory does not exist self.selection_path = settings.selection_path() self.filter_path = settings.filter_path() self.remote_script = settings.remote_script() self.plugin_paths = settings.plugin_paths() if self.plugin_paths: self.pluginEditorDock.set_default_path(self.plugin_paths[-1]) self.reload_plugins() @pyqtSignature("") def on_actionExit_triggered(self): self.close() @pyqtSignature("") def on_actionAbout_triggered(self): from .. import __version__ about = QMessageBox(self) about.setWindowTitle(u'About Spyke Viewer') about.setTextFormat(Qt.RichText) about.setIconPixmap(QPixmap(':/Application/Main')) about.setText( u'Version ' + __version__ + u'

Spyke Viewer is an application for navigating, ' u'analyzing and visualizing electrophysiological datasets.
' u'
' u'www.ni.tu-berlin.de/software/spykeviewer' u'

Copyright 2012, 2013 \xa9 Robert Pr\xf6pper
' u'Neural Information Processing Group
' u'TU Berlin, Germany

' u'If you use Spyke Viewer in work that leads to a scientific ' u'publication, please cite:
' u'Pr\xf6pper, R. and Obermayer, K. (2013). Spyke Viewer: a ' u'flexible and extensible platform for electrophysiological data ' u'analysis.
' u'Front. Neuroinform. 7:26. doi: 10.3389/fninf.2013.00026' u'

Licensed under the terms of the BSD license.
' u'Icons from the Crystal Project (\xa9 2006-2007 Everaldo Coelho)') about.show() @pyqtSignature("") def on_actionDocumentation_triggered(self): webbrowser.open('http://spyke-viewer.readthedocs.org') @pyqtSignature("") def on_actionSpyke_Repository_triggered(self): webbrowser.open('http://spyke-viewer.g-node.org') def _get_closed_folders(self): if not hasattr(self, 'plugin_model'): return [] folders = self.plugin_model.get_all_folders() paths = [] for f in folders: if self.pluginsTreeView.isExpanded(f): continue path = [f.data()] p = f.parent() while p.row() >= 0: path.append(p.data()) p = p.parent() paths.append('/'.join(reversed(path))) return paths def clean_temporary_selection_files(self, path): """ Remove temporary .temp_..._.sel files from a directory. These files are written when executing plugins remotely. """ for f in os.listdir(path): if f.startswith('.temp_') and f.endswith('_.sel'): os.remove(os.path.join(path, f)) def closeEvent(self, event): """ Saves filters, plugin configs and GUI state. """ if not self.pluginEditorDock.close_all(): event.ignore() return # Ensure that selection folder exists if not os.path.exists(self.selection_path): try: os.makedirs(self.selection_path) except OSError: QMessageBox.critical( self, 'Error', 'Could not create selection directory!') self.save_selections_to_file( os.path.join(self.selection_path, '.current.sel')) self.clean_temporary_selection_files(self.selection_path) # Ensure that filters folder exists if not os.path.exists(self.filter_path): try: os.makedirs(self.filter_path) except OSError: QMessageBox.critical(self, 'Error', 'Could not create filter directory!') self.filterDock.save() # Save GUI configuration (docks and toolbars) settings = QSettings() settings.setValue('windowGeometry', self.saveGeometry()) settings.setValue('windowState', self.saveState()) # Save further configurations settings.setValue('pluginPaths', self.plugin_paths) settings.setValue('selectionPath', self.selection_path) settings.setValue('filterPath', self.filter_path) settings.setValue('remoteScript', self.remote_script) # Save plugin configurations configs = self.get_plugin_configs() configs_path = os.path.join(self.data_path, 'plugin_configs.p') with open(configs_path, 'w') as f: pickle.dump(configs, f) # Save closed plugin folders settings.setValue('closedPluginFolders', self._get_closed_folders()) super(MainWindow, self).closeEvent(event) # Prevent lingering threads self.fileTreeView.setModel(None) del self.file_system_model self.pluginsTreeView.setModel(None) del self.plugin_model spykeviewer-0.4.1/spykeviewer/ui/main.ui0000644000175000017500000005070612262550403016503 0ustar robrob MainWindow 0 0 819 867 0 0 790 580 Spyke Viewer :/Application/Main:/Application/Main false QGroupBox { border: 1px solid gray; border-radius: 5px; margin-top: 1ex; /* leave space at the top for the title */ } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; /* position at the top center */ padding: 0 2px; left: 10px; } QTabWidget::Rounded QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks 4 0 0 819 25 &File Data Read Mode Cascade Mode &Help &Selections &Plugins &Filter Console 8 Variable Explorer 8 Command History 8 Plugins 4 Qt::CustomContextMenu true true false 0 Files 2 QFormLayout::AllNonFixedFieldsGrow Format: QAbstractItemView::ExtendedSelection true true false false false Load Configure Selected IO Filter Toolbar TopToolBarArea false Plugin Toolbar TopToolBarArea false &Exit QAction::QuitRole false &Save Selection Set... &Load Selection Set... :/Application/Info:/Application/Info &About Switch Modes false &New &Clear Data true Save Selected Data &as... Settings... &Clear :/Plugins/New:/Plugins/New &New Plugin Create a new plugin false :/Plugins/Edit:/Plugins/Edit &Edit Plugin Edit selected plugin Ctrl+E :/Plugins/Reload:/Plugins/Reload &Refresh Plugins Refresh all plugins Ctrl+R false :/Plugins/Save:/Plugins/Save &Save Plugin Save current file Ctrl+S false :/Plugins/Config:/Plugins/Config &Configure Plugin Configure selected plugin F6 false :/Plugins/Run:/Plugins/Run Run &Plugin Run selected plugin F5 false :/Plugins/Remote:/Plugins/Remote Start with Remote Script Start selected plugin with Remote Script F9 :/Filter/New Filter:/Filter/New Filter &New Filter Create a new filter false :/Filter/Copy Filter:/Filter/Copy Filter &Copy Duplicate selected filter or group false :/Filter/Edit Filter:/Filter/Edit Filter &Edit Edit selected filter or filter group false :/Filter/Remove Filter:/Filter/Remove Filter &Delete Delete selected filter or filter group :/Filter/New Filter Group:/Filter/New Filter Group New Filter &Group Create a new filter group false :/Plugins/Save As:/Plugins/Save As Save Plugin &as... Save current file as... :/Application/Help:/Application/Help &Documentation Open documentation website (requires Internet access) Save All &Data as... false :/Plugins/Show Folder:/Plugins/Show Folder &Open containing folder... Open folder that contains selected plugin Edit Startup Script :/Plugins/Restore Config:/Plugins/Restore Config Restore Plugin configurations Restore Plugin configurations to their default values Load &Python File... true true Full Load true Lazy Load Load Data... :/Application/Repository:/Application/Repository Spyke Repository true Cached Lazy Load true true Regular true Lazy spykeviewer-0.4.1/spykeviewer/ui/main_window_neo.py0000644000175000017500000005061012262550403020740 0ustar robrobimport os from collections import OrderedDict import logging import pickle import copy import json import neo from PyQt4.QtCore import (Qt, pyqtSignature, QThread) from PyQt4.QtGui import (QMessageBox, QApplication, QProgressDialog, QFileDialog) from spyderlib.widgets.dicteditor import DictEditor from spykeutils import SpykeException from spykeutils.progress_indicator import ignores_cancel from spykeutils.plugin.data_provider_neo import NeoDataProvider from spykeutils.plugin.data_provider_stored import NeoStoredProvider from spykeutils.plugin import io_plugin from main_window import MainWindow from ..plugin_framework.data_provider_viewer import NeoViewerProvider from neo_navigation import NeoNavigationDock from dir_files_dialog import DirFilesDialog import io_settings logger = logging.getLogger('spykeviewer') #noinspection PyCallByClass,PyTypeChecker,PyArgumentList class MainWindowNeo(MainWindow): """ Implements Neo functionality in the main window. """ def __init__(self, parent=None, splash=None): super(MainWindowNeo, self).__init__(parent, splash) self.block_ids = {} self.block_names = OrderedDict() # Just for the display order self.block_files = {} self.block_index = 0 self.was_empty = True self.channel_group_names = {} self.io_write_params = {} # Neo navigation nav = NeoNavigationDock(self) self.neoNavigationDock = nav self.neoNavigationDock.setObjectName('neoNavigationDock') self.addDockWidget(Qt.LeftDockWidgetArea, self.neoNavigationDock) self.neoNavigationDock.setVisible(True) self.neoNavigationDock.object_removed.connect(self.refresh_neo_view) # Initialize filters self.filter_populate_function = \ {'Block': nav.populate_neo_block_list, 'Recording Channel': nav.populate_neo_channel_list, 'Recording Channel Group': nav.populate_neo_channel_group_list, 'Segment': nav.populate_neo_segment_list, 'Unit': nav.populate_neo_unit_list} self.activate_neo_mode() self.finish_initialization() def get_filter_types(self): """ Return a list of filter type tuples as required by :class:`filter_dock.FilterDock. Includes filters from Neo. """ l = super(MainWindowNeo, self).get_filter_types() l.extend([('Block', 'block'), ('Segment', 'segment'), ('Recording Channel Group', 'rcg'), ('Recording Channel', 'rc'), ('Unit', 'unit')]) return l def get_console_objects(self): """ Return a dictionary of objects that should be included in the console on startup. These objects will also not be displayed in variable explorer. Overriden for Neo imports. """ d = super(MainWindowNeo, self).get_console_objects() import quantities import neo import spykeutils d['pq'] = quantities d['neo'] = neo d['spykeutils'] = spykeutils return d def set_initial_layout(self): self.neoNavigationDock.setVisible(True) super(MainWindowNeo, self).set_initial_layout() def set_current_selection(self, data): if data['type'] == 'Neo': self.set_neo_selection(data) else: raise NotImplementedError( 'This version of Spyke Viewer only supports Neo selections!') def add_selection(self, data): if data['type'] == 'Neo': self.add_neo_selection(data) else: raise NotImplementedError( 'This version of Spyke Viewer only supports Neo selections!') def activate_neo_mode(self): self.provider = NeoViewerProvider(self) self.provider_factory = NeoStoredProvider.from_current_selection self.console.interpreter.locals['current'] = self.provider if self.ipy_kernel: self.ipy_kernel.push({'current': self.provider}) def reload_plugins(self, keep_configs=True): super(MainWindowNeo, self).reload_plugins(keep_configs) self.reload_neo_io_plugins() def reload_neo_io_plugins(self): # Clean previous plugins neo.io.iolist = [io for io in neo.io.iolist if not hasattr(io, '_is_spyke_plugin')] for pp in self.plugin_paths: for f in os.listdir(pp): p = os.path.join(pp, f) if os.path.isdir(p): continue if not p.lower().endswith('io.py'): continue try: io_plugin.load_from_file(p) except SpykeException, e: logger.warning(str(e)) # Populate IO list self.neoIOComboBox.clear() iolabels = [] for io in neo.io.iolist: if io.name: iolabels.append((io.name, io)) else: iolabels.append((io.__name__, io)) iolabels.sort(key=lambda x: x[0].lower()) self.neoIOComboBox.addItem('By extension') self.neoIOComboBox.setItemData(0, None) self.neoIOComboBox.addItems([l[0] for l in iolabels]) for i, l in enumerate(iolabels): self.neoIOComboBox.setItemData(i + 1, l[1]) # Delete stale IO configs for p in self.io_write_params.keys(): if p not in neo.io.iolist: del self.io_write_params[p] for p in NeoDataProvider.io_params.keys(): if p not in neo.io.iolist: del NeoDataProvider.io_params[p] def get_letter_id(self, id_, small=False): """ Return a name consisting of letters given an integer """ return self.neoNavigationDock.get_letter_id(id_, small) class LoadWorker(QThread): def __init__(self, paths): QThread.__init__(self) self.paths = paths self.blocks = [] self.error = None def run(self): try: self.blocks = NeoDataProvider.get_blocks(self.paths[0]) except Exception as e: self.error = e raise def load_files(self, file_paths): self.progress.begin('Loading data files...') self.progress.set_ticks(len(file_paths)) self.load_worker = self.LoadWorker(file_paths) self.load_progress = QProgressDialog(self.progress) self.load_progress.setWindowTitle('Loading File') self.load_progress.setLabelText(file_paths[0]) self.load_progress.setMaximum(0) self.load_progress.setCancelButton(None) self.load_worker.finished.connect(self.load_file_callback) self.load_worker.terminated.connect(self.load_file_callback) self.load_progress.show() self.load_worker.start() def edit_annotations(self, data): """ Edit annotations of a Neo object. """ editor = DictEditor(self) title = 'Edit annotations' if data.name: title += ' for %s' % data.name editor.setup(data.annotations, title) editor.accepted.connect( lambda: self._editor_ok(data, editor)) editor.show() editor.raise_() editor.activateWindow() def _editor_ok(self, data, editor): data.annotations = editor.get_value() @ignores_cancel def load_file_callback(self): if not self.load_worker: self.progress.done() return # Load worker thread finished blocks = self.load_worker.blocks if blocks is None: QMessageBox.critical( self, 'File could not be loaded', 'Could not read "%s": No suitable IO found.' % self.load_worker.paths[0]) logger.error('Could not read "%s": No suitable IO found.' % self.load_worker.paths[0]) self.progress.done() self.load_progress.reset() self.raise_() return if self.load_worker.error: QMessageBox.critical( self, 'File could not be loaded', 'While loading "%s", the following error occured:' '\n\n%s\n%s\n\nSee the console for more details.' % ( self.load_worker.paths[0], type(self.load_worker.error).__name__, str(self.load_worker.error))) self.progress.done() self.load_progress.reset() self.raise_() return for block in blocks: name = block.name if not name or name == 'One segment only': name = os.path.splitext(os.path.basename( self.load_worker.paths[0]))[0] name += ' (%s)' % self.get_letter_id(self.block_index) self.block_names[block] = name self.block_ids[block] = self.get_letter_id(self.block_index) self.block_files[block] = self.load_worker.paths[0] self.block_index += 1 self.load_progress.reset() self.progress.step() # Create new load worker thread paths = self.load_worker.paths[1:] if not paths: self.progress.done() if not self.was_empty: self.refresh_neo_view() else: self.neoNavigationDock.populate_neo_block_list() self.was_empty = False self.load_worker = None return self.load_worker = self.LoadWorker(paths) self.load_progress.setLabelText(paths[0]) self.load_progress.show() self.load_worker.finished.connect(self.load_file_callback) self.load_worker.terminated.connect(self.load_file_callback) self.load_worker.start() @ignores_cancel def on_loadFilesButton_pressed(self): if not self.block_index: self.was_empty = True indices = self.fileTreeView.selectedIndexes() fs_model = self.file_system_model self.load_files([fs_model.filePath(idx) for idx in indices]) def on_fileTreeView_doubleClicked(self, index): if not self.fileTreeView.model().isDir(index): self.on_loadFilesButton_pressed() def refresh_neo_view(self): self.set_current_selection(self.provider.data_dict()) def neo_blocks(self): return self.neoNavigationDock.blocks() def all_neo_blocks(self): return self.block_names.keys() def neo_block_file_names(self): """ Return a dictionary of filenames, indexed by blocks """ return self.block_files def neo_segments(self): return self.neoNavigationDock.segments() def neo_channel_groups(self): return self.neoNavigationDock.recording_channel_groups() def neo_units(self): return self.neoNavigationDock.units() def neo_channels(self): return self.neoNavigationDock.recording_channels() @pyqtSignature("") def on_actionClearCache_triggered(self): if QMessageBox.question( self, 'Please confirm', 'Do you really want to unload all data?', QMessageBox.Yes | QMessageBox.No) == QMessageBox.No: return NeoDataProvider.clear() self.neoNavigationDock.clear() self.block_ids.clear() self.block_files.clear() self.block_names.clear() self.block_index = 0 self.neoNavigationDock.populate_neo_block_list() def add_neo_selection(self, data): """ Adds a new neo selection provider with the given data """ self.selections.append(NeoStoredProvider(data, self.progress)) def set_neo_selection(self, data): """ Sets the current selection according to the given provider data """ self.progress.begin('Loading selection data...') self.progress.set_ticks(len(data['blocks'])) # Load blocks which are not currently displayed for b in data['blocks']: # File already loaded? if unicode(b[1]) in self.block_files.values(): self.progress.step() continue QApplication.setOverrideCursor(Qt.WaitCursor) try: cl = None rp = None if len(b) > 2: cl = NeoDataProvider.find_io_class(b[2]) if len(b) > 3: rp = b[3] blocks = NeoDataProvider.get_blocks( b[1], force_io=cl, read_params=rp) finally: QApplication.restoreOverrideCursor() if not blocks: logger.error('Could not read file "%s"' % b[1]) self.progress.step() continue for block in blocks: name = block.name if not name or name == 'One segment only': name = os.path.basename(b[1]) name += ' (%s)' % self.get_letter_id(self.block_index) self.block_names[block] = name self.block_ids[block] = self.get_letter_id(self.block_index) self.block_files[block] = b[1] self.block_index += 1 self.progress.step() self.progress.done() self.neoNavigationDock.set_selection(data) class SaveWorker(QThread): def __init__(self, file_name, blocks, io, params): QThread.__init__(self) self.file_name = file_name self.blocks = blocks self.io = io(filename=file_name) self.params = params self.terminated.connect(self.cleanup) self.finished.connect(self.cleanup) def run(self): if hasattr(self.io, 'write_all_blocks'): self.io.write(self.blocks, **self.params) else: if neo.Block not in self.io.writeable_objects: logger.warning('%s does not support writing blocks.' % (self.io.name or type(self.io).__name__)) if not len(self.blocks[0].segments) == 1: logger.warning('Please select a single block with a' 'single Segment.\nAborting...') else: logger.warning( 'Writing only first segment of first file...') self.io.write(self.blocks[0], **self.params) else: if len(self.blocks) > 1: logger.warning( '%s does not support writing multiple blocks.\n' 'Writing only first block...') self.io.write(self.blocks[0], **self.params) def cleanup(self): if self.io: if hasattr(self.io, 'close'): self.io.close() self.io = None def _save_blocks(self, blocks, file_name, io): if not blocks: QMessageBox.warning(self, 'Cannot save data', 'No data to save found!') self.progress.done() return self.progress.set_ticks(0) self.progress.setWindowTitle('Writing data...') self.progress.set_status('') if not os.path.splitext(file_name)[1]: # No previous file extension if len(io.extensions) == 1: # Unambiguous extension for this io file_name += '.' + io.extensions[0] self.worker = self.SaveWorker(file_name, blocks, io, self.io_write_params.get(io, {})) self.worker.finished.connect(self.progress.done) self.progress.canceled.connect(self.worker.terminate) self.worker.start() @pyqtSignature("") def on_actionLoad_Data_triggered(self): d = DirFilesDialog(self, 'Choose files or folders to load') if not d.exec_(): return self.load_files(d.selectedFiles()) @pyqtSignature("") def on_actionSave_Data_triggered(self): path, io = self._save_data_dialog('Choose where to save data') if path is None: return self.progress.begin('Collecting data to save...') blocks = self.all_neo_blocks() self._save_blocks(blocks, path, io) @pyqtSignature("") def on_actionSave_Selected_Data_triggered(self): path, io = self._save_data_dialog( 'Choose where to save selected data') if path is None: return self.progress.begin('Collecting data to save...') blocks = self.provider.selection_blocks() self._save_blocks(blocks, path, io) def _get_writeable_formats(self): """ Return a list of name filters for save dialog and a dictionary that maps name filters to IO classes. """ filters = [] d = {} for io in neo.io.iolist: if not io.is_writable: continue filters.append('%s (%s)' % ( io.name or io.__name__, ' '.join(['*.' + ext for ext in io.extensions]))) d[filters[-1]] = io return filters, d def _save_data_dialog(self, title): """ Create a save dialog for data. Return the filename and selected IO if the user wants to save, (None, None) if the dialog was canceled. :param str title: Dialog title """ dialog = QFileDialog(self, title) dialog.setAcceptMode(QFileDialog.AcceptSave) name_filters, io_mapping = self._get_writeable_formats() dialog.setNameFilters(name_filters) dialog.setConfirmOverwrite(True) if not dialog.exec_(): return None, None return unicode(dialog.selectedFiles()[0]), \ io_mapping[dialog.selectedNameFilter()] @pyqtSignature("") def on_actionFull_Load_triggered(self): NeoDataProvider.data_lazy_mode = 0 @pyqtSignature("") def on_actionLazy_Load_triggered(self): NeoDataProvider.data_lazy_mode = 1 @pyqtSignature("") def on_actionCached_Lazy_Load_triggered(self): NeoDataProvider.data_lazy_mode = 2 @pyqtSignature("") def on_actionFull_triggered(self): NeoDataProvider.cascade_lazy = False @pyqtSignature("") def on_actionLazy_triggered(self): NeoDataProvider.cascade_lazy = True @pyqtSignature("int") def on_neoIOComboBox_currentIndexChanged(self, index): if index > 0: NeoDataProvider.forced_io = self.neoIOComboBox.itemData(index) self.configureIOButton.setEnabled( io_settings.has_ui_params(NeoDataProvider.forced_io)) else: NeoDataProvider.forced_io = None self.configureIOButton.setEnabled(False) @pyqtSignature("") def on_configureIOButton_pressed(self): io = NeoDataProvider.forced_io d = io_settings.ParamDialog( io, NeoDataProvider.io_params.get(io, {}), self.io_write_params.get(io, {}), self) if d.exec_(): NeoDataProvider.io_params[io] = d.get_read_params() self.io_write_params[io] = d.get_write_params() def _execute_remote_plugin(self, plugin, current=None, selections=None): sl = list() if current is None: sl.append(self.provider_factory('__current__', self).data_dict()) else: d = copy.copy(current.data_dict()) d['name'] = '__current__' sl.append(d) if selections is None: selections = self.selections for s in selections: sl.append(s.data_dict()) io_plugin_files = [] for s in sl: if s['type'] != 'Neo': continue for b in s['blocks']: if len(b) > 2: io = NeoDataProvider.find_io_class(b[2]) if io is None: raise NameError('Error executing remote plugin: ' '%s is not a known IO class!' % b[2]) if getattr(io, '_is_spyke_plugin', False): io_plugin_files.append(io._python_file) selections = json.dumps(sl, sort_keys=True, indent=2) config = pickle.dumps(plugin.get_parameters()) name = type(plugin).__name__ path = plugin.source_file self.send_plugin_info(name, path, selections, config, io_plugin_files) def closeEvent(self, event): super(MainWindowNeo, self).closeEvent(event) NeoDataProvider.clear() spykeviewer-0.4.1/spykeviewer/ui/filter_group_dialog.py0000644000175000017500000000537212262550403021611 0ustar robrobfrom PyQt4.QtGui import (QDialog, QLabel, QComboBox, QDialogButtonBox, QGridLayout, QLineEdit, QMessageBox, QCheckBox) from PyQt4.QtCore import Qt, SIGNAL class FilterGroupDialog(QDialog): """ A dialog for editing filters """ def __init__(self, type=None, name=None, exclusive=False, parent=None): QDialog.__init__(self, parent) self.setupUi() if type: index = self.filterTypeComboBox.findText(type) if index >= 0: self.filterTypeComboBox.setCurrentIndex(index) if name: self.nameLineEdit.setText(name) self.filterTypeComboBox.setEnabled(False) self.exclusiveCheckBox.setChecked(exclusive) def setupUi(self): self.setWindowTitle('Edit filter group') self.filterTypeComboBox = QComboBox(self) self.filterTypeComboBox.addItem('Block') self.filterTypeComboBox.addItem('Segment') self.filterTypeComboBox.addItem('Recording Channel Group') self.filterTypeComboBox.addItem('Recording Channel') self.filterTypeComboBox.addItem('Unit') self.nameLineEdit = QLineEdit() self.dialogButtonBox = QDialogButtonBox(self) self.dialogButtonBox.setAutoFillBackground(False) self.dialogButtonBox.setOrientation(Qt.Horizontal) self.dialogButtonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) self.dialogButtonBox.setCenterButtons(True) self.exclusiveCheckBox = QCheckBox(self) self.exclusiveCheckBox.setText('Only one filter can be active') self.exclusiveCheckBox.setToolTip('Determines if exactly one or an arbitrary number of filters in this group can be active at once') gridLayout = QGridLayout(self) gridLayout.addWidget(QLabel('Type:', self), 0, 0) gridLayout.addWidget(self.filterTypeComboBox, 0, 1) gridLayout.addWidget(QLabel('Name:', self), 1, 0) gridLayout.addWidget(self.nameLineEdit, 1, 1) gridLayout.addWidget(self.exclusiveCheckBox, 2, 0, 1, 2) gridLayout.addWidget(self.dialogButtonBox, 3, 0, 1, 2) self.connect(self.dialogButtonBox, SIGNAL('accepted()'), self.accept) self.connect(self.dialogButtonBox, SIGNAL('rejected()'), self.reject) def name(self): return self.nameLineEdit.text() def type(self): return self.filterTypeComboBox.currentText() def exclusive(self): return self.exclusiveCheckBox.isChecked() #noinspection PyCallByClass,PyTypeChecker,PyArgumentList def accept(self): if len(self.nameLineEdit.text()) < 1: QMessageBox.critical(self, 'Error saving filter group', 'Please provide a name for the group.') return QDialog.accept(self) spykeviewer-0.4.1/spykeviewer/ui/plugin_editor_dock.py0000644000175000017500000003501212262550403021427 0ustar robrobimport os import re from PyQt4.QtGui import (QDockWidget, QWidget, QFileDialog, QGridLayout, QMessageBox, QFont, QTabWidget, QTextCursor, QDesktopServices) from PyQt4.QtCore import Qt, pyqtSignal, SIGNAL from spyderlib.widgets.sourcecode import codeeditor from spyderlib.widgets.editor import ThreadManager try: # Spyder < 2.2.0 from spyderlib.utils.module_completion import moduleCompletion \ as module_completion except ImportError: # Spyder >= 2.2.0beta3 from spyderlib.utils.module_completion import module_completion from spyderlib.utils.dochelpers import getsignaturesfromtext from spyderlib.widgets.findreplace import FindReplace class PluginEditorDock(QDockWidget): """ A dock for editing plugins. """ template_code = \ """from spykeutils.plugin import analysis_plugin, gui_data class SamplePlugin(analysis_plugin.AnalysisPlugin): def get_name(self): return 'New plugin' def start(self, current, selections): print 'Plugin started.' """ plugin_saved = pyqtSignal(str) file_available = pyqtSignal(bool) def __init__(self, title='Plugin Editor', default_path=None, parent=None): QDockWidget.__init__(self, title, parent) self.setupUi() self.thread_manager = ThreadManager(self) try: self.rope_project = codeeditor.get_rope_project() except (IOError, AttributeError): # Might happen when frozen self.rope_project = None data_path = QDesktopServices.storageLocation( QDesktopServices.DataLocation) self.default_path = default_path or os.getcwd() self.rope_temp_path = os.path.join(data_path, '.temp') self.tabs.currentChanged.connect(self._tab_changed) self.enter_completion = True def _tab_changed(self, tab): self.file_available.emit(tab != -1) def set_default_path(self, path): self.default_path = path def populate_groups(self): self.filterGroupComboBox.clear() self.filterGroupComboBox.addItem('') for g in sorted(self.groups[self.filterTypeComboBox.currentText()]): self.filterGroupComboBox.addItem(g) def setupUi(self): self.tabs = QTabWidget() self.tabs.setTabsClosable(True) self.tabs.tabCloseRequested.connect(self.close_file) self.tabs.currentChanged.connect(self._current_editor_changed) self.tabs.setMovable(True) self.tabs.setDocumentMode(True) self.find_widget = FindReplace(self, enable_replace=True) self.find_widget.hide() self.content_widget = QWidget() layout = QGridLayout(self.content_widget) layout.addWidget(self.tabs) layout.addWidget(self.find_widget) self.setWidget(self.content_widget) self.setAcceptDrops(True) def dragEnterEvent(self, event): if event.mimeData().hasUrls(): for url in event.mimeData().urls(): p = url.toString() if p.startswith('file://') and p.endswith('.py'): event.acceptProposedAction() return def dropEvent(self, event): for url in event.mimeData().urls(): p = url.toString() if p.startswith('file://') and p.endswith('.py'): self.add_file(p[7:]) event.acceptProposedAction() def _setup_editor(self): font = QFont('Some font that does not exist') font.setStyleHint(font.TypeWriter, font.PreferDefault) editor = codeeditor.CodeEditor(self) editor.setup_editor( linenumbers=True, language='py', scrollflagarea=False, codecompletion_enter=self.enter_completion, tab_mode=False, edge_line=False, font=font, codecompletion_auto=True, go_to_definition=True, codecompletion_single=True, calltips=True) editor.setCursor(Qt.IBeamCursor) editor.horizontalScrollBar().setCursor(Qt.ArrowCursor) editor.verticalScrollBar().setCursor(Qt.ArrowCursor) return editor def _trigger_code_completion(self, automatic): editor = self.tabs.currentWidget() source_code = unicode(editor.toPlainText()) offset = editor.get_position('cursor') text = editor.get_text('sol', 'cursor') if text.startswith('import '): comp_list = module_completion(text) words = text.split(' ') if ',' in words[-1]: words = words[-1].split(',') if comp_list: editor.show_completion_list(comp_list, completion_text=words[-1], automatic=automatic) return elif text.startswith('from '): comp_list = module_completion(text) words = text.split(' ') if '(' in words[-1]: words = words[:-2] + words[-1].split('(') if ',' in words[-1]: words = words[:-2] + words[-1].split(',') editor.show_completion_list(comp_list, completion_text=words[-1], automatic=automatic) return elif self.rope_project: textlist = self.rope_project.get_completion_list( source_code, offset, editor.file_name or self.rope_temp_path) if textlist: completion_text = re.split(r"[^a-zA-Z0-9_]", text)[-1] if text.lstrip().startswith('#') and text.endswith('.'): return else: editor.show_completion_list(textlist, completion_text, automatic) return def _trigger_calltip(self, position, auto=True): if not self.rope_project: return editor = self.tabs.currentWidget() source_code = unicode(editor.toPlainText()) offset = position textlist = self.rope_project.get_calltip_text( source_code, offset, editor.file_name or self.rope_temp_path) if not textlist: return obj_fullname = '' signatures = [] cts, doc_text = textlist cts = cts.replace('.__init__', '') parpos = cts.find('(') if parpos: obj_fullname = cts[:parpos] obj_name = obj_fullname.split('.')[-1] cts = cts.replace(obj_fullname, obj_name) signatures = [cts] if '()' in cts: # Either inspected object has no argument, or it's # a builtin or an extension -- in this last case # the following attempt may succeed: signatures = getsignaturesfromtext(doc_text, obj_name) if not obj_fullname: obj_fullname = codeeditor.get_primary_at(source_code, offset) if obj_fullname and not obj_fullname.startswith('self.') and doc_text: if signatures: signature = signatures[0] module = obj_fullname.split('.')[0] note = '\n Function of %s module\n\n' % module text = signature + note + doc_text else: text = doc_text editor.show_calltip(obj_fullname, text, at_position=position) def _go_to_definition(self, position): if not self.rope_project: return editor = self.tabs.currentWidget() source_code = unicode(editor.toPlainText()) offset = position fname, lineno = self.rope_project.get_definition_location( source_code, offset, editor.file_name or self.rope_temp_path) self.show_position(fname, lineno) def show_position(self, file_name, line): if not file_name or file_name == '': return if not self.add_file(file_name): return if line is None: return editor = self.tabs.currentWidget() cursor = editor.textCursor() cursor.setPosition(0, QTextCursor.MoveAnchor) cursor.movePosition(QTextCursor.Down, QTextCursor.MoveAnchor, line - 1) editor.setTextCursor(cursor) editor.raise_() editor.setFocus() self.raise_() def _finalize_new_editor(self, editor, tab_name): editor.file_was_changed = False editor.textChanged.connect(lambda: self._file_changed(editor)) self.connect(editor, SIGNAL('trigger_code_completion(bool)'), self._trigger_code_completion) self.connect(editor, SIGNAL('trigger_calltip(int)'), self._trigger_calltip) self.connect(editor, SIGNAL("go_to_definition(int)"), self._go_to_definition) self.tabs.addTab(editor, tab_name) self.tabs.setCurrentWidget(editor) self.setVisible(True) self.raise_() def new_file(self): editor = self._setup_editor() editor.file_name = None editor.set_text(self.template_code) self._finalize_new_editor(editor, '*New Plugin') def add_file(self, file_name): if file_name and not file_name.endswith('py'): QMessageBox.warning(self, 'Cannot load file', 'Only Python files are supported for editing') return False for i in xrange(self.tabs.count()): if file_name == self.tabs.widget(i).file_name: self.tabs.setCurrentIndex(i) self.raise_() return True editor = self._setup_editor() editor.file_name = file_name editor.set_text_from_file(file_name, 'python') # Remove extra newline text = editor.toPlainText() if text.endswith('\n'): editor.setPlainText(text[:-1]) tab_name = os.path.split(file_name.decode('utf-8'))[1] self._finalize_new_editor(editor, tab_name) return True def close_file(self, tab_index): if self.tabs.widget(tab_index).file_was_changed and \ self.tabs.widget(tab_index).file_name: fname = os.path.split(self.tabs.widget(tab_index).file_name)[1] if not fname: fname = 'New Plugin' ans = QMessageBox.question( self, 'File was changed', 'Do you want to save "%s" before closing?' % fname, QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) if ans == QMessageBox.Yes: return self.save_file(self.tabs.widget(tab_index), False) elif ans == QMessageBox.Cancel: return False self.tabs.removeTab(tab_index) return True def closeEvent(self, event): if not self.close_all(): event.ignore() else: event.accept() def close_all(self): while self.tabs.count(): if not self.close_file(0): return False return True def get_editor(self, file_name): """ Get editor object for a file name. Returns None if no editor for the given file name exists. """ for i in xrange(self.tabs.count()): if file_name == self.tabs.widget(i).file_name: return self.tabs.widget(i) return None def file_was_changed(self, editor): """ Returns if the file for an editor object has been changed. """ if not editor: return False return editor.file_was_changed def _file_changed(self, editor): editor.file_was_changed = True if not editor.file_name: fname = 'New Plugin' else: fname = os.path.split(editor.file_name)[1] text = '*' + fname self.tabs.setTabText(self.tabs.indexOf(editor), text) def code(self, editor=None): """ Returns code for an editor object as a list of strings (one for each line). """ if editor is None: editor = self.tabs.currentWidget() return [editor.get_text_line(l) for l in xrange(editor.get_line_count())] def code_has_errors(self, editor=None): """ Returns if the code from an editor object can be compiled. """ code = '\n'.join(self.code(editor)).encode('UTF-8') try: compile(code, '', 'exec') except SyntaxError as e: return e.msg + ' (Line %d)' % (e.lineno) return None def save_file(self, editor, force_dialog=False): """ Save the file from an editor object. :param editor: The editor for which the while should be saved. :param bool force_dialog: If True, a "Save as..." dialog will be shown even if a file name is associated with the editor. """ if not editor: return if force_dialog or not editor.file_name: d = QFileDialog( self, 'Choose where to save file', self.tabs.currentWidget().file_name or self.default_path) d.setAcceptMode(QFileDialog.AcceptSave) d.setNameFilter("Python files (*.py)") d.setDefaultSuffix('py') if d.exec_(): file_name = unicode(d.selectedFiles()[0]) else: return False else: file_name = editor.file_name err = self.code_has_errors(editor) if err: if QMessageBox.warning( self, 'Error saving "%s"' % editor.file_name, 'Compile error:\n' + err + '\n\nIf this file contains ' 'a plugin, it will disappear from the plugin list.\n' 'Save anyway?', QMessageBox.Yes | QMessageBox.No) == QMessageBox.No: return False try: f = open(file_name, 'w') f.write('\n'.join(self.code(editor)).encode('UTF-8')) f.close() except IOError, e: QMessageBox.critical( self, 'Error saving "%s"' % editor.file_name, str(e)) return False editor.file_name = file_name editor.file_was_changed = False fname = os.path.split(editor.file_name)[1] self.tabs.setTabText(self.tabs.indexOf(editor), fname) self.plugin_saved.emit(editor.file_name) return True def save_current(self, force_dialog=False): editor = self.tabs.currentWidget() self.save_file(editor, force_dialog) def _current_editor_changed(self, index): editor = self.tabs.widget(index) self.find_widget.set_editor(editor) spykeviewer-0.4.1/spykeviewer/ui/filter_dialog.py0000644000175000017500000001643012262550403020372 0ustar robrobfrom PyQt4.QtGui import (QDialog, QLabel, QComboBox, QDialogButtonBox, QGridLayout, QLineEdit, QMessageBox, QCheckBox, QFont) from PyQt4.QtCore import Qt, SIGNAL from spyderlib.widgets.sourcecode.codeeditor import CodeEditor class FilterDialog(QDialog): """ A dialog for editing filters """ solo_signatures = ['def filter(block):', 'def filter(segment):', 'def filter(rcg):', 'def filter(rc):', 'def filter(unit):'] combi_signatures = ['def filter(blocks):', 'def filter(segments):', 'def filter(rcgs):', 'def filter(rcs):', 'def filter(units):'] def __init__(self, groups, type=None, group=None, name=None, code=None, combined=False, on_exception=False, parent=None): QDialog.__init__(self, parent) self.setupUi() self.groups = groups if type: index = self.filterTypeComboBox.findText(type) if index >= 0: self.filterTypeComboBox.setCurrentIndex(index) self.populate_groups() if group: index = self.filterGroupComboBox.findText(group) if index >= 0: self.filterGroupComboBox.setCurrentIndex(index) if name: self.nameLineEdit.setText(name) if code: self.editor.set_text('\n'.join(code)) if name and code and type: self.filterTypeComboBox.setEnabled(False) self.combinedCheckBox.setChecked(combined) self.onExceptionCheckBox.setChecked(on_exception) def populate_groups(self): self.filterGroupComboBox.clear() self.filterGroupComboBox.addItem('') for g in sorted(self.groups[self.filterTypeComboBox.currentText()]): self.filterGroupComboBox.addItem(g) def setupUi(self): self.setWindowTitle('Edit filter') #self.resize(400, 300) self.signatureLabel = QLabel(self) self.signatureLabel.setText('def filter(block):') font = QFont('Some font that does not exist') font.setStyleHint(font.TypeWriter, font.PreferDefault) self.editor = CodeEditor(self) self.editor.setup_editor( linenumbers=False, language='py', scrollflagarea=False, codecompletion_enter=True, font=font, highlight_current_line=False, occurence_highlighting=False) self.editor.setCursor(Qt.IBeamCursor) self.editor.horizontalScrollBar().setCursor(Qt.ArrowCursor) self.editor.verticalScrollBar().setCursor(Qt.ArrowCursor) self.editor.set_text('return True') self.onExceptionCheckBox = QCheckBox(self) self.onExceptionCheckBox.setText('True on exception') self.onExceptionCheckBox.setToolTip('Determines if the filter will ' 'admit items if there is an ' 'exception during its execution') self.combinedCheckBox = QCheckBox(self) self.combinedCheckBox.setText('Combined filter') self.combinedCheckBox.setToolTip('Determines if the filter operates ' 'on single items (return True or ' 'False) or lists of items (return a ' 'list of items to be admitted)') self.filterTypeComboBox = QComboBox(self) self.filterTypeComboBox.addItem('Block') self.filterTypeComboBox.addItem('Segment') self.filterTypeComboBox.addItem('Recording Channel Group') self.filterTypeComboBox.addItem('Recording Channel') self.filterTypeComboBox.addItem('Unit') self.filterGroupComboBox = QComboBox(self) self.nameLineEdit = QLineEdit() self.dialogButtonBox = QDialogButtonBox(self) self.dialogButtonBox.setAutoFillBackground(False) self.dialogButtonBox.setOrientation(Qt.Horizontal) self.dialogButtonBox.setStandardButtons( QDialogButtonBox.Cancel | QDialogButtonBox.Ok) self.dialogButtonBox.setCenterButtons(True) gridLayout = QGridLayout(self) gridLayout.addWidget(self.signatureLabel, 0, 0, 1, 4) gridLayout.addWidget(self.editor, 1, 0, 1, 4) gridLayout.addWidget(self.onExceptionCheckBox, 2, 2, 1, 1) gridLayout.addWidget(self.combinedCheckBox, 2, 3, 1, 1) gridLayout.addWidget(QLabel('Type:', self), 2, 0) gridLayout.addWidget(self.filterTypeComboBox, 2, 1) gridLayout.addWidget(QLabel('Group:', self), 3, 0) gridLayout.addWidget(self.filterGroupComboBox, 3, 1, 1, 3) gridLayout.addWidget(QLabel('Name:', self), 4, 0) gridLayout.addWidget(self.nameLineEdit, 4, 1, 1, 3) gridLayout.addWidget(self.dialogButtonBox, 5, 0, 1, 4) self.connect(self.dialogButtonBox, SIGNAL('accepted()'), self.accept) self.connect(self.dialogButtonBox, SIGNAL('rejected()'), self.reject) self.combinedCheckBox.stateChanged.connect( self.combined_state_changed) self.connect(self.filterTypeComboBox, SIGNAL('currentIndexChanged(int)'), self.on_filterTypeComboBox_currentIndexChanged) def name(self): return self.nameLineEdit.text() def code(self): return [self.editor.get_text_line(l) for l in xrange( self.editor.get_line_count())] def type(self): return self.filterTypeComboBox.currentText() def combined(self): return self.combinedCheckBox.isChecked() def group(self): if self.filterGroupComboBox.currentText() == '': return None return self.filterGroupComboBox.currentText() def on_exception(self): return self.onExceptionCheckBox.isChecked() def combined_state_changed(self): self.set_signature() def code_errors(self): code = self.signatureLabel.text() + '\n\t' code += '\n\t'.join(self.code()) try: compile(code, '', 'exec') except SyntaxError as e: return e.msg + ' (Line %d)' % (e.lineno - 1) return None def set_signature(self): if self.combinedCheckBox.isChecked(): self.signatureLabel.setText( self.combi_signatures[ self.filterTypeComboBox.currentIndex()]) else: self.signatureLabel.setText( self.solo_signatures[ self.filterTypeComboBox.currentIndex()]) def on_filterTypeComboBox_currentIndexChanged(self, index): self.set_signature() self.populate_groups() #noinspection PyCallByClass,PyTypeChecker,PyArgumentList def accept(self): if len(self.nameLineEdit.text()) < 1: QMessageBox.critical(self, 'Error saving filter', 'Please provide a name for the filter.') return if '"' in self.nameLineEdit.text(): QMessageBox.critical(self, 'Error saving filter', 'You cannot use " in the name of a filter.') return err = self.code_errors() if err: QMessageBox.critical(self, 'Error saving filter', 'Compile error:\n' + err) return QDialog.accept(self)spykeviewer-0.4.1/spykeviewer/ui/dir_files_dialog.py0000644000175000017500000000511712262550403021045 0ustar robrobfrom PyQt4.QtCore import QEvent from PyQt4.QtGui import (QFileDialog, QListView, QPushButton, QDialog, QTreeView) class DirFilesDialog(QFileDialog): """ A file dialog that allows to choose multiple files and folders. """ def __init__(self, parent=None, caption='', directory='', filter=''): super(DirFilesDialog, self).__init__(parent, caption, directory, filter) self.setOption(QFileDialog.DontUseNativeDialog, True) self.setAcceptMode(QFileDialog.AcceptOpen) self.setFileMode(QFileDialog.Directory) self.setNameFilter('All files or folders (*)') self.setNameFilterDetailsVisible(False) self.list_view = self.findChild(QListView, 'listView') if self.list_view: self.list_view.setSelectionMode(QListView.ExtendedSelection) sel_model = self.list_view.selectionModel() sel_model.selectionChanged.connect(self.enable_update) self.tree_view = self.findChild(QTreeView, 'listView') if self.tree_view: self.tree_view.setSelectionMode(QTreeView.ExtendedSelection) sel_model = self.tree_view.selectionModel() sel_model.selectionChanged.connect(self.enable_update) for b in self.findChildren(QPushButton): if 'choose' in b.text().lower(): self.button = b b.installEventFilter(self) b.clicked.disconnect() b.clicked.connect(self.choose_clicked) b.setEnabled(False) break def eventFilter(self, watched, event): if event.type() == QEvent.EnabledChange: if not watched.isEnabled(): if self.list_view: if self.list_view.selectionModel().selectedIndexes(): watched.setEnabled(True) elif self.tree_view: if self.tree_view.selectionModel().selectedIndexes(): watched.setEnabled(True) return super(QFileDialog, self).eventFilter(watched, event) def enable_update(self): if self.list_view: if self.list_view.selectionModel().selectedIndexes(): self.button.setEnabled(True) else: self.button.setEnabled(False) elif self.tree_view: if self.tree_view.selectionModel().selectedIndexes(): self.button.setEnabled(True) else: self.button.setEnabled(False) def choose_clicked(self): self.done(QDialog.Accepted)spykeviewer-0.4.1/spykeviewer/ui/neo_navigation_ui.py0000644000175000017500000001266312262550403021267 0ustar robrob# -*- coding: utf-8 -*- # Form implementation generated from reading ui file '.\neo_navigation.ui' # # Created: Mon Sep 09 17:08:01 2013 # by: PyQt4 UI code generator 4.9.6 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_neoNavigationDock(object): def setupUi(self, neoNavigationDock): neoNavigationDock.setObjectName(_fromUtf8("neoNavigationDock")) neoNavigationDock.resize(352, 559) self.dockWidgetContents = QtGui.QWidget() self.dockWidgetContents.setObjectName(_fromUtf8("dockWidgetContents")) self.gridLayout = QtGui.QGridLayout(self.dockWidgetContents) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.verticalLayout_31 = QtGui.QVBoxLayout() self.verticalLayout_31.setObjectName(_fromUtf8("verticalLayout_31")) self.blocksLabel = QtGui.QLabel(self.dockWidgetContents) self.blocksLabel.setObjectName(_fromUtf8("blocksLabel")) self.verticalLayout_31.addWidget(self.blocksLabel) self.neoBlockList = QtGui.QListView(self.dockWidgetContents) self.neoBlockList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.neoBlockList.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.neoBlockList.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.neoBlockList.setObjectName(_fromUtf8("neoBlockList")) self.verticalLayout_31.addWidget(self.neoBlockList) self.channelGroupsLabel = QtGui.QLabel(self.dockWidgetContents) self.channelGroupsLabel.setObjectName(_fromUtf8("channelGroupsLabel")) self.verticalLayout_31.addWidget(self.channelGroupsLabel) self.neoChannelGroupList = QtGui.QListView(self.dockWidgetContents) self.neoChannelGroupList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.neoChannelGroupList.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.neoChannelGroupList.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.neoChannelGroupList.setObjectName(_fromUtf8("neoChannelGroupList")) self.verticalLayout_31.addWidget(self.neoChannelGroupList) self.channelsLabel = QtGui.QLabel(self.dockWidgetContents) self.channelsLabel.setObjectName(_fromUtf8("channelsLabel")) self.verticalLayout_31.addWidget(self.channelsLabel) self.neoChannelList = QtGui.QListView(self.dockWidgetContents) self.neoChannelList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.neoChannelList.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.neoChannelList.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.neoChannelList.setObjectName(_fromUtf8("neoChannelList")) self.verticalLayout_31.addWidget(self.neoChannelList) self.gridLayout.addLayout(self.verticalLayout_31, 0, 0, 1, 1) self.verticalLayout_29 = QtGui.QVBoxLayout() self.verticalLayout_29.setObjectName(_fromUtf8("verticalLayout_29")) self.segmentsLabel = QtGui.QLabel(self.dockWidgetContents) self.segmentsLabel.setObjectName(_fromUtf8("segmentsLabel")) self.verticalLayout_29.addWidget(self.segmentsLabel) self.neoSegmentList = QtGui.QListView(self.dockWidgetContents) self.neoSegmentList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.neoSegmentList.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.neoSegmentList.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.neoSegmentList.setObjectName(_fromUtf8("neoSegmentList")) self.verticalLayout_29.addWidget(self.neoSegmentList) self.unitsLabel = QtGui.QLabel(self.dockWidgetContents) self.unitsLabel.setObjectName(_fromUtf8("unitsLabel")) self.verticalLayout_29.addWidget(self.unitsLabel) self.neoUnitList = QtGui.QListView(self.dockWidgetContents) self.neoUnitList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.neoUnitList.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.neoUnitList.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.neoUnitList.setObjectName(_fromUtf8("neoUnitList")) self.verticalLayout_29.addWidget(self.neoUnitList) self.gridLayout.addLayout(self.verticalLayout_29, 0, 1, 1, 1) neoNavigationDock.setWidget(self.dockWidgetContents) self.retranslateUi(neoNavigationDock) QtCore.QMetaObject.connectSlotsByName(neoNavigationDock) def retranslateUi(self, neoNavigationDock): neoNavigationDock.setWindowTitle(_translate("neoNavigationDock", "Navigation", None)) self.blocksLabel.setText(_translate("neoNavigationDock", "Blocks:", None)) self.channelGroupsLabel.setText(_translate("neoNavigationDock", "Channel Groups:", None)) self.channelsLabel.setText(_translate("neoNavigationDock", "Channels:", None)) self.segmentsLabel.setText(_translate("neoNavigationDock", "Segments:", None)) self.unitsLabel.setText(_translate("neoNavigationDock", "Units:", None)) spykeviewer-0.4.1/spykeviewer/ui/plugin_model.py0000644000175000017500000001145012262550403020241 0ustar robrobfrom PyQt4.QtCore import Qt from PyQt4.QtCore import QAbstractItemModel, QModelIndex from spykeviewer.plugin_framework.plugin_manager import PluginManager #noinspection PyMethodOverriding class PluginModel(PluginManager, QAbstractItemModel): """ Implements a Qt-Model for the PluginManager for use in e.g. QTreeView """ DataRole = Qt.UserRole FilePathRole = Qt.UserRole + 1 def __init__(self, parent=None): PluginManager.__init__(self) QAbstractItemModel.__init__(self, parent) def columnCount(self, parent): return 1 def data(self, index, role): if not index.isValid(): return None item = index.internalPointer() if role == Qt.DisplayRole: if index.column() > 0: return None return item.name.decode('utf-8') if role == PluginModel.DataRole: return item.data if role == PluginModel.FilePathRole: return item.path return None def flags(self, index): if not index.isValid(): return Qt.NoItemFlags if not index.internalPointer().data: return Qt.NoItemFlags return Qt.ItemIsEnabled | Qt.ItemIsSelectable def headerData(self, section, orientation, role): if orientation == Qt.Horizontal and role == Qt.DisplayRole and \ section == 0: return self.root.name return None def index(self, row, column, parent): if not self.hasIndex(row, column, parent): return QModelIndex() if not parent.isValid(): parent_node = self.root else: parent_node = parent.internalPointer() child_node = parent_node.child(row) if child_node: return self.createIndex(row, column, child_node) else: return QModelIndex() def parent(self, index): if not index.isValid(): return QModelIndex() child_node = index.internalPointer() parent_node = child_node.parent if parent_node == self.root: return QModelIndex() return self.createIndex(parent_node.row(), 0, parent_node) def rowCount(self, parent): if parent.column() > 0: return 0 if not parent.isValid(): parent_node = self.root else: parent_node = parent.internalPointer() return parent_node.childCount() def get_indices_for_path(self, path, parent=None): indices = [] if parent is None: parent = self.root for i in xrange(parent.childCount()): c = parent.child(i) indices.extend(self.get_indices_for_path(path, c)) if c.path == path: indices.append(self.createIndex(i, 0, c)) return indices def get_indices_for_name(self, name, parent=None): indices = [] if parent is None: parent = self.root for i in xrange(parent.childCount()): c = parent.child(i) indices.extend(self.get_indices_for_name(name, c)) if c.name == name: indices.append(self.createIndex(i, 0, c)) return indices def get_all_indices(self, parent=None): indices = [] if parent is None: parent = self.root for i in xrange(parent.childCount()): c = parent.child(i) indices.extend(self.get_all_indices(c)) indices.append(self.createIndex(i, 0, c)) return indices def get_all_folders(self, parent=None): indices = [] if parent is None: parent = self.root for i in xrange(parent.childCount()): c = parent.child(i) if c.childCount(): indices.extend(self.get_all_folders(c)) indices.append(self.createIndex(i, 0, c)) return indices def get_plugins_for_name(self, name): """ Return list of plugins with given name """ indices = self.get_indices_for_name(name) plugins = [] for idx in indices: p = self.data(idx, self.DataRole) if p: plugins.append(p) return plugins def get_plugins_for_path(self, name): """ Return list of plugins in given path """ indices = self.get_indices_for_path(name) plugins = [] for idx in indices: p = self.data(idx, self.DataRole) if p: plugins.append(p) return plugins def get_all_plugins(self): """ Return all plugins in this model """ indices = self.get_all_indices() plugins = [] for idx in indices: p = self.data(idx, self.DataRole) if p: plugins.append(p) return plugins spykeviewer-0.4.1/spykeviewer/ui/settings.ui0000644000175000017500000001176512262550403017421 0ustar robrob Settings 0 0 647 438 Settings QGroupBox { border: 1px solid gray; border-radius: 5px; margin-top: 1ex; /* leave space at the top for the title */ } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; /* position at the top center */ padding: 0 2px; left: 10px; } Plugin paths Add Remove Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Filter path true Change Selection path true Change Data path true Change Remote script true Change buttonBox accepted() Settings accept() 248 254 157 274 buttonBox rejected() Settings reject() 316 260 286 274 spykeviewer-0.4.1/spykeviewer/ui/icons_rc.py0000644000175000017500000041373512262550403017376 0ustar robrob# -*- coding: utf-8 -*- # Resource object code # # Created: Mi. Jun 19 11:08:33 2013 # by: The Resource Compiler for PyQt (Qt v4.8.2) # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore qt_resource_data = "\ \x00\x00\x05\xff\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x05\xc6\x49\x44\x41\x54\x48\x89\x8d\x55\x5b\x6c\x54\x55\ \x14\x5d\xe7\x31\x77\xee\x3c\xee\x6d\x4b\x47\x87\xe9\x43\x5a\x79\ \x04\xda\xd2\x42\xa9\x94\xd8\x26\xf5\x17\x13\x3e\x04\x2a\x02\x15\ \x8d\x18\x2c\x34\x8a\x7e\xf1\x03\x8a\x91\x44\x6a\xd3\x50\xfc\xe0\ \x47\x12\x41\x4c\x79\x7d\x40\x1b\xa8\xb1\x60\x8c\x90\xf0\x88\xb5\ \xd4\x04\x95\xf2\x68\x29\xd2\x0e\x33\x1d\xec\x0c\x74\x1e\x77\xee\ \xbd\xe7\xf8\xd1\xd2\x4c\x79\x88\x3b\x39\x1f\xfb\x63\xad\x7d\xf6\ \x3e\x7b\xad\x43\xa4\x94\x78\x5e\x34\x34\x34\x38\x37\x6c\xd8\xf0\ \xf3\xc0\xc0\x40\x3e\xa5\x14\xb9\xb9\xb9\xb7\x57\xad\x5a\x55\xf7\ \x5c\x20\x00\x48\x29\x9f\x7b\x14\xc5\x51\xfc\xed\x81\x83\xd6\x58\ \x34\x26\x13\xc9\x94\xfc\x66\xff\x7e\x03\xc0\x0b\xff\x07\xcb\x76\ \xee\xdc\x39\xad\x60\x73\x73\xf3\x8c\xce\xce\xce\xee\xa1\x3b\x77\ \x7e\xad\xac\xac\x0c\xb7\xb5\xed\xa9\xaa\xa8\x58\xd4\xba\xfc\xf5\ \xe5\x73\x15\x45\x21\x42\x48\xf8\xfd\x7e\xaa\x79\xbd\x73\xaf\x5e\ \xbd\xfa\xc7\xb2\x65\xcb\xc2\xad\xad\xad\x4b\x3b\x3a\x3a\x0e\xf7\ \xf5\xf5\x1d\xa9\xa9\xa9\xb1\x32\xf9\x48\xe6\x88\x76\xef\xfe\x92\ \x11\x42\x6f\xae\x6b\x78\xbb\x28\x14\x0c\x86\xcf\x9f\x3f\x97\x2a\ \x2e\x7e\xb9\xe0\xd5\x9a\x1a\x9a\x4e\x1b\x60\x8c\xc3\xe1\xe0\x70\ \x38\x1c\xf0\x78\x3c\xe8\xee\xee\xb6\x21\xe5\xaf\xfe\x99\x33\xe7\ \x94\x95\x95\xf9\xda\xf6\xec\xb9\xb1\x6d\xdb\xb6\x79\xcf\x2c\xd0\ \xda\xda\x7a\x67\x55\xfd\x9b\x85\xf1\x78\x1c\x8a\xa2\x80\x73\x8e\ \x54\x2a\x05\x00\xf0\xb8\x5d\xe0\xdc\x01\xee\xe0\x70\x70\x0e\x42\ \x08\x18\x63\xe0\x9c\x43\x08\x01\xd3\x34\xa1\xaa\x2a\x5a\x5a\x5a\ \x06\x76\x6c\xdf\x3e\xfb\x11\x27\x9d\xaa\x44\x88\x2b\x91\x4c\xaa\ \x42\x08\x10\x42\x60\x9a\x26\x92\xc9\x24\x84\x10\x10\xb6\x8d\xa1\ \xa1\x3b\x08\x8e\x8c\x60\xf8\xef\xbb\x18\x18\x18\x84\x61\x18\xb0\ \x2c\x0b\x86\x61\xc0\x34\x4d\x48\x09\xd8\x96\x0d\xcb\x34\x5d\x84\ \x10\xf6\xd4\x0e\x54\x55\x5d\x7f\xea\xf4\xe9\x03\xb3\x8a\x8a\xb9\ \x69\x9a\x10\x42\x60\xec\xfe\x7d\x94\x96\x96\xc2\xe5\x52\xa1\x28\ \x0a\x28\xa5\xb0\x85\x80\x14\x02\xd7\xfa\xaf\xa3\xb0\xb0\x60\x72\ \x11\x14\xfc\xf6\x5b\x8f\xf9\x5a\xdd\x6b\x2b\x84\x10\x3f\x3e\xe2\ \xe4\x99\xf3\xaa\xaa\xaa\x2a\x99\x55\x54\xcc\x2d\xcb\x82\x10\x02\ \xb1\x68\x14\x15\x15\xe5\xb8\x17\x0a\x83\x10\xc0\x34\x2d\xe8\xba\ \x06\x5d\xd7\x20\x25\x30\x6f\xde\x5c\xdc\xbe\x7d\x1b\x3e\x5f\x2e\ \x52\xa9\x14\xe6\xcc\x99\xeb\x28\x2f\x2f\xaf\x00\x30\x55\x80\x66\ \x16\x58\x5d\x5f\xbf\x5e\x51\x94\xa9\x15\x2b\x2b\x2b\xc5\x58\x34\ \x06\xc6\x28\x14\xc5\x09\xcb\x32\xed\x74\x3a\x2d\x14\xc5\x09\x29\ \x25\xe2\xf1\x38\x0a\x0b\x0a\x90\x4a\x19\x48\xa7\x4d\x78\x3c\x1e\ \xac\x59\xb3\xe6\xfd\x69\x8f\xbc\x65\xcb\x96\xbc\xac\xac\xac\xc3\ \x96\x65\xe5\xac\x79\x6b\x6d\x89\xc7\xe3\x61\x96\x35\xb1\x69\x1e\ \x8f\x67\xe2\x16\x94\xe2\xf3\x9d\x9f\xfd\xd1\xde\xde\xde\xee\x70\ \x38\x3c\x8d\x8d\x9b\x1b\x76\x7c\xba\xe3\x25\xc3\x30\x60\x18\x06\ \x1e\x3e\x1c\x87\xdb\xed\x82\x94\x12\xd1\x68\xcc\x3e\x7a\xe4\xf0\ \x5f\xa6\x69\x8e\x9e\x3c\x79\x72\x23\x09\x04\x02\xf5\xa7\x4e\x77\ \x1d\x09\x04\xf2\x68\xec\x41\x0c\xb6\x6d\xc3\xb2\x2c\xfc\x73\xff\ \x3e\xfc\x7e\x3f\xbc\x5e\x2f\x7e\xe8\xea\x0a\x35\x36\x7e\x50\x22\ \xa5\xfc\x67\x72\x21\xaa\xda\xda\xf6\x9e\x7b\x63\xe5\x4a\x57\x3c\ \x1e\x47\x30\x38\x82\x40\x20\x6f\x42\x58\x8c\x21\x27\x27\x07\x83\ \x83\x83\xd6\xfa\x75\x6b\x3f\xa4\x00\x94\x44\x22\x81\x68\x2c\x0a\ \xdb\xb6\x41\x08\x81\x10\x02\x00\x30\xfe\x70\x1c\x86\x61\x60\x68\ \x68\xe8\xe6\x23\x72\x00\x90\x52\xf6\xb8\xdc\xae\xd1\x58\x2c\x86\ \xb4\x61\x80\x52\x06\x5b\x08\x50\x4a\x26\x70\xf1\x38\x52\xa9\x24\ \x91\x52\x32\x0a\xc0\xd6\xbc\x1a\x72\xb2\xb3\xc1\x28\x85\x14\x02\ \x94\x10\x28\x8a\x82\x82\xc2\x7c\x68\x9a\x86\xd2\xb2\xd2\xd9\x78\ \x2c\x28\xa1\x2f\xe8\x59\x3a\xb2\xb2\xb3\x41\xc8\x04\xb1\x90\x00\ \xe7\x1c\xbe\xdc\x5c\xe8\x9a\x2e\x01\x80\x46\x22\x91\xbe\x8e\x8e\ \x13\xfd\xdf\x1f\xfa\x6e\x78\x6c\x6c\xcc\xe6\x9c\x63\xd2\xd0\xa0\ \xaa\x2a\x28\x25\xd0\xf5\xac\x99\xd5\xd5\xd5\x53\x0a\xad\xae\xae\ \x9e\x97\x5f\x50\xe0\x22\x20\xe0\x9c\x23\xd7\xe7\x9b\x12\x5e\x28\ \x1c\xb2\x3f\xf9\x78\xeb\xcd\x73\xe7\x7e\xb9\x35\x3c\x3c\xdc\x4b\ \xa4\x94\x20\x84\x70\x00\xf8\x62\xd7\xae\x81\xa6\xa6\xa6\xc2\x68\ \x34\x8a\x64\x32\x05\xbf\xff\x45\x10\x42\x60\x59\x16\x7a\x7a\x7a\ \x60\xa4\x0c\x70\xce\xc0\x18\xc7\xc2\xf2\x72\x38\x15\x05\x86\x99\ \x46\x34\x1a\x03\x63\x0c\xba\xae\xe3\xeb\xbd\x6d\xb7\xbe\x6a\x6e\ \x9e\x43\x08\x71\x4a\x29\x0d\x3a\x39\x53\x4b\x4a\x69\x7d\x77\xf0\ \xe0\xf1\x58\x2c\x06\x4d\xd3\xa0\x6b\x1a\x86\xef\x0e\x83\x73\x0e\ \xc6\x18\x16\x2e\x2c\x47\x5e\x7e\x3e\x5e\x9a\x55\x84\x05\x25\x25\ \x20\x00\x2c\xcb\xc2\xe0\xc0\x20\x18\x63\xa0\x8c\x21\x1c\xba\x87\ \x63\x47\x8f\xb6\x4f\x72\x1a\x4f\xe8\x60\x64\x64\xe4\xc4\x68\x38\ \x6c\x39\x9d\x2a\x14\xa7\x82\x9c\x19\x33\xd0\x7f\xad\x1f\x89\x44\ \x12\xb6\x6d\x43\xd7\x75\xb8\x54\x15\xb6\x6d\x23\x91\x4c\xa2\xff\ \xc6\x0d\xe4\xfa\x7c\x00\x00\x46\x29\x46\x47\x47\xd3\xf7\x82\xc1\ \xce\x69\x3a\xc8\xb4\x8a\x33\x67\xcf\x86\xea\xea\xea\x5e\x8c\xc7\ \xe3\x10\x52\xc0\x4c\x5b\x18\x1f\x1f\x47\x32\x99\xc4\xef\x7d\x7d\ \xb0\xa5\x04\x21\x00\x25\x04\x8b\x16\x2f\x06\xa5\x53\x96\x03\x29\ \x25\x34\x4d\xc3\xe5\x8b\x17\x47\xea\xeb\x57\xe7\x3f\xa1\x64\x42\ \x08\xef\xea\xea\x4a\x00\x00\xe3\x0c\x6e\x97\x1b\x9a\xa6\xc1\xeb\ \xf5\x80\x31\x86\xc5\x95\x95\xa8\x7a\xe5\x15\x2c\x59\x52\x85\xca\ \xca\x25\x60\x94\x41\x55\x55\xe8\xba\x06\x97\xcb\x05\xc6\x18\x20\ \x25\xce\x9c\xe9\x4e\x3c\xb3\x03\x42\xc8\x82\xcd\x9b\x37\x77\xed\ \xdb\xb7\xaf\xa8\xa5\xa5\x25\x12\x89\x44\x1e\xd4\xd5\xd5\x15\xce\ \x9f\xbf\xc0\x91\x36\x4d\xd8\x93\xfa\xe0\x93\x36\xdd\xdb\xdb\x6b\ \x5c\xba\x78\x61\x28\x2f\x2f\xcf\xf7\xee\x7b\x1b\x67\x7c\xb2\xf5\ \xa3\x5b\x87\x0e\x1d\x5a\x21\xa5\xfc\x6b\x5a\x6b\x99\x87\x52\xba\ \xb4\xb6\xb6\xf6\xbc\xd3\xe9\x5c\x0d\x20\x1b\x40\x63\x53\x53\xd3\ \x95\xde\x2b\x57\xc4\x9f\xd7\xfa\xe5\xb5\xfe\xeb\xf2\xd2\xa5\xcb\ \xf6\xa6\x4d\x9b\x2e\x03\x78\x07\x80\xd7\xed\x76\x6f\xac\xad\xad\ \x3d\x0f\xa0\xf2\x71\xbe\xa7\xfe\xa3\x00\x58\x66\xee\x74\x3a\xcb\ \x2e\x5c\xbc\x64\x06\x43\x61\x19\x1a\x8d\xc8\xb3\x67\x7f\x4a\x11\ \x42\x0a\x1f\xc3\xf0\xa7\x71\x4d\xb3\xeb\x8c\xae\xec\xcc\xdc\x30\ \x8c\xd0\xf1\x63\x47\xaf\x07\x83\x41\x0e\x80\x04\x02\x81\x84\x94\ \x32\xf2\x18\x66\xda\x5f\xfc\xd4\x37\xf8\xaf\x20\x84\xcc\x04\xe0\ \x9a\x4c\x93\x52\xca\x7b\xff\x07\xf7\x2f\xa7\x85\x20\x10\x58\x5e\ \x02\x72\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x77\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x06\x3e\x49\x44\x41\x54\x48\x89\x85\x96\x59\x6c\x5c\x57\ \x1d\xc6\x7f\xe7\xae\x73\xe7\xce\x78\x89\x67\x3c\x9e\x71\x6c\xc7\ \xce\xe2\xb6\x4e\x49\xe4\xb4\x10\x09\xa8\x68\x69\x9a\x40\x02\x2f\ \xe4\x05\x84\x58\xa4\xbe\xf0\xc2\xf6\x00\x7d\x40\x42\x02\x81\x10\ \x8b\x10\x52\x84\xc2\x5b\x01\xa1\x14\x84\x8a\x58\x4a\x09\x8b\x9a\ \x96\xad\x69\x48\x88\xb2\xd4\xa4\x71\x12\x8f\x63\x7b\x3c\x1e\x8f\ \x3d\xcb\xbd\x73\xf7\x7b\x78\xc2\x4d\x64\x45\x9c\xb7\xff\xcb\xf7\ \xd3\xf7\x3f\x3a\xdf\x77\x84\x94\x92\x07\x1d\x27\xc2\xfa\xd0\x0f\ \x6e\x1e\xb9\x3a\x37\x7f\xcc\x4a\xbb\x8f\x25\xb1\x37\xa2\x90\x08\ \x2f\x4a\x1a\x4e\x28\x2e\x87\x89\xfe\x47\x88\x5e\x96\xbf\x7e\xb6\ \xfd\x20\x0d\xf1\x20\xc0\x6f\xae\xf7\x3e\xfa\xf3\x73\xf3\x5f\xc5\ \x59\x9d\xde\x39\x20\xc8\x99\x3a\x49\x1a\xb3\x5c\x6f\xd1\x72\x53\ \x9a\xa1\x81\x9b\x9a\x6c\x76\xbb\x4b\xb7\x16\x16\xbf\x95\x06\xed\ \xd3\xf2\xdc\xd7\x93\xff\x0b\xf8\xda\x6b\xa1\xd5\xdd\x6c\x9d\xae\ \xdd\x7a\xeb\x13\x4f\xec\xc9\xf2\xe4\xec\x04\xe3\xa5\x01\xa2\x54\ \xb2\xda\x09\x78\xab\xe6\xb3\xe1\x2b\x34\x36\x3d\xae\x55\x37\xa8\ \xaf\xae\x53\xaf\xdd\x65\xee\xce\xed\xb3\xee\x66\xe3\xe3\xf2\xfc\ \xa9\xf5\x7b\xf5\xb4\x7b\x87\x03\xa7\x3a\x86\x9e\x26\xbf\x78\xd8\ \xbf\x72\xe2\xa9\xe9\x2c\xef\x7f\xd7\x6e\x2a\xc5\x3e\xa4\x94\x08\ \xa9\x90\x31\x6d\x2c\x5b\xc7\x8c\x3d\x2a\x83\x06\x41\x9c\xc3\x71\ \x7b\x8c\xc9\x21\xb2\xd2\x3d\xfa\x46\x6b\xf5\x65\x71\xf0\x53\xc7\ \xe4\xe5\xe7\x9b\xff\xd3\x54\xee\xa3\xc9\xf4\xdb\xe3\x79\xf5\xc4\ \x4e\x3b\xa0\x3c\x32\x4c\x7f\x9f\x8d\x22\x04\xa9\x84\x04\x41\x2b\ \x84\xb6\x2b\xd0\x49\x19\x2f\x64\x78\x62\x7a\x07\xef\x98\x2c\xe0\ \x27\x60\x99\x59\xa6\x27\xca\x8f\xa9\xb1\xfb\xa3\x7b\x35\xb7\x00\ \x93\x5f\xb9\xfe\x54\xec\xf8\x9f\x2b\x17\xfb\xd8\xfb\xf0\x0c\xa1\ \xb0\xa9\xae\x87\x6c\x3a\x11\x5e\xa4\xe0\x85\x50\x6f\xc3\x5a\x17\ \x4c\x53\x67\x62\xc8\x64\x74\xd0\xa4\xbc\x23\x43\x20\x0d\xda\xbd\ \x80\x7c\x36\x4b\xa5\xd0\xff\x11\x31\xf5\xcc\x27\xb7\x01\xa2\xc6\ \xd2\x17\x33\xce\x02\xd9\x2c\x04\xf9\x5d\x2c\xbb\x39\xce\xdf\xec\ \x72\xa3\x91\xd2\x70\x61\xa1\x05\xaf\xdf\x86\xa5\x4e\x8a\xae\x09\ \xd6\x9d\x98\xb5\x4e\x84\x4c\x24\x1d\x3f\x62\xb5\x1b\x22\x54\x85\ \xd1\x4a\x89\x8c\x65\x7e\x5e\xec\x3d\xaa\x6c\xdd\xc1\x3b\xbf\x71\ \x75\x8f\x74\x1b\x4f\xd7\xda\x37\xf9\xcf\xd8\x28\xf6\x43\x63\x64\ \x95\x3c\x71\x68\xb1\xe2\xa8\x14\xf3\x92\x7a\x57\xe0\x27\xb0\xbf\ \x0c\xff\xae\xf6\x40\x26\x90\x46\x2c\xac\x75\x50\x55\x81\x95\x35\ \x81\x10\x55\xd3\x18\x29\x15\x0f\x2e\xac\x34\xde\x0b\xbc\xaa\x01\ \xcc\x2f\x36\xde\x83\xd3\x36\x4d\x2d\x62\x69\xf1\x16\x7d\x76\x8e\ \xf2\x80\x85\x9d\x31\xf1\xa5\x20\x15\x92\x7c\x16\x66\x27\x52\x7e\ \xf2\xb7\x26\xcd\x96\x83\xeb\x39\xc8\x34\xa2\x92\x83\xa1\xac\x82\ \xaf\x4b\xbc\x20\x46\x4d\x52\x76\x8e\x14\x58\xa8\x35\x9f\xdc\x02\ \x84\xae\xbb\x5f\x49\x02\x54\x19\xd3\xea\xba\xcc\x2d\xae\xd3\x68\ \x66\xd8\x33\x5e\x60\x78\xd0\x22\x44\xb0\x77\x50\xf2\xdb\x9a\xc7\ \xa6\xe3\xb1\xd6\xec\xe2\x38\x2e\x41\x14\x62\x0e\x09\xc6\xfa\x52\ \xc6\x8b\x79\x2c\xa9\xa0\xc5\x19\x96\x97\x97\x40\x88\x7d\x5b\x2b\ \x8a\xa3\x60\x48\x09\x23\x54\x2d\xc2\xef\x76\x68\x9b\xeb\xf8\x3d\ \x0b\x57\x98\xec\x2c\xa8\x88\x44\xc5\xf1\x53\x6c\x11\x92\x51\x23\ \x7a\x7e\x8f\x5e\xcf\xc3\xf5\x3c\x56\x64\xc4\x64\x7f\x96\xa3\x8f\ \x4f\x32\xa0\x4b\xfe\x7e\xe1\x0a\xf3\x61\x82\xa6\x19\x03\x5b\x80\ \x28\x0a\x23\x2d\x89\x88\x64\x84\x96\x86\x04\xb1\x87\xa2\xc4\xe4\ \x94\x36\x25\xd3\xe0\xa5\x6b\x31\xa3\x7d\x2a\x33\x65\x03\x55\xc4\ \x68\x9a\xc0\x4f\x63\x0c\xc5\x47\x23\xe6\x7d\x8f\xee\xa5\x94\x53\ \xd9\xd8\xd8\xc0\x0f\x7c\x12\x09\xa9\x6a\xc6\x5b\x80\xd4\xed\x54\ \xe3\x54\x41\xc8\x90\xd4\xef\x60\x09\x9f\x91\x3e\x8b\x23\xd3\x16\ \xdf\xf9\x43\x15\x3d\x4e\x98\x2a\x65\xf8\xd2\xb1\x51\x4e\xce\x0e\ \x71\xad\xa8\x73\xee\x6a\x80\x1e\x45\x9c\x38\x58\xe2\xdc\x85\x39\ \x44\xe2\x62\xc9\x80\xc5\x95\x35\xba\x6e\x40\xaa\x18\x2b\x5b\x80\ \x99\xa9\xbe\x37\xe6\xae\xaf\x92\xb5\x0d\x1e\x2a\x65\x98\x1a\xcf\ \xf0\xf8\x23\x05\x7e\xf8\x6a\x95\xdb\xf5\x80\x9c\xef\x51\xb1\x4b\ \x04\x91\xe4\xe4\xa1\x61\x0e\x8d\xd9\x0c\x67\x02\x9c\x8e\xc9\xef\ \xce\x5d\xa4\x5e\xaf\xa1\x27\x1e\x5a\xe2\x93\x20\x69\xb9\x09\x28\ \xfa\xc5\xad\x77\xf0\xd7\xef\x9e\xfc\x67\xb9\x90\xa9\x4e\x94\x06\ \x78\x66\x76\x82\x0f\x1c\x28\x71\xb3\x5a\xc7\xef\x6c\xa2\x45\x3e\ \x83\x59\xd8\x5f\xd1\x28\xe5\x04\xb6\xa1\x90\x51\x63\x88\x5c\xce\ \x5f\x9a\x63\xa9\xba\x40\xb3\xbe\x42\xa7\xd5\x64\xa3\xe3\xd0\xf3\ \x63\x3a\x7e\xea\x08\xa1\xfc\x69\xcb\xc1\xa0\x6d\x38\x9f\x3e\x7e\ \xe8\xcc\xbf\xae\xdf\x79\xee\xf8\xe1\x47\x70\xbd\x1e\xfb\x47\x74\ \xa2\x9e\x60\xbd\x07\x51\x90\x20\xfc\x4d\x2e\xcc\x29\xd4\xd7\x73\ \xc4\x51\x44\xd8\xd9\x40\x78\x4d\xd4\x60\x83\xbc\x16\x93\xa4\x02\ \xa1\xe9\x38\xa1\xc0\x57\x72\x2f\xca\xd7\xbf\xbf\x70\x5f\xd8\x3d\ \xfb\xe1\xc3\xa7\xde\x9c\x5f\xf8\xd8\x2f\xff\xfc\x8f\xf1\x24\x4a\ \xc8\x68\x0a\x03\x69\x82\x1b\x44\x98\x6a\x0e\x9d\x88\x3b\x77\x57\ \x58\xaa\x26\xec\x1e\x2f\xa2\xcb\x80\xbc\x1e\xb3\xa7\x3c\x40\x9c\ \x42\x75\xdd\xc5\x0d\xc1\xc5\x6a\xb1\xeb\xc8\x37\xb7\xa5\xe9\x44\ \x31\xbf\x6c\x57\x66\xbe\xfc\xd3\x17\x7f\xfc\x33\x12\x4f\xd9\x5d\ \x1e\x62\xa2\x32\x4c\x3e\x3f\x48\xff\x50\x81\x9d\xc5\x21\x0c\x55\ \xa1\xbc\xc3\xe6\xf2\xdc\x02\x96\x96\x63\xf7\xd8\x18\xf3\x49\x82\ \xef\xfb\xe4\xb3\x92\x9a\x1b\x12\x15\x0f\x3d\x27\x5f\xf8\xe0\x8d\ \x6d\x59\x94\xfb\xc2\x15\xed\x6c\x6d\xe8\xec\xc6\xd0\xbb\xbf\xb7\ \xb2\xbc\xca\xfc\x8d\x39\x6e\x2f\xae\x51\x6f\x29\x74\x9d\x0c\xa6\ \x59\x64\xb8\x38\x81\xd4\x87\x29\x94\x67\xf0\x44\x05\xbb\xb0\x0f\ \x2b\x3f\xc1\xa6\x2b\xa9\x3b\x09\xa1\x35\xf9\x3c\x83\x7b\xcf\x88\ \xcf\x5c\x56\xb6\x39\x70\xfd\x44\xba\x7e\xcf\x60\x64\xf6\x2f\x1c\ \x34\xf6\xad\xdf\xf8\xd5\x71\xb5\xba\xa6\xf5\x92\x29\x5a\xa9\x8d\ \xa7\xf5\x33\xb0\xa3\x1f\xdd\x84\x30\xc8\xd3\x69\xeb\x78\x1d\x8f\ \xd5\x0e\xdc\xed\xd9\xb2\x61\x4c\xbe\xc2\xe0\xf4\x19\xb2\xa6\x71\ \x6f\x09\xbc\x5d\x38\x8a\x90\x80\x8f\x8c\x5b\x54\x1e\x7d\x2d\x1a\ \x98\xd0\x97\x97\x2e\xce\xb6\xd6\xea\x45\xbb\x7d\x51\x5d\xaa\x79\ \x18\xd9\x61\x62\x09\x9a\xa5\x92\xc4\xeb\xf8\x7e\x2d\x5d\xed\x19\ \x4d\x3f\x7b\xf8\x12\x66\xee\xf7\x64\x8c\x06\xaa\x0c\xd1\xdf\xae\ \xc9\xfb\x2a\x53\x7c\xf6\x92\x41\xa2\x14\x81\x69\x84\x72\x80\x54\ \x99\x21\x70\x76\xe1\x6e\x96\xe8\x75\xfa\x4c\x55\x18\x71\x22\x48\ \xcd\x6c\x28\x8c\x4c\x47\xd1\xed\x7a\xa2\xa8\xb7\xa4\x50\xae\xa1\ \xc8\xcb\x18\xca\x4d\x12\xb5\x29\x4f\x1f\x88\xb6\x3b\x00\xa8\x16\ \x22\xc6\xd6\x9a\xa0\xbc\x89\x46\x9b\x24\xad\x62\x65\x46\x31\x47\ \x0b\x0c\x56\xf2\x01\xd2\x44\x20\x41\xfa\x12\xd1\x91\x82\x86\x54\ \xc4\x0a\x0a\x55\xd2\xa4\x86\x2a\x5b\xbc\x32\x1e\xdf\x2b\xb9\xad\ \xf4\xc5\xd3\x9b\x42\xec\xab\xab\xb2\x1a\x18\x58\xbe\x8d\xae\xda\ \xe8\x8a\x25\x14\xc5\x20\x15\x1a\x02\x29\x45\x1a\x93\xa4\x01\x51\ \xea\x11\xc5\x3d\x91\xc8\x9e\xcc\xf4\x05\xf2\x85\xfd\xdb\x7e\x15\ \xff\x05\x67\x00\x22\x69\xa7\xb6\x84\xd9\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x5c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x00\x48\x00\x00\ \x00\x48\x00\x46\xc9\x6b\x3e\x00\x00\x00\x09\x76\x70\x41\x67\x00\ \x00\x00\x18\x00\x00\x00\x18\x00\x78\x4c\xa5\xa6\x00\x00\x03\x8d\ \x49\x44\x41\x54\x48\xc7\xa5\x96\xdd\x6b\x5c\x55\x14\xc5\x7f\xe7\ \xce\xbd\x93\x99\x49\x9b\xda\x6a\xad\x58\x69\x6b\x4a\xa6\x26\xd6\ \xfa\x01\x69\x91\x82\xf8\xe6\x5f\x60\x21\x4f\x3e\x54\x5f\xa4\xe0\ \x43\xf1\x0f\x28\xf8\xd2\x57\x21\x20\x08\x0a\x05\x7d\xac\xf8\xa4\ \x20\x14\xc4\x22\x41\xe8\x53\x8b\x29\x93\xd8\xd6\xf4\x6b\x62\x63\ \x3b\x93\x4c\xe6\xe3\x9e\xb3\xf7\xf6\x61\x66\xda\x99\x64\xea\x0c\ \xf4\xc0\xe1\x5e\x0e\x97\xb5\xf6\x5e\x6b\xed\xc3\x75\x66\xc6\xb3\ \xac\xcb\x97\x2f\xc7\x49\x92\x8c\x3b\xe7\xc6\x9d\x73\xfb\x77\xee\ \xd8\x51\x74\x51\xe6\x68\x8b\xe4\x8d\xa5\x1b\x37\x2e\xc5\x23\x82\ \xbc\x90\xcb\xe5\x5e\xc9\xe5\x72\xcf\x45\x51\xb4\x27\x8a\xa2\xc3\ \xf9\x7c\x7e\xa6\x50\x28\x1c\x39\x76\xec\xcd\xbd\xd9\x6c\xb2\x33\ \x1b\x67\x26\xbc\xba\x7c\x3d\x40\x6a\x8e\x24\xe3\x28\x57\x37\xee\ \x0d\x25\x98\x9b\x9b\x7b\x6b\x7e\x7e\xfe\xe7\xdd\xbb\x77\xef\x73\ \xce\x0d\xfc\x46\xcd\x78\x54\x17\x5a\x0a\xd9\x24\xc3\x58\xc6\xe1\ \x43\x40\xd5\x5c\x34\x8c\xa0\x5e\xaf\x1f\x9e\x98\x98\x78\x0c\x3e\ \x48\xd2\x72\xa5\xc9\x7a\x80\x38\x1b\xa3\x38\x52\x81\x20\x20\x0a\ \x43\x09\x44\xc4\x54\xb5\x0f\xdc\xcc\x30\x33\x54\x95\xb4\x59\xe7\ \x61\xb5\x46\x3e\xc9\x90\x0a\x78\x85\xa0\x90\x6a\xfb\x7d\x28\x41\ \x17\x6c\xd0\x6a\x36\x1a\xd4\xeb\x0d\xfe\x29\xdf\x47\x14\xbc\xb4\ \x77\xbb\x03\x23\x18\x0c\xf5\xa0\x5b\xfd\xa0\x15\x44\x9e\x14\x42\ \x1b\x38\x72\xed\xa2\x44\x20\x84\x11\x09\x86\x47\xd9\x50\xb3\xb6\ \x24\x0e\x54\x04\x55\x45\x4c\x47\x27\xe8\x95\x6a\x6b\x9a\x0c\x10\ \x35\x44\x0c\x01\x24\x84\x8e\x7f\x36\x9c\x60\x50\xf5\x5b\xcd\x36\ \xb3\x8e\x07\x86\x4a\xc0\xcc\x70\x40\xc3\x8f\xd0\x41\x2f\x88\x99\ \xf1\xd4\x59\x50\xa5\x95\x0a\xaa\x42\xc6\x41\x33\x18\x95\x86\x0c\ \x27\x90\x1e\x23\xb7\x76\xf4\x98\x18\x08\xa2\xb4\x52\x8f\x03\x88\ \xe0\x51\x5d\x69\xb4\x46\x23\xd8\x36\x07\x5b\xbb\x50\x55\xbc\x17\ \x52\xaf\x64\x22\x68\x7a\x63\xad\xe6\x11\x1d\x41\xa2\x93\x27\x4f\ \x16\xe2\x38\xde\x56\x79\xf7\x29\x12\x08\x3e\xc5\xab\xe1\x45\x51\ \x85\xd5\x5a\x20\xf5\x8a\xaa\xfe\xff\xa0\x7d\x72\xfa\xf4\xbb\xe7\ \xce\x9d\xbb\x10\xc7\x71\x5f\x9a\xba\xe0\xde\x7b\x1a\xad\x94\x99\ \x57\x5f\x66\x69\x69\x99\x3d\xf9\x0c\xf7\xab\x29\xd5\xba\xc7\x54\ \x50\x19\x20\xd1\x74\xb1\x18\x01\x99\xc5\x52\xc9\x6f\xac\xaf\xbf\ \x38\x36\x36\x16\x79\xef\xfb\xe4\x90\x4e\xce\x93\x24\x21\x4d\x53\ \x12\x84\x44\x1b\x3c\xa8\x79\x2a\x75\x4f\x04\x04\x0c\x91\x1e\x89\ \xa6\x8b\xc5\x2c\x90\xa3\x3d\x7c\xc9\xe4\xc1\x83\x72\xfc\xc4\x89\ \x9d\xaa\x4a\x08\xe1\xf1\xdd\xd3\x2b\x55\x1c\xc7\x44\x51\x84\x8a\ \xe0\xc5\xb0\x20\x98\x28\x01\xeb\xf8\xd7\xef\x81\x01\x05\x60\x02\ \xc8\x00\xde\xcc\xc6\xbd\xf7\x84\xce\xe0\x0c\x4a\xd2\x93\x33\x50\ \xb5\xf6\xf5\x61\x86\x73\x60\xbd\x1e\x2c\x96\x4a\x1e\x78\x00\xa4\ \x1d\x92\x5d\x66\x56\xd8\x3a\x07\x5b\xc1\xfb\xce\xcd\x88\x4c\x89\ \x30\x9a\x2d\x61\xa3\xe1\xa5\xcf\x83\xc5\x52\x49\xa6\x8b\xc5\x87\ \xc0\xa1\x76\x9a\x29\x74\x63\x39\x28\x45\x38\x47\x3e\x9f\xc7\x59\ \x82\x73\x4e\xd7\xeb\xbe\x7a\xed\x4e\x6d\x65\x6d\x53\x1e\xde\xab\ \xa4\x7f\xb4\xc2\xf3\xdf\x0f\x8a\x69\x0a\x34\x80\x7d\x51\x14\xe5\ \x73\xb9\x1c\xde\xfb\x6d\x95\x97\xcb\x65\x54\xf5\xd6\xb5\xab\x57\ \x7f\xfa\xed\xd2\x2f\x0b\x57\xaa\xbb\x26\x3f\x98\x3b\xf3\xf6\xa5\ \xeb\xb5\x65\x70\x77\x92\x6c\xf2\xed\xcd\xf3\xb3\x95\x6d\x31\x5d\ \x2c\x95\x9a\xc0\x95\x38\x8e\xff\xba\xbd\xb2\x72\xeb\x87\x8b\x17\ \x7f\x15\x55\x59\x5d\x5d\xd5\xbb\x77\xef\xae\x2e\x2f\x2f\xff\xb8\ \xb0\xb0\xf0\xd9\x81\x03\x07\x8e\xff\xbb\xb6\x76\xe4\xc3\x53\xa7\ \x3e\xfd\xf2\xab\xaf\x2f\xac\xdc\x5e\xf9\xbb\x29\x99\x82\xdb\xb8\ \x7f\xbb\xf0\xfb\x17\xdf\xdc\x3c\x3f\x5b\xd9\xa6\x61\xef\x7e\x6d\ \x6a\xca\x4d\x4d\x4e\x16\x5e\xda\xbb\x37\xfa\xfc\xec\xd9\xf7\x37\ \x37\x37\x5f\xaf\x54\x2a\x85\xa7\x7d\x7f\xe8\xbd\xb9\x8f\xf7\x7f\ \xf4\xdd\x99\xe2\xd1\xd9\xb1\xbe\xbb\xeb\x59\x7f\x5b\xba\x6b\xe6\ \xe8\x3b\xe3\x16\x9a\xe9\xe2\xf5\x3f\x7d\xef\xf9\x7f\xa2\xf9\xa9\ \x63\x02\x48\xc8\x7a\x00\x00\x00\x25\x74\x45\x58\x74\x63\x72\x65\ \x61\x74\x65\x2d\x64\x61\x74\x65\x00\x32\x30\x30\x39\x2d\x31\x31\ \x2d\x32\x38\x54\x31\x37\x3a\x31\x38\x3a\x32\x38\x2d\x30\x37\x3a\ \x30\x30\x31\x91\xb2\x2c\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\ \x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\x31\x30\x2d\x30\ \x32\x2d\x32\x30\x54\x32\x33\x3a\x32\x36\x3a\x31\x35\x2d\x30\x37\ \x3a\x30\x30\x06\x3b\x5c\x81\x00\x00\x00\x25\x74\x45\x58\x74\x64\ \x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x30\x2d\ \x30\x31\x2d\x31\x31\x54\x30\x38\x3a\x34\x35\x3a\x31\x37\x2d\x30\ \x37\x3a\x30\x30\xbb\x78\xb3\xe6\x00\x00\x00\x35\x74\x45\x58\x74\ \x4c\x69\x63\x65\x6e\x73\x65\x00\x68\x74\x74\x70\x3a\x2f\x2f\x63\ \x72\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\ \x72\x67\x2f\x6c\x69\x63\x65\x6e\x73\x65\x73\x2f\x4c\x47\x50\x4c\ \x2f\x32\x2e\x31\x2f\x3b\xc1\xb4\x18\x00\x00\x00\x25\x74\x45\x58\ \x74\x6d\x6f\x64\x69\x66\x79\x2d\x64\x61\x74\x65\x00\x32\x30\x30\ \x39\x2d\x31\x31\x2d\x32\x38\x54\x31\x34\x3a\x33\x32\x3a\x31\x36\ \x2d\x30\x37\x3a\x30\x30\x42\x14\xfd\x60\x00\x00\x00\x16\x74\x45\ \x58\x74\x53\x6f\x75\x72\x63\x65\x00\x43\x72\x79\x73\x74\x61\x6c\ \x20\x50\x72\x6f\x6a\x65\x63\x74\xeb\xe3\xe4\x8b\x00\x00\x00\x27\ \x74\x45\x58\x74\x53\x6f\x75\x72\x63\x65\x5f\x55\x52\x4c\x00\x68\ \x74\x74\x70\x3a\x2f\x2f\x65\x76\x65\x72\x61\x6c\x64\x6f\x2e\x63\ \x6f\x6d\x2f\x63\x72\x79\x73\x74\x61\x6c\x2f\xa5\x91\x93\x5b\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x1e\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x05\xe5\x49\x44\x41\x54\x48\x89\x7d\x95\x79\x8c\x95\x57\ \x15\xc0\x7f\xf7\x7e\xcb\xdb\xbe\xb7\xcd\xbc\x59\x58\x86\x61\x86\ \xad\x2d\x2a\xce\xa0\x6c\xda\x04\x83\xad\x42\x2a\x89\x10\xb1\xfe\ \xa3\xd5\xd4\xa4\x88\xb5\x49\xa3\x12\x2d\x18\x4b\x6c\x35\x06\xd2\ \x58\x11\x15\x35\x6d\x43\x34\x25\x25\x69\x4c\x4d\x69\x49\x6a\xec\ \x46\x29\x52\x53\x36\xa1\xc8\xd0\xb0\x0c\x8f\x99\x79\xef\xcd\x9b\ \xb7\xbf\xf7\x2d\xc7\x3f\x1e\xd0\xb4\x50\x4e\x72\x92\x7b\x73\xef\ \x3d\xbf\x73\xce\x3d\xf7\x5c\x25\x22\xdc\x4a\x94\x52\x29\x12\x2c\ \x0a\x65\xd4\xfc\xb0\x63\x65\x24\x90\xa0\x51\x76\xc7\x5b\x39\x4e\ \x51\xe5\xb8\x88\x54\x6f\x75\xde\xfc\x58\xc3\x21\xb5\xb0\x77\x79\ \x7c\xd3\xea\x1d\x4b\xef\xb9\x63\xf9\xed\x7d\xbd\x7d\xbd\x44\x62\ \x51\x44\xa0\x5a\x2a\x33\x7a\x6e\x54\x8e\xbf\x76\x62\x24\x3d\x1c\ \xde\x57\x3c\xda\xfc\x83\xf8\x72\xfe\xa6\x76\x3e\x1a\x81\x52\xca\ \x4e\x7e\xca\xfe\xc9\xca\x47\x86\x7f\xbc\x64\xed\xb2\x68\x3a\xdc\ \x03\x18\x04\x08\x82\x00\x0a\x03\x85\x46\x13\xe0\x72\x65\xf2\x22\ \xaf\xef\x79\xad\x70\x70\xfb\xc9\xad\x8d\x0b\xc1\xae\x5b\x02\x94\ \x52\x89\xd9\xeb\x53\x7b\xee\x7a\x62\xc5\xda\xae\xbe\x3e\x9a\x04\ \x04\x12\xb4\xd7\x00\x85\xc6\x17\x8f\xba\x5b\x27\x64\x85\xb0\xb4\ \x8d\x89\x81\x01\xbc\xff\x9f\xd3\x1c\xd8\xf4\xd6\xee\xfc\xa1\xe6\ \x26\x11\xf1\x6e\x00\x28\xa5\xec\xd9\x5f\x4b\x3f\xb7\xea\x77\x4b\ \xd6\xea\x44\x9c\x56\xc3\x43\xa1\x40\x81\x52\x0a\x00\x0f\x8f\xf0\ \x39\x87\x2d\x73\x1e\x27\x1f\x1e\x63\x47\x7d\x1b\x36\x21\x04\x08\ \x45\x2d\xa6\xce\x64\x39\xf0\xed\xb7\x7f\x9f\x3f\xd4\xf8\xde\x0d\ \x77\xd0\xf9\x99\xc8\xd6\xc5\x8f\xce\x5b\x5b\xf4\x5c\xdc\xcb\x13\ \x68\xad\xaf\x81\x01\xd0\x5a\x33\xe9\x16\x58\x5a\xfa\x02\xb3\x9c\ \x7e\x9a\xad\x3a\xf9\x42\x9e\xa8\x8e\x21\x22\x48\x41\xb0\xbb\x43\ \x7c\xf6\xf1\xf9\x1b\x23\x7d\xc6\xbb\xf5\x8b\xfe\xee\xeb\x00\xc3\ \xd1\x43\x2b\xfe\xd8\xff\xf0\x94\xd9\xa0\x3e\x5a\x43\x6b\x8d\x52\ \xea\x03\xd5\x8a\xaa\x5b\x21\x39\xd9\xc9\xf0\xb4\xc5\x20\xf0\xfc\ \xd8\x5e\x8a\x93\x45\x1a\xaa\xc9\xb5\x2c\x04\x05\x21\x3c\xcb\x64\ \xee\xfd\x99\xad\xca\x54\x2f\x88\x27\x59\x13\x60\xfa\x4a\x67\x93\ \x7f\x5b\x2b\x7a\xe1\xdc\x18\x0a\x8d\xa1\x35\xfa\xaa\x2a\xad\x68\ \xb9\x2d\x86\x9b\x4b\xf9\xf5\xd2\x9d\x4c\xcf\x4c\x47\x10\x4e\x16\ \x8e\x31\x3e\x31\x4e\xc4\x88\x62\x28\x83\x20\x08\x08\x44\x60\x52\ \x88\xde\x69\xcc\x4c\x2e\xb4\xee\x03\x7e\x69\x2a\x5b\x75\x2f\x7c\ \x2c\xb5\xfa\x42\x76\x8c\x5a\x0e\x4c\xdb\xc0\x30\x34\xda\x30\xda\ \x10\x53\xe1\x4e\xf9\x3c\xb0\xec\x21\x8e\x8f\x1f\xa5\x33\xd9\x49\ \xc8\x0a\x71\x1b\x9f\x24\x54\x73\xe8\x1d\xec\x66\xd7\xe9\x27\x08\ \xa9\x30\xbe\xef\xe3\x7b\x01\xe1\x24\x24\x97\x9b\x1b\x94\x56\xdb\ \x8d\xc8\x0c\xeb\xce\x8e\x35\xe6\xc6\x89\x91\x06\x7e\x51\xf0\xeb\ \x3e\x6e\xcd\xc3\x6d\xb8\xb4\xea\x2d\x5a\xf5\x16\x15\xaf\x45\xb1\ \x92\x63\xfd\xdc\xaf\xd3\x93\xea\x01\xa0\xcf\xec\x27\xe7\x8e\xf3\ \xec\x99\x3d\x4c\x14\x0a\x78\x15\x17\x77\xca\xc3\x2b\xfa\xb4\xf2\ \x3e\x4e\xdc\xea\x28\x1d\xf1\xf7\x99\xd1\x99\xe6\x02\xcf\xf3\xf1\ \x2e\xb5\x6f\x44\x87\x01\x1b\xb0\x40\x2c\xc0\x10\x0c\x0b\x5e\x18\ \x7d\x91\x9f\x0e\x6d\x03\xe0\xd5\x8b\xaf\xf0\xc8\xab\x0f\xf3\x4e\ \xf6\x04\xe2\x05\x84\x04\xc4\x05\x69\x81\x34\xc1\xf3\x40\xa6\x89\ \x6d\x67\x8c\x01\xd3\x4a\x1a\x5d\x5e\xce\x27\xc8\x83\x4e\x82\xe8\ \x76\xcd\x8b\x00\x01\x28\x13\xaa\x65\xf8\xe1\xa2\x87\xf8\xf4\xec\ \x21\x00\xfe\x7e\xea\x79\xde\x3c\x71\x8c\x98\x03\x3a\x80\xc0\x03\ \xdc\x36\x84\x66\x1b\x14\x78\x82\xe1\xa8\x1e\x53\x99\xe0\x67\xc1\ \x3d\x0a\x46\x06\x74\x06\x54\x12\xb4\x03\x2a\x02\xae\x0d\x5d\x41\ \x92\x8d\x9f\xff\xfe\xf5\x07\xb9\xfd\xee\x27\x31\x03\x83\xdf\xbc\ \xfe\x24\x96\x80\xf2\xda\x9e\x4b\x1d\xa4\x04\x7e\x11\x24\xda\x76\ \xce\x74\x1b\xc1\x44\x3c\x6d\xa0\x6c\x90\x0a\x04\x3e\x50\x82\x20\ \x02\xae\xd9\x9e\x7f\x65\xd5\x2a\x06\xa7\x0d\x72\x79\x72\x94\x43\ \x67\x0f\xd2\x1d\xef\xe1\xb1\x55\xdb\x49\x7a\x29\xb6\xec\xd9\x46\ \x44\xda\xc6\x83\x2a\x48\x19\x68\x80\x9e\xa7\xf1\x03\x7f\xcc\xac\ \xe5\xdd\xf7\x7a\xe2\x51\xac\x0c\x78\x0d\x50\x31\x70\x35\x04\x02\ \xcb\xe6\x0d\xb3\x6c\xc1\x0a\xb6\x6c\xf8\x39\x63\x53\x57\xd8\xf0\ \xdb\x75\xbc\xf9\xdf\xc3\xe0\xc2\xdf\x1e\xfc\x2b\x03\xc9\x39\x50\ \x07\x31\x00\x01\x65\x80\x84\xc0\x8c\x83\x11\xd3\xcd\x56\x39\x78\ \xdf\xac\xe5\xdd\x77\x94\x67\x8c\xc6\xe6\xa8\x19\xa5\x11\xa1\xa9\ \x60\xf3\xbd\x3f\x62\xf5\x92\x35\xc4\x22\x51\x26\x1b\x05\x9e\x39\ \xfc\x67\x76\xfd\x73\x27\x23\xb9\x4b\x44\xbb\xa0\x56\x02\x3f\xf0\ \x99\x68\x8e\x43\x04\x94\xd5\xce\x3d\x06\x28\x81\xe8\x2c\x8d\x57\ \x95\x93\x5e\x3d\x78\xcf\x94\xf3\x32\xd1\xff\x9d\xd4\x8b\x9d\x8b\ \x22\xdf\x2d\x8d\xd7\x70\x2c\x9b\x2f\x0e\xdd\xc5\xce\x7f\xed\x60\ \xff\xc9\xfd\x54\x3d\x1f\x34\xd8\x11\x70\xd2\x1f\x74\xc9\x83\xff\ \x7b\x83\x81\xd9\x83\x60\x83\x0a\x01\x1a\x04\xd0\x1a\x52\xf3\x6c\ \x26\xdf\xf0\x9f\x93\x4b\xe2\x69\x80\xcb\x47\x2a\xbb\x62\xd1\x48\ \x35\x71\x3b\xd8\x31\x8b\x5f\xbd\xf4\x0b\xf6\xbd\xfb\x0f\x7c\xdb\ \x27\x96\x06\xa7\x03\xec\x18\x10\xbe\xaa\x11\x98\x74\xf3\x7c\x73\ \xf9\xb7\xb8\xef\xee\x6f\x20\xe1\x76\x6a\xb0\x21\xb1\x40\x63\xf8\ \xd6\xc5\xc2\x48\xf3\xe9\x0f\x75\xd3\xde\x7b\x9d\x47\x67\xac\x37\ \x7f\x36\x72\x78\x8a\x4a\x01\xc2\xc9\xab\x9e\x59\x57\x43\xbf\x36\ \xa6\x5d\x8e\xb6\x6f\xd3\x1f\x1f\x20\x65\xa7\xf9\xf7\xd9\xb7\xf1\ \xab\x42\x28\x01\x33\xe7\x3b\x9c\xdf\xdb\xba\xbf\x74\xa0\xf9\x97\ \x0f\xb7\xeb\x3b\x94\x35\x78\x4f\x6a\x6f\xf2\x73\xfe\x57\xcf\x1f\ \x2b\xd3\x28\x83\x0e\xb5\x4b\x55\xa7\x15\x76\xc2\xc2\x0a\xb5\x09\ \x5e\xcb\xa3\x51\x6e\xd1\x98\x10\x82\x1a\x84\x02\x08\xc5\x61\xfa\ \x9c\x18\x13\x2f\x07\x3b\xaf\x3c\x55\x7b\xf0\xe6\x1f\xce\x22\xe5\ \x0c\xac\x49\x3d\x93\x59\x29\xeb\xb2\xa3\x53\x94\x72\xa0\xd2\x9a\ \x44\xc6\x21\xee\xc4\x09\x85\xc3\x28\xa0\xd9\x6a\x51\xa9\x94\x29\ \x15\xca\xf8\x05\x9f\x44\x5a\x91\x49\xc5\xc9\xbe\xec\xed\x1a\x7b\ \xab\xf6\x03\x39\x26\xfe\x4d\x01\x00\x6a\xb1\xb2\x32\x43\xb1\xcd\ \xfd\x5f\x0e\x6f\xf6\x7b\xeb\x8e\x6f\x58\xc4\xcc\x4e\x9c\x68\x8a\ \x48\x24\x8a\x52\x8a\x46\xb3\x41\xb5\x56\xa4\xea\xe6\x91\x46\x03\ \xef\x9c\x3d\x7e\xe1\xa5\xfa\x96\xd2\xde\xc6\x9f\xf8\x88\xdc\x00\ \xb8\x26\xe6\x97\xcc\x05\x3d\xc3\xd1\x07\xa6\x0d\x47\xd7\x75\xcf\ \x4d\xcf\xea\xe8\xea\xc0\x71\x12\x28\xa0\x5c\x2e\x93\xbb\x92\x0b\ \xb2\xa7\x0b\x67\xb3\x47\xaa\xcf\xe6\x4e\xd4\x77\x07\xaf\x04\xa3\ \x37\xb3\xf3\xb1\x80\xeb\x1b\x56\xab\x84\xd5\x61\x7c\x22\xd2\x69\ \xce\xb5\xa2\x46\x8f\x88\xf8\xad\x8a\x9f\xad\x17\xdc\x33\x7e\x51\ \x4e\xc9\x7e\xa9\xdd\xea\xfc\xff\x01\x5c\xbf\xb2\x3e\xdb\x55\x2a\ \x23\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x40\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd6\x00\x00\ \x0d\xd6\x01\x90\x6f\x79\x9c\x00\x00\x00\x09\x76\x70\x41\x67\x00\ \x00\x00\x18\x00\x00\x00\x18\x00\x78\x4c\xa5\xa6\x00\x00\x04\xba\ \x49\x44\x41\x54\x48\xc7\xb5\x95\x4b\x6c\x94\x55\x14\xc7\xff\xf7\ \x7e\x8f\xf9\xe6\xd1\xe9\x94\x67\xb1\x16\xb0\x50\xc2\x4b\x2c\x14\ \x52\x6b\x29\x3e\x16\x88\x71\xa7\x46\x13\xa2\x09\x22\x25\x28\x0b\ \x13\x5d\x90\x60\x22\x22\x89\x0b\x23\x0b\x59\x10\xc5\x47\x88\xd1\ \x44\x45\x37\xc6\x20\x68\x31\x8a\xd0\x54\x2a\xa5\x16\xdb\x69\x29\ \xb4\xa5\xef\xd2\xa1\x9d\x4e\x67\xbe\xc7\x7d\xba\xc0\x20\xaf\x42\ \x8a\xf1\x24\x77\x73\xff\xff\x9c\x5f\xce\x3d\xf7\x9e\x0b\xfc\xcf\ \x41\x6e\xab\x96\xd5\x00\xbe\xeb\x20\x14\x52\x20\x84\xa1\xe9\x93\ \x29\x03\x8c\xc9\x84\x68\xc5\xcb\x88\x98\x88\xcf\x9e\x5f\xf4\xa6\ \xd0\x48\x9b\xa6\xd1\x2f\x7a\x4f\x4d\x19\x40\x6f\xb5\x69\x97\xbd\ \x84\xdc\xf9\xae\xc8\xb2\x07\xcb\xde\xaa\xa8\x2e\xdf\x16\x8f\x47\ \x43\xb1\xbc\xe8\x5d\x1d\x91\x79\x53\x49\x4b\x5f\x00\x4b\x76\x38\ \x2b\x37\x3d\xfd\xc6\xfd\x95\xab\xb6\x8b\x80\x49\x2d\x04\x88\xbe\ \xab\xfc\xd7\xf7\x80\x2c\xda\x08\x7d\xae\xdd\x5e\xf6\xe2\xc6\x1d\ \x0f\xad\xaf\xda\x99\x28\x2a\x74\xc6\x06\x2e\xf1\xba\xda\x93\x07\ \x35\xa1\x9d\x5a\x2b\xaa\xb8\x14\x22\x08\x26\x02\xcf\x1f\x4a\xa7\ \x46\xdb\x73\xdd\x17\x3b\x31\xb3\xc4\x47\xd3\xbe\x3b\x00\x4a\x9e\ \x03\x3a\x9b\xcc\xd2\xe7\x37\xbf\xf6\xf0\x13\xd5\xbb\x66\xce\x2f\ \x8e\x04\x4a\x83\x4b\x85\x6c\xd6\x45\xc0\x04\x18\xe3\xe0\x3e\x03\ \xf7\x7c\x70\xd7\xe3\x6c\x3c\x73\x79\x7c\x78\xa4\x7e\xe0\x62\xdf\ \x81\x4b\xc7\xeb\x7f\xc2\xec\x59\x02\x5d\x87\x6e\xd1\xe4\xb9\xcf\ \x00\xdd\xc7\x8d\xb9\xcf\xd6\x6c\x7f\x64\xc3\xda\xdd\xc5\x0b\xe7\ \x47\x05\xa5\x50\x86\x09\x69\x98\x80\x6d\x43\x5b\x16\xb4\x61\x42\ \x52\x03\x82\x1a\x60\xc4\x30\x84\x69\xc7\xec\x68\x6c\x71\x22\x1e\ \x7b\x92\x4c\x4b\xa8\x4c\x53\xf2\x14\x4a\xab\x15\x52\xcd\xd7\x00\ \xca\xb7\x02\x6d\x8d\x74\xce\x53\x9b\xb6\x3c\xf6\x78\xd5\x3b\x73\ \x17\x95\xc4\xd3\x8a\x60\x54\x12\x8c\x2a\x82\xb4\x22\xc8\x49\x0d\ \x26\x35\xa4\x54\x50\x4a\x41\x08\x09\xc1\x25\x18\x13\x70\x7d\x0e\ \x4e\x0c\x27\x1e\x8b\x54\xf0\xa8\x73\x7e\xe1\x8a\x25\x2d\xc3\x62\ \x0e\x30\x7c\xe6\x4a\x93\x4d\xc7\x81\x58\xb3\xae\xe2\xbe\xe5\x8b\ \xde\x1e\x8b\xcf\xcc\x6f\xe9\x1e\x47\xd6\x30\xc1\xed\x10\xe0\x38\ \x80\x61\x00\x5c\x81\xf8\x0c\x16\x0b\x10\x95\x1c\x51\xa5\x40\x00\ \x68\x00\x1a\x04\x1e\x97\x90\x96\x93\x37\xe3\x9e\xc2\x6d\xcd\x47\ \x7f\xfd\x01\x33\xa6\x65\xae\x56\x40\x8a\x56\x43\xbb\xae\x67\xc5\ \xe3\x8b\x27\xc2\x79\xcb\x53\xc4\x22\x9c\x1a\xd0\x96\x05\x58\x26\ \x40\x29\xb4\x94\x90\x5c\xc0\x0f\x38\x26\x5c\x86\xf1\x6c\x00\xc1\ \x38\x0c\xa5\x20\x39\x87\x60\x02\xbe\x50\x70\x4c\x12\x77\x7d\xef\ \x30\x35\xcd\x41\xd1\xf3\xfb\x15\x80\xee\x6b\x40\xa8\xb4\xda\x4b\ \x9d\xbb\x50\x97\x1f\x0b\x2f\xc8\x9b\x35\x63\x49\x60\x85\x40\x28\ \x05\x08\xa0\x95\x02\x84\x84\xe6\x02\xe0\x1c\x9a\x73\x48\xc6\x91\ \x73\x03\x04\x3e\x83\xa1\x24\x14\x17\xe0\x42\xc2\xa6\x30\x45\x26\ \x73\xc4\x09\x87\xda\x73\x1d\xbf\xfd\xfb\xd0\x82\x93\x75\x88\xcc\ \x29\x1c\xea\xaa\x6b\x78\x95\x25\x5b\x8f\xe6\x73\x0f\x9a\x73\x28\ \x9f\x81\x04\x0c\x86\xe0\x30\xa4\x00\x91\x0a\xfa\x9f\x05\xa9\xe0\ \xfa\x1c\x63\xd9\x00\x5c\x28\x28\x0d\x28\xad\x09\xa5\x84\x5a\xa6\ \x71\xc3\x2d\xc2\x20\x78\x97\x87\xbc\xd5\xe5\x99\x54\xb2\xa3\x3e\ \x11\x0d\x95\x39\xd3\x0b\xe6\xf9\x8a\x60\x1a\xcb\x29\xbb\xa7\x7b\ \x38\x94\x49\x8f\x3b\x5e\x56\x3a\x92\x5b\x54\x2b\xca\x99\x84\x62\ \x0c\x32\x60\x90\x42\x82\x12\x02\x47\x0b\xd7\xbb\x9c\xfa\x88\x73\ \xd1\xe3\x5e\x38\x79\x2d\x00\x00\x86\x10\x74\x64\x90\xa8\xae\x1a\ \x4d\xfd\xd5\xd6\x90\x88\x3a\x6b\xec\x82\x44\x11\x19\x1b\xf3\xfb\ \x8f\xd6\x6e\xeb\x6f\x6c\xde\xe3\xf6\xf5\x7d\xa3\x52\x23\xbf\x84\ \x03\xd7\x8b\x3a\xd6\x02\x5f\xc2\x96\x8c\x43\x49\x09\x4a\x09\xa2\ \x2a\xe8\x1e\xed\xe9\xdd\x97\xf3\x79\x46\xf6\x35\xdc\x08\xb8\x02\ \xf1\x92\x63\x98\xbd\x61\xfd\xc8\xa5\xa6\xb3\x8d\x05\x51\xa7\x32\ \xcf\xb1\xa6\x8f\xf7\x0f\x7c\x60\x47\xc2\x7f\xa6\x6b\xf7\x0e\x7a\ \xc6\xbc\x96\x91\x23\x87\xbf\x8f\xdf\x5b\x64\x3b\xb1\xd8\x3a\x8f\ \x49\x02\x00\x21\x83\x20\xec\x67\x0f\xf7\x7e\x77\xe0\x73\x39\x6b\ \xa1\xc6\x60\xe3\x24\xc3\x4e\x35\xa2\xff\x8b\x2f\x51\xfc\x68\xd5\ \xe9\xc1\x33\xcd\xaf\x5c\x4e\xb6\xb5\x07\x8c\x93\xc0\x67\x00\x00\ \xd1\xf2\x19\x9c\xca\x6a\x9e\xea\x1b\x38\x64\x05\x6e\xca\x20\x04\ \x20\x04\x11\x48\x97\x4f\x64\xbe\x2d\xdf\xb2\x43\xc2\xe7\x93\x0f\ \x3b\x00\x80\x7b\x02\xc9\xf7\x43\xb0\xd2\xb5\x27\x46\x57\xd6\x6c\ \x85\x41\x87\xae\x95\x7d\xc6\xa1\x0c\xe2\x6b\xa5\x39\x08\x10\xa2\ \x04\x0e\x77\x7f\xee\x39\x7f\xe1\xd8\x50\x38\x06\xb4\x1e\xbc\x03\ \x00\x00\xc6\x8f\x81\x13\x02\x00\x37\x7d\x02\x4e\xd8\x81\x6d\xd0\ \x02\x50\x1a\x81\x06\x0a\x08\x1f\x96\xe9\xd1\xf7\x96\x56\xae\xc9\ \xd6\xef\xff\xf0\x3a\x2f\xc5\x5d\x44\x61\x51\x21\xc2\xb1\xe8\x32\ \x65\x58\xf9\x09\x43\xf9\x21\x37\xf3\x6e\xf2\xeb\x5d\xc7\x5b\x4e\ \x35\x01\x38\xfb\x1f\x01\xab\x6a\xd0\xfd\xd5\x4e\x9a\x97\xc8\x5f\ \x1b\xb3\xa9\x8e\x78\xe3\xfb\x86\xda\xda\xf6\x17\xaf\x7f\x5d\x4f\ \xfc\xf1\xf1\x4d\xf6\xa9\x03\x08\x01\x56\x6c\x9e\x6b\x42\x3d\x60\ \x4c\x8c\xed\x19\x68\x6d\xdd\xed\x14\x14\xf8\xbd\x3f\xee\xbd\xb5\ \x7d\xca\x80\xf2\xad\x20\x04\x25\xe1\x90\x5d\xea\xf0\xdc\x31\x4f\ \x12\xe1\x9d\xfe\x74\x52\xbb\x39\x85\xd4\x57\x43\x6b\x74\xba\x3e\ \xeb\x74\x61\x01\xa7\x0f\xdc\xd6\xfb\x37\x7e\xea\x6b\x03\xad\x34\ \x4a\xa0\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\ \x72\x65\x61\x74\x65\x00\x32\x30\x31\x30\x2d\x30\x35\x2d\x32\x34\ \x54\x30\x37\x3a\x34\x32\x3a\x32\x33\x2d\x30\x36\x3a\x30\x30\x0d\ \x5e\x0a\xf3\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\ \x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x30\x2d\x30\x35\x2d\x32\ \x34\x54\x30\x37\x3a\x34\x32\x3a\x32\x33\x2d\x30\x36\x3a\x30\x30\ \x7c\x03\xb2\x4f\x00\x00\x00\x35\x74\x45\x58\x74\x4c\x69\x63\x65\ \x6e\x73\x65\x00\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\x65\x61\x74\ \x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\x67\x2f\x6c\ \x69\x63\x65\x6e\x73\x65\x73\x2f\x4c\x47\x50\x4c\x2f\x32\x2e\x31\ \x2f\x3b\xc1\xb4\x18\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x00\x0f\x74\x45\ \x58\x74\x53\x6f\x75\x72\x63\x65\x00\x6e\x75\x6f\x76\x65\x58\x54\ \x32\xea\x20\x36\xdc\x00\x00\x00\x22\x74\x45\x58\x74\x53\x6f\x75\ \x72\x63\x65\x5f\x55\x52\x4c\x00\x68\x74\x74\x70\x3a\x2f\x2f\x6e\ \x75\x6f\x76\x65\x78\x74\x2e\x70\x77\x73\x70\x2e\x6e\x65\x74\x91\ \x89\xc7\x2d\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\x6b\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x05\x32\x49\x44\x41\x54\x48\x89\xa5\xd5\x5b\x6c\x5c\x47\ \x19\xc0\xf1\xff\x9c\xeb\xde\xec\xf5\xda\xeb\x6b\xb0\x1d\x27\xa5\ \x8d\x63\x50\x31\x91\x45\x23\x20\x28\x08\xa5\x11\x94\xaa\x37\xd2\ \x42\x2b\x55\x0a\xbc\xa5\x2f\xb4\x7d\xa0\x42\x44\xa8\x6a\xe1\x21\ \xea\x03\x12\x3c\x80\x40\x15\x42\x24\x24\x44\x75\x89\xa0\x6a\x00\ \xb5\xe1\xa1\x22\x6a\x8c\xa2\x16\x17\xc7\x6a\x4b\xa8\x5d\xaf\xed\ \xc4\xde\x5d\x9f\xdd\xb3\x7b\x2e\x73\xe1\x21\xe0\x44\x90\x80\x94\ \x7c\xd2\x68\x5e\xbe\x99\xdf\x8c\xe6\x9b\x19\x8c\x31\xdc\x6c\xfb\ \xec\xa7\x3e\x71\xe4\xa3\xdb\xc6\x0e\xfe\xaf\x1c\x8b\x5b\x88\xc9\ \x3b\x86\x07\x5f\x3e\xfe\xe2\xcf\xb6\xf5\x75\x1e\xb8\x51\xce\x2d\ \x01\x79\xb9\xae\x77\xde\x56\xe6\xe8\x8f\x9e\x3f\xba\x73\xac\x70\ \x5d\xe4\xd6\x00\xd5\xa0\x35\xfb\x06\x93\x83\xae\xfd\xc3\x6f\x7e\ \xfd\xe8\x8e\xa7\x4b\x0f\x03\x4c\x7c\x77\x54\x6c\x7d\xaa\x57\x00\ \x08\x63\x0c\x07\xf6\xdc\xf6\xf9\x5d\x77\x4e\x3c\x20\xc2\x15\x91\ \xf7\x85\xc9\x39\x86\x8c\x6b\xf0\x1d\x83\x6b\x69\x6c\x81\x2d\xd0\ \x96\x31\x1a\xa5\x0c\x89\x34\x84\x91\x4c\x47\x6f\xff\xe4\x97\xb6\ \x97\x8b\x5b\xa3\x28\x22\xe3\xd8\x9c\x9b\xab\xa8\x43\xef\xfe\xf1\ \x6b\x95\xe9\xf8\xc4\xbf\x17\xe1\x00\xf4\xe5\xcd\x97\x1f\xbb\x7b\ \xea\xd0\x50\xa7\x8b\xd4\x11\x96\x23\xb1\x9d\x14\xec\x14\x2c\x7d\ \x65\xa3\x46\x81\x6c\x41\x14\xa2\xdb\x31\xed\x96\xa2\xd5\xa8\x52\ \xbf\xf4\x0f\x1a\x8d\x94\xe5\x30\x65\xc8\xc2\x3e\x9c\xd9\x7a\x74\ \xe2\xab\x65\xf1\xce\xb1\xb5\xe3\x9b\x40\x87\x1d\x89\x60\x61\x16\ \x4b\xb7\x11\x6e\x42\x36\x9f\xe2\xfb\x09\xbe\x27\x11\x5e\x07\x38\ \x85\x2b\x88\x8a\x21\x5a\x47\x84\x6b\x78\x61\x9d\xb4\x19\xe3\x36\ \x0d\x22\x50\xb4\x6a\x8a\x4a\x43\xd1\x87\xb1\x1f\x09\x4a\xc7\xee\ \xfa\x62\xcf\xc8\xd9\x57\xd6\x8f\x38\x00\x05\x3b\xa1\xb9\xfa\x3e\ \x96\x5c\xc3\x72\x12\x62\x3b\x66\xa8\x04\xa2\x38\x00\xc5\x3e\x70\ \x7b\xc1\xed\x04\x61\x81\x17\x21\xdc\xcb\xb8\xd6\x07\x74\xc5\x73\ \x08\x59\xa5\x91\x42\x2a\x61\x35\x84\xa4\x9d\xe1\xbd\x61\x7b\x3a\ \x98\xd0\xbf\xdd\xdc\x41\xce\x96\xb4\x83\x0a\x39\x5d\x41\x00\xc5\ \xfe\x41\xaa\xb5\x62\x50\x72\xb3\x55\x4f\xa4\x16\xc4\xe0\xc7\x20\ \x6c\x8c\x92\xa8\xc4\x23\x4a\x7b\x4c\x6a\x4d\xf5\x97\xba\xde\xca\ \xf4\xb7\x57\x58\xb7\x21\x2f\x32\xfc\x69\xab\x77\xfc\xcd\x3d\xea\ \xd1\xc5\x83\x6b\x6a\x13\x28\x78\x06\x61\x1b\x6c\x1b\xba\x5d\x28\ \x75\x77\xb3\x32\xbf\xf0\x84\x77\x38\xf8\x45\xe5\x05\xcf\x1d\x7a\ \x37\xf5\xb0\x1c\xb0\x40\x48\x49\x9a\x42\xe1\xfb\x26\x5c\x79\x6e\ \xfc\x38\x77\xec\x3e\x50\x96\xaf\x31\x42\xca\xd9\xf1\xc1\x53\xa7\ \x6f\xbf\x78\xb0\xbb\xed\xfb\xe3\xbf\x1e\x32\x73\x5f\xa9\xb4\x1d\ \x80\xac\x27\x02\xdb\x16\x1b\x9e\xa0\x5d\xcc\xb9\xb8\x85\xde\xfc\ \x70\xc7\x85\x0a\xc0\xa1\xfd\x9f\x1e\x9a\x9e\x78\xfd\x83\x6b\xcb\ \x33\xfb\xaf\xbe\x5c\xce\x46\xf4\x4f\xa2\x36\x56\x79\x7b\xdc\x3b\ \xf3\xe6\x94\xf3\xac\x3e\x7f\x71\x87\xd5\x26\x63\x30\x2b\xc0\xdf\ \xaf\x00\x0e\x0b\x96\xc5\x79\xdf\x22\xf1\xb2\x45\xc8\x0d\xf9\xe7\ \x07\xba\x6b\x47\xfe\xf6\xd0\x0f\x06\x9b\x5b\xc6\x81\x7d\xd7\xbb\ \x07\x4e\x69\x8b\xa0\x30\xca\x8c\xd5\xfe\xc3\xcc\xbe\xa9\x13\xba\ \x3e\xbb\x4b\x28\xed\x80\xf0\xb4\xd6\x6f\x6f\x02\xae\xcd\xb2\x80\ \x59\x17\x52\xe1\x17\x35\x7e\x57\x7a\x62\xe7\xc8\x77\x76\xef\xdc\ \x73\xdf\xfa\xda\xe2\x2b\x37\xba\x68\xad\xd5\xc8\xcf\xac\xfc\xe4\ \xd4\x6f\x3e\xd6\x7c\x32\x15\xea\xb9\xb8\xdd\xc6\x28\x8c\x51\x26\ \x27\xb5\x8e\x80\xd7\x1c\x00\x47\xb0\xa6\x35\xf3\x96\x21\x41\xb8\ \xf1\x0b\xde\xc5\xc7\xe7\x77\x0c\xec\xcd\xb0\xc0\x72\x5c\x31\x37\ \x02\xec\xa4\xf2\xcc\x9f\x73\xab\x8b\x67\x87\xb7\xef\x98\x0c\x82\ \xfd\x61\x18\x26\x2a\x06\x13\xd3\x61\x30\x0b\x9b\x87\x8c\xa0\xaa\ \x24\xf3\xc2\xd0\x7a\xd6\xaa\x3f\x7d\xcc\x7d\x6f\xef\x68\xd0\xc3\ \x52\x71\x91\xb5\xf5\xcb\xfe\xe4\x85\x6d\x76\xae\x2b\x5f\xf0\x3c\ \x17\xc7\xb1\x49\x6d\x0b\x65\x8c\x18\xde\xe3\x55\x96\x4c\xbf\x4e\ \xe6\xc3\xe1\x64\x22\xee\xda\xd8\x08\x50\x2d\x30\x4d\xc0\xd0\xb1\ \x09\x78\xb0\x1c\x27\x2a\xfa\x96\xce\x7c\xef\x97\x49\xed\xbe\xce\ \x6a\x9d\xbc\x67\x70\x7c\x87\x61\x33\xf0\xb9\xde\xb1\xf2\x87\xa5\ \xae\x32\x45\xd1\x85\x67\xf9\x28\x24\x4d\xd3\x64\xbd\xaf\x8e\xd7\ \xda\x30\xb2\xd6\x2a\x34\xc3\x80\x6a\xb5\x86\xae\x03\x35\xd0\x8e\ \xb9\xfa\x54\x5c\x08\x92\xf2\x4c\x77\xff\xe1\x73\xa5\x2d\x8f\x8d\ \x04\x35\xac\x00\x54\xc6\xa6\x4a\x40\xd2\x2b\xdd\x42\x21\x3f\x10\ \x38\x0d\x3c\xd7\xc7\x12\x02\x89\xa4\xa5\x42\x9a\x51\x93\x46\xd2\ \xa4\x31\x10\x52\x5f\x6c\x50\x5d\x69\x20\x96\x01\x69\x30\x0e\x57\ \x81\x93\xcb\xd6\x5e\xd9\xdb\x73\x60\xac\xdc\x43\x1c\x96\x48\xeb\ \x29\xa9\x97\x20\x4d\x42\x35\x69\x72\xb9\xba\x8e\xca\xa4\xc8\x4c\ \x82\xf2\x52\x52\x91\xa2\xb4\x24\x89\x24\x71\x98\x90\xd4\x34\x49\ \x1d\xf4\x2a\x98\xcb\x60\x3a\x0d\x26\xbe\x06\x38\x73\xa6\xf1\xe2\ \x37\xee\xed\x5f\x9e\xb3\xcd\x4b\x85\x8f\x74\x66\x69\x24\x20\xc1\ \xc4\x02\xa7\x94\xc1\x93\x19\xb4\x91\x18\x21\xd1\x42\x22\xad\x14\ \x45\x4a\x2c\x52\x62\x3b\x21\x72\x13\x62\x57\xa3\x0a\x06\x35\xa0\ \xc9\x89\x3c\xd1\x52\xfb\x2a\x00\xf0\xd3\x53\xab\xaf\x3e\x74\x97\ \xfb\xc0\xca\x67\x76\xbf\x94\x1d\xf0\xb3\xaa\xa5\x10\x91\xa0\x18\ \x77\xac\x2e\xa4\xef\x9f\x34\x59\x6d\x5b\xfe\x95\x11\xc6\x32\x18\ \x0c\x48\x83\x93\xd8\x64\x5b\x3e\x6e\x53\xc7\xba\x69\x8c\x6a\x6a\ \xdc\xc4\x75\x9c\xc8\xfd\xfd\x26\xf0\xfc\x17\x0a\xc2\xcd\x97\x39\ \x79\x36\x7d\xf5\xdb\xf7\x66\xef\x7f\x43\xec\x9a\xf6\xfa\xfd\x2c\ \x11\xbc\x73\x7e\x76\xe6\xc3\x1f\x5f\x7a\xe2\x46\xa5\xfa\xff\x42\ \x18\xf3\xdf\x65\x3e\xf6\x71\xff\xee\xa1\x7d\x53\xd3\xd9\x51\x2f\ \x3b\xf7\x97\xd9\xdf\x2d\xfd\xfc\xd2\x3d\x37\x0b\x5c\xf7\xcb\xbc\ \xf8\xd7\xf8\xf4\xb9\x5f\xcd\xdc\xaf\x2e\x49\xac\xd8\xb1\x6f\x76\ \x72\xb8\xe6\x0c\xfe\x33\x92\xa5\xe8\x74\xf7\x70\xe9\xc1\xd1\xed\ \x23\xfb\x6f\x05\xf8\x27\x44\x53\xb3\x67\x2d\xb3\xe4\xeb\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xde\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x02\xa5\x49\x44\x41\x54\x48\x89\xb5\x95\xcf\x4f\x13\x41\ \x14\xc7\xbf\xf3\xa3\xa5\x29\xf5\x20\xc5\x0b\xe8\x7f\x21\x21\x41\ \xe2\x01\xf5\x66\x13\xce\xc6\x0b\x7a\xf2\xb6\x8d\x0d\x5e\xbc\x78\ \x33\xe0\x81\x03\xfa\x07\xa8\x27\xff\x00\xdb\x68\x40\x6b\xca\x5d\ \x49\x53\xba\x5b\x0f\x34\xa9\x2d\x50\x8d\x89\x25\x05\xda\x9d\x19\ \x0f\x74\xd6\xd9\x30\x5d\x30\xe2\x4b\x26\x99\xd9\xbc\xf7\xfd\xbc\ \x79\xf3\x66\x96\x5c\x9b\x99\xc1\xec\xec\x75\xa4\xd3\x69\x74\x0f\ \x0f\xa0\xa4\x84\xf0\x05\x00\x05\xa1\x24\x62\x8c\x43\x42\x81\xd3\ \x18\x7e\xfe\x68\xa3\xf8\xa9\x88\xcf\x9b\x9b\x18\x19\x19\xc1\xd1\ \xd1\x11\x08\x21\x88\x32\x2e\x85\x80\x10\x02\xbe\xef\xc3\xef\xf7\ \x31\x35\x75\x55\x45\x05\xcc\xdd\xba\x19\x29\xa8\x6d\x7e\x7e\x9e\ \x00\x00\xd7\x1f\x94\x52\xd0\xca\x99\x4c\x06\xfd\x7e\x3f\xc8\x8e\ \x10\x12\x1a\xda\xa4\x94\xc1\x10\x83\x44\x13\x89\x04\xf2\xf9\xfc\ \x9f\x1d\xd8\xe8\x84\x10\x50\x4a\x23\xc5\x01\x80\x31\x06\x4a\x29\ \x94\x52\xa0\x94\x82\x52\x8a\x58\x2c\x16\xf2\xb1\x02\x00\x40\x08\ \x71\x42\xd8\x9c\xeb\x04\x6c\x49\x9d\x09\x00\x1c\x97\xcd\x14\xd0\ \x6b\x3d\x8f\x02\x9e\x0a\xd0\x02\x26\xc4\xe6\x43\x29\xb5\x96\x4f\ \x9b\x1d\x3b\x08\x96\x52\x06\x73\x13\x64\xae\xb5\xcf\xb0\x5d\x44\ \x02\xb4\x80\x16\xd4\xa3\xd7\xeb\x61\x6f\x6f\x0f\x42\x08\x6b\x02\ \x67\x06\xd8\xb2\xee\x74\x3a\x58\x5d\x5d\xc5\xfa\xda\x5a\x50\xc2\ \x7f\x02\xe8\x3e\x57\x4a\xa1\x58\x2c\x82\x31\x86\x1b\x73\x73\xb8\ \x9d\xc9\x84\x7c\xcc\x92\x9a\xf1\x56\x80\x79\x79\xf4\xbc\x5a\xad\ \x62\x74\x34\x85\x8d\xd2\x06\xf2\x85\x02\xe2\xf1\xf8\x09\x1f\x13\ \xa0\xcd\xda\x45\x9a\xae\x4b\xe0\xba\x1e\x0e\x0e\x0f\xf1\xad\xd1\ \x84\xeb\x6e\x21\x97\x7b\x18\x24\x72\xea\x5b\x14\x05\x00\x80\x9a\ \x57\x43\x67\x7f\x1f\xad\x56\x0b\xae\x5b\x45\x36\x9b\x0d\x7c\xcc\ \xfb\x30\xec\x0c\x22\x2f\x9a\xeb\x7a\xf8\xb5\xdf\xc1\x4e\x73\x17\ \xb5\x5a\x15\x8e\xe3\x80\x73\x1e\x00\x80\xe3\x4b\xa7\x77\x62\xdb\ \x4d\xf8\x0c\x06\x41\x4a\x29\x54\x2a\x15\xa4\x52\x17\xd0\xde\xfd\ \x0e\xcf\xdb\x82\xe3\x38\x60\x8c\x9d\x68\x59\x65\xc4\xd8\x76\x11\ \x02\xc8\x81\x43\xb9\x5c\xc6\xc5\xf4\x38\x9a\xad\x1d\x94\xcb\x5f\ \xe0\x38\x4e\x70\x89\x6c\xa2\xe6\xda\x0a\x50\x0a\x90\x52\x41\x08\ \x1f\xed\x76\x1b\xc9\x64\x0a\xcd\x46\x03\xef\xdf\xbd\x45\x36\x9b\ \x0d\xf5\x7b\x14\xc4\x06\xe0\xda\x49\x4a\x01\x4a\xe8\xdd\xe9\xe9\ \x19\x34\x1a\x0d\x14\x0a\x79\xe4\x72\xb9\x50\xe6\xda\x6c\x0f\xdf\ \x30\xe3\x84\x50\x50\x4a\xa0\x94\xba\xbf\xb0\x70\xef\xf9\x76\x7d\ \x1b\x1f\x3f\xac\x63\x71\x71\x31\x38\x50\xdb\x93\x7d\x96\x27\x1c\ \x00\x78\x22\x91\x88\x03\x78\x74\xe5\xf2\xc4\x93\x7a\xbd\x2e\x5e\ \xbf\x7a\x89\x95\x95\x15\xbf\xdb\xed\xa2\xd7\xeb\x0d\x15\x34\x3b\ \xc6\xf2\x53\x0a\xba\x93\x7f\xf5\xbc\x67\x31\xce\x1f\x5c\x1a\x1f\ \x23\x4f\x97\x96\xde\x2c\x2f\x2f\xdf\x29\x95\x4a\x91\xed\xfb\x57\ \x46\x08\x49\x72\xc6\x1f\xa7\xc7\xd2\x2f\x00\xb0\x73\x13\x36\x2d\ \xce\x38\x26\x27\x26\xff\x8b\xf6\x6f\x11\xca\xe6\x64\xa6\xc5\xbd\ \x1b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\xf0\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x04\xb7\x49\x44\x41\x54\x48\x89\x95\x94\xcb\x4f\x5d\x55\ \x14\x87\xbf\xbd\xf7\x7d\x96\x4b\x69\x2f\xb4\x02\x9a\x18\x5b\x12\ \x12\x1b\xeb\xab\x2d\x55\xa9\x80\x8a\xf8\x4a\xd4\xd4\x91\xaf\x81\ \x29\x35\xce\xfc\x3f\x1c\x39\x68\xb4\x75\x60\xe2\xc0\x99\xd1\x48\ \xd5\x38\xb0\xb3\xc6\x47\x14\x85\x5e\xac\x36\xb1\xa5\x85\x02\xa5\ \x4f\xe3\x0d\x97\x73\xf6\x5e\x7b\x39\x38\x17\x04\x52\xa3\x3d\xc9\ \x3a\x83\xb3\xf7\x59\xbf\xfd\xad\xdf\x5a\xdb\xa8\x2a\x00\x3d\x3d\ \xbd\xad\x4b\x8d\xa5\xaf\xdb\xb6\xb4\xf7\xec\xb8\xeb\x4e\xff\xd8\ \x63\x83\x09\x28\xcd\xe5\xff\xfd\x58\xeb\x58\xbc\x7c\xa9\x63\xec\ \xf3\xaf\xea\xce\xd9\xcf\xcc\x8a\xc0\xf6\xed\xdd\x55\x0c\x3f\xb4\ \x54\x36\xef\xdc\xda\xd6\xc2\xf8\xf8\x4f\xb7\x96\x79\xcd\xb3\x6f\ \x5f\x1f\x1d\x5d\x3b\xd8\x54\x2e\x93\x5b\xf9\x28\x1a\xc9\x59\xc7\ \x9e\x7d\x8f\xf0\xc7\x99\x09\x42\x84\x28\x01\xbd\x45\x84\x62\x21\ \x0f\x80\x46\x25\xaa\xfe\x23\x80\x46\x54\x0d\x37\x6e\xfc\x09\xaa\ \xf8\x20\xa8\xc8\x2d\x0b\x58\x97\x43\x01\x91\x40\x14\x59\x23\x80\ \x41\x15\x62\x8c\x28\x90\xa4\x81\x28\xfe\x96\x3d\x50\xe3\x40\x15\ \x11\x41\xd6\x09\xa8\xa2\x64\x0b\x28\xf8\x20\x44\x89\xff\x8b\x40\ \x44\x48\xd3\x94\x72\xb9\x8c\x71\xa1\x49\xb0\x41\x40\x9b\x2f\x91\ \x80\xa2\x24\xa9\x47\x42\xfa\x9f\x04\x17\xce\x4f\x73\xba\xf6\x0b\ \xad\x6d\xed\x3c\xdc\x7f\x00\xc5\xac\x12\x84\x10\xb0\xff\x08\x28\ \x68\x44\x82\x00\xe0\x7d\x20\x88\xfc\x6b\xd4\xeb\x75\x4e\x7c\xfd\ \x05\x8f\x3e\xbc\x97\xd6\xcd\x9b\xe9\xbd\x7b\x17\x41\x24\xf3\x0e\ \x08\x21\x20\x61\x2d\x41\x54\xd4\x9a\x8c\x40\x21\xf5\x01\x09\xe1\ \xa6\x04\x21\x78\x16\xe6\x66\xe8\xed\xed\xe5\xd4\xc4\x24\x0b\x8b\ \xd7\xb9\xf7\xc1\x16\x92\x24\x00\x0e\x14\xa2\x08\x22\x61\xad\xc9\ \xa0\xaa\x84\x20\x80\x92\xfa\x40\xbc\x89\x40\xf0\x9e\x2b\x8b\x73\ \x18\x4d\x39\x7b\x76\x96\xc9\x5a\x8d\x17\x0e\xbe\x8c\xf7\x01\x00\ \x63\x5d\xe6\x65\x08\x1b\x4a\xa4\x8a\xaa\xae\x9e\xfa\xcc\xef\xbf\ \x51\x28\x96\xc8\x17\x8b\xcd\x28\x60\x8c\xe1\xda\x95\x05\x90\x84\ \xf9\xf9\x05\xe6\x17\xaf\x30\xfc\xcc\xf3\x6c\x69\xaf\xae\xee\x3b\ \x73\xe6\xb7\xac\xc4\x21\x10\x82\xb0\x3a\xc9\x6d\x6d\xd5\x2a\xc6\ \xfc\xb0\xa3\x67\xd7\xce\xc5\x85\x69\xb6\x6d\xeb\xc0\x60\x32\x75\ \x03\x85\x42\x81\xbe\xbe\x3e\x06\x87\x86\x98\x39\x7f\x81\xb1\xb1\ \x31\xe6\xe7\xe7\x28\x14\x8b\x6b\x4a\x90\xed\xbd\x7a\xf5\x1a\xd5\ \x8e\x3b\xc8\xe7\x0b\x1b\xbb\x28\x6b\xd5\x6a\xc7\xed\x34\x12\x8f\ \xb5\x16\x91\x48\xb9\x5c\xa2\x6f\xff\x43\x0c\x0d\x1c\xe0\xdc\xf4\ \x34\xc7\xc7\xbe\x64\x6e\xfe\x1a\xb9\x7c\x2b\x69\xd0\x6c\x76\x54\ \xc9\x39\x47\x8c\x91\x2d\xd5\x2e\x8c\x01\x11\xbf\x46\xa0\x49\x12\ \x82\x07\xa0\x58\x2c\xe0\x9c\x43\xfc\x12\x03\xfd\x7b\x18\x7c\xb4\ \x9f\xe9\xe9\x69\xbe\x38\x7e\x9c\xd9\xd9\x8b\x14\x8a\x05\x50\xc1\ \x28\x38\x03\x12\x05\x97\x6b\x45\x43\x24\x4d\x13\x5c\x2e\x8f\x73\ \x76\x83\x80\xa1\x39\x68\x4a\x00\xda\x5b\xb7\xf2\xd2\x8b\x07\x79\ \xfc\x89\x61\xc6\xc7\x7f\xe2\xfa\xf5\x6b\x8c\x1e\x3e\x44\xcf\xce\ \x1d\xa4\x69\x8a\x31\x59\x09\x9d\x73\x9c\x3c\x79\x92\x8f\x3e\xfe\ \x84\xb0\x1c\x32\x81\x10\x28\x96\x4a\x1b\xba\x28\x2a\xc1\x67\x04\ \xa5\x52\x91\xfd\x7d\x7b\x78\x72\xe4\x69\x6a\xb5\x53\x1c\xfd\xe0\ \x43\xce\x9d\x9b\xe1\xb9\x67\x47\xd8\xd2\xd6\x4a\xa3\xb1\xbc\x2a\ \x60\xad\xa5\xab\xbb\xbb\xe9\x97\xc1\x59\x97\x0d\x9a\x0f\x1b\x08\ \x54\x11\x09\x94\x8a\x25\x06\x0e\x3c\xc2\xeb\xaf\xbd\xca\xe9\x5f\ \xa7\x38\x71\xe2\x1b\x66\x66\x2e\x52\x2c\x15\x89\x51\x58\x5e\x5e\ \x26\x4d\xd3\xd5\xff\x8c\x31\x34\x96\x1a\x04\xef\x09\xde\x23\x22\ \xc4\x18\xd7\x7b\xb0\x62\xb0\x73\x39\x06\x06\xfb\x19\x1d\x7d\x83\ \xda\xa9\x53\xfc\xf8\xe3\xf7\x94\x4a\x65\x8c\xb1\x48\x08\x78\xef\ \x49\x53\xcf\xf2\xf2\xf2\xaa\x6f\xce\x39\xd2\x34\xcd\xa6\x3f\x04\ \x62\x14\xac\xb5\x18\x63\xd7\x5f\x15\x95\x4a\xc5\x8d\x0c\x0f\xf1\ \xd6\x9b\xa3\x4c\x4e\x4c\x70\xf4\xd8\x31\x3a\x3b\x3b\x69\x69\x69\ \xc1\x7b\x9f\x25\x4f\x12\x1a\x8d\x25\x92\x24\x21\x4d\x53\xd2\x34\ \x25\x49\x92\xec\xd4\x22\x84\x90\x11\xa8\x66\xdd\xb5\x4a\xf0\xd4\ \xc8\xc8\xd6\xae\xee\xae\xea\xe8\xe1\x43\x4c\x4e\x4e\xf2\xde\xfb\ \xc7\x98\x9d\x9d\xa7\xa5\x52\xe1\xca\xd5\xeb\x68\x8c\x44\x8d\x04\ \x09\x24\x49\x42\x92\xa4\xeb\x09\xbc\xcf\x92\x87\x00\x28\xbe\x39\ \xb8\x39\x80\xa3\xc7\x3e\xa8\x3e\x70\xff\x7d\xef\x0e\x8f\x8c\x54\ \xa6\x6a\x35\x8e\x1c\x39\xc2\xe4\xc4\x14\x9b\x5a\x36\xa5\xbb\xef\ \xb9\x27\x7f\xef\xee\xdd\xe6\xc9\xe1\x27\x50\x94\x7c\x2e\x4f\x3e\ \x9f\x5b\x77\x8d\x1b\x63\x58\xbc\x7c\x99\x7a\xbd\xce\xd2\xd2\x12\ \xce\x59\x62\x54\xac\x35\x98\xa1\x81\xc1\x7d\x7b\xf6\xee\x7d\xb7\ \xa3\xbd\xba\xdf\x5a\x27\x9f\x7c\xfa\xe9\xe5\x5a\xad\x76\xd1\xfb\ \x74\x5b\xa5\x52\x39\x7f\x5b\xe7\x6d\xdd\xce\x3a\x63\xad\x35\x26\ \x6b\x1b\xd3\x4c\x6a\x9a\x26\xeb\x8a\xd9\x67\xcf\x9e\x2b\x66\x57\ \x4e\x54\x55\x55\x11\x99\xc8\x4d\xfc\x3c\xbe\xab\xfe\xe7\x8d\xfd\ \xfd\x03\x03\x4c\x4d\x9d\x1e\xfb\xee\xbb\x6f\xdf\xf6\xde\x5f\x88\ \x31\x96\x9d\xb5\xad\x0a\x9b\xac\xb5\x15\x63\x4c\xc5\x18\x53\x01\ \xca\x40\x11\x70\x4d\x00\x01\x12\x55\x6d\x18\x63\x1a\xc0\x5f\xaa\ \xf1\x2f\x91\x58\x17\x91\x1b\x06\xc8\x5b\x63\x5e\xe9\xdc\xbe\xfd\ \xc1\xb9\x4b\x97\xde\x51\xd5\x0b\xcd\x53\x3a\x20\x77\x93\x70\x80\ \x5d\x21\x69\xde\x32\xb1\x29\x14\x36\xc6\xdf\xb8\xfc\xfe\xd4\x40\ \xe3\x70\xe9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x02\xbb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdc\x09\x14\ \x11\x14\x33\xf7\xd9\xab\x49\x00\x00\x02\x3b\x49\x44\x41\x54\x48\ \xc7\xb5\x56\xcf\x6b\x13\x41\x14\xfe\xe6\xed\xce\x26\xd1\xc6\x86\ \x2a\xc5\xe6\xa0\x82\x68\x0b\x1e\x3c\x49\xa9\xb7\xa2\xd7\x10\x69\ \x11\xbc\x09\x7a\xf0\x90\x8b\x27\xfd\x0b\xc4\x6b\x2f\xa2\x9e\xfa\ \x2f\x98\x8b\xc1\x5f\xb4\xe4\xe0\x41\x2f\x82\x21\x68\x49\xf0\xd0\ \x83\x9a\xb6\xa6\xd1\xb8\x6d\x76\x3b\x33\x1e\x64\xc2\x64\x3b\xc9\ \x6e\xa5\x3e\x18\x78\x6f\x76\xe6\x7d\xf3\xbe\xf7\xde\xcc\x02\xff\ \x59\x58\x74\xa2\x5c\x2e\xab\xc3\x70\x5c\x2c\x16\x19\x00\xb8\xb6\ \x8f\x85\x42\x01\x61\x18\x82\xb1\xbf\xf8\x8c\xb1\x81\xa1\x45\x4a\ \xd9\x1f\x42\x08\x08\x21\x90\x4e\xa7\x51\xa9\x54\xfa\x6b\xac\x00\ \x8c\x31\x10\xd1\x48\xe7\x00\xe0\x38\x0e\x88\x08\x4a\x29\x10\x11\ \x88\x08\x9c\xf3\x81\x35\xee\xb0\x10\x85\x10\xfb\x1c\x9b\xba\x3e\ \x80\xed\x50\x89\x00\x00\x40\x29\x35\xe0\x40\xdb\x5a\x1f\x05\x18\ \x0b\xa0\x1d\x98\x20\xb6\x35\x44\x64\xa5\x4f\x0b\x8d\xda\x2c\xa5\ \xec\xeb\x26\x90\x69\xeb\x35\xc3\xa2\x88\x8d\x40\x4a\xb9\xef\x74\ \x36\xba\xb4\x7e\x20\x00\x73\x53\x94\x2a\x1b\x7d\xff\x04\x10\x4d\ \xa6\x6d\xce\x8c\x36\x4a\x93\x15\x40\x37\x4f\xb4\x34\xa3\x65\x6b\ \xeb\x95\x44\x00\x3a\x89\xc3\xb8\xd6\xb6\x2d\x3f\x89\x28\x32\xab\ \x24\x0e\x24\xae\x9c\x13\x35\x9a\xad\x52\x4c\xfb\xf5\x87\x37\x28\ \x7f\x7c\x06\x92\x2e\x16\x2f\x2d\x1c\x0e\x45\xa6\xf4\xa8\x87\x63\ \xf3\x1c\xde\xf7\x0c\x02\x19\xc4\x37\x9a\x06\x30\x2b\x69\x94\x9e\ \xe2\x1e\xb2\xf9\xa3\xf8\x35\xd1\x01\x77\xf9\xc1\x72\x60\xbb\x69\ \x95\x52\x58\xa9\xaf\x22\xe4\x01\xc6\x90\x45\x63\xab\x81\xe0\x7c\ \x0f\x6d\x6a\xa1\xb6\x5e\x83\xfa\x21\xb1\xf8\xf0\x7a\x69\xab\xb3\ \xd9\x76\xe3\x7a\x60\x58\x72\x9f\xbe\x7f\x8c\xb5\xf9\x77\x98\x3b\ \x37\x87\x49\xe4\xb1\xd6\xf9\x84\xee\xe7\x1d\xec\x7a\xaf\x90\x9d\ \x19\xc3\x89\xd3\x99\xa5\xee\x5b\xde\xb4\x02\x44\x2f\x30\x9b\x2e\ \x7c\x85\xaf\x2f\x7e\xe2\x79\xe3\x25\x82\x9c\x80\xf7\x85\x90\x1f\ \x9f\x42\x66\xfa\x08\x32\x69\x8e\xa0\x1b\x20\xf4\x42\x3b\x45\xbe\ \xef\xef\xf9\xbe\x6f\x7d\x6c\xb4\x7e\x7b\xf6\x16\x5b\x50\xd7\x98\ \xe3\x12\x6a\xdf\xea\x6c\x79\xe7\x09\xdb\xbe\xb8\x81\x1b\xcd\x3b\ \xca\xdd\xe0\x6c\xa5\xb5\x7a\x77\x6f\x53\xda\x29\xaa\x56\xab\x6e\ \xdc\x9b\x9b\x42\x0a\x27\x31\x05\x00\x98\xf8\xdd\x42\xea\x0c\x43\ \xee\xd4\x38\xa8\x4e\x6c\x26\x37\x8d\xfb\x37\xef\x3d\x3a\xb4\x3f\ \x87\xd9\x07\x97\x4b\xc7\xcb\xe9\xf0\xc2\xfa\x64\x78\x75\xe9\x4a\ \x29\x71\xa3\x25\x15\x67\xdb\x69\xe7\x6b\x67\x1b\x5e\x93\x63\xb7\ \x15\xb6\xcd\x6f\x7f\x00\xd4\x61\x49\xb9\xc4\x8c\xe3\x5e\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x03\xca\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x03\x91\x49\x44\x41\x54\x48\x89\x9d\x94\xcb\x8b\x1c\x55\ \x14\xc6\x7f\xe7\xde\xee\xa9\x9e\xa4\xc7\xc4\x71\x42\x9c\x18\x08\ \x9a\xe0\x22\x92\xb8\x91\xb8\x90\x40\x0c\x3e\x30\x88\x82\xf8\x57\ \xb8\x77\xe9\xca\xbd\x0b\x77\x6e\x44\x5c\x88\x0b\x05\xd1\x85\xf8\ \x07\x64\x23\x24\x10\x57\xc9\x80\x11\x97\x26\x8c\x46\x32\x74\x3d\ \xee\x79\xb8\xa8\xea\x4e\xf7\x44\x17\xed\xa5\x6e\xdd\x7a\x9d\xf3\ \xdd\xaf\xce\xf7\x1d\x39\x7b\xf6\xf9\xad\x59\x3d\xfb\xe9\xd8\xf1\ \xa7\xce\x3d\xf7\xec\x99\x72\xf5\xea\x95\x16\x82\x08\xd6\x1a\x29\ \x65\xee\xdd\xff\x63\xe7\x87\xef\x7f\x3c\xc8\x39\x7d\xf7\xcb\xad\ \x1b\x1f\x00\xc8\x89\x13\xbb\xdb\x08\x3f\x1f\x9d\x3e\x71\xf6\xc9\ \x63\x47\xb9\x79\xf3\xc6\x7a\x99\x97\xc6\xa5\x4b\x2f\xb3\xb3\xfb\ \x1c\x47\x36\x37\xf9\xe6\xeb\xcf\x05\x60\x64\xe1\x8c\x52\xe6\xa5\ \x4b\xaf\xf0\xeb\xde\x2d\xd4\xc1\x4d\x89\x35\x29\x54\x1b\x63\x00\ \xc2\x03\x5f\x8a\x1d\x11\x4e\x84\xf0\xe0\xc1\xdf\x10\x41\x51\x23\ \xcc\xd6\x06\x48\x79\x44\x00\x66\x8a\x9b\x2d\x01\x20\x44\x80\xbb\ \x13\x40\xdb\x29\x6e\x65\xed\x1a\x84\x64\x88\xc0\xcc\xb0\x15\x80\ \x08\x82\xfe\x05\x01\x45\x0d\x37\x5f\x9b\x81\x64\x1d\x18\x1c\x02\ \x08\x80\xe8\xa9\x05\x41\xdb\x15\x4c\xbb\xf5\x19\x20\x0b\x06\xaa\ \xba\x0c\x10\x48\x38\xa6\x3d\x6a\x29\x8a\xbb\xad\x2f\x53\x35\x02\ \x50\xd5\x45\xae\x1e\xc0\x83\x48\xd2\x33\x08\xe8\x8a\x62\xaa\x6b\ \x03\x40\x86\x00\x37\xc3\x6c\x89\x01\x40\x44\xa0\x6a\x40\xd0\x15\ \xc5\xff\x07\x80\xa4\xdc\xd7\x52\xf5\xd0\x2f\x1a\x32\xcd\x77\xbd\ \x77\xe7\x36\xe7\xcf\xbf\xb0\xa4\xe5\x98\x1f\xab\x09\x57\x4f\xec\ \xed\xdd\x06\xa0\xa8\x32\xd2\xc7\x54\x04\x92\x84\xfd\x7b\xfb\x7c\ \xfc\xd1\x87\xc8\x10\x34\x5f\xfa\xcb\xa5\x1b\x62\x15\x30\xfa\x6f\ \xf7\xf7\xff\x64\x7b\xe7\xf4\xbf\xa9\xa8\x97\xea\xf6\xce\x33\xd4\ \x6d\x21\xa5\x84\x99\x93\x92\x90\x52\x42\x24\x0d\x6b\x9f\xcc\xa3\ \x97\xb1\x7b\xbf\x8e\x72\xc6\xdd\x39\xbe\xbd\x8b\x08\x98\x95\xc7\ \x7f\x91\x6a\xff\xb0\xaa\x36\xc8\x39\x33\x3b\xf8\x8b\x2c\x99\x9c\ \x32\x20\x8f\x5a\xc0\x9c\x5c\x40\x16\x30\x37\xf2\x68\x8b\x50\xa7\ \xeb\x5a\xf2\x68\x4c\xce\xe9\x10\x80\x30\x18\x2d\x50\x60\xab\x9a\ \xf2\xee\x3b\xd7\xb8\x72\xe5\x55\x36\x26\x13\x88\xa0\xaa\x2a\x36\ \x27\x15\x5d\xd7\x21\xd2\xa3\xe4\x9c\xb9\x7e\xfd\x3a\x5f\x7e\xf5\ \x2d\xda\x68\x0f\xa0\x4a\x35\x99\x2c\xd5\x80\xbe\x41\x69\x79\x44\ \x4b\x4d\xb9\x7c\xf9\x32\xb7\xef\xec\xf1\xc9\xa7\x9f\x11\x1e\xbc\ \xf5\xe6\x55\xde\x7f\xef\x6d\xea\xba\x59\x00\xa4\x94\xd8\x3d\x75\ \x6a\xa0\x24\xe4\x94\x7b\xa3\x95\xc3\x2a\x8a\xe8\xb5\x1b\x42\x10\ \x68\x51\x9a\xa6\x41\x55\x19\xa5\x44\xa4\xc0\xdd\x68\x9a\x86\xae\ \xeb\xfa\xba\x46\x20\x22\xd4\xb3\x1a\x2d\x05\x2d\x05\x33\xc3\xdd\ \x57\x6b\x30\x2f\x70\x29\x8a\xf4\x6e\x47\xb5\x30\x9b\xcd\xa8\xeb\ \x7a\x30\x60\x50\x4a\xa1\xeb\x0a\x4d\xd3\x2c\xfa\x54\xce\x99\xae\ \xeb\x28\xa5\xd7\xbe\xbb\x2d\x44\xb1\xa4\xa2\x20\x06\x06\xc2\xdc\ \x74\x85\x52\x0a\x6d\xdb\x52\x4a\x21\x22\xe8\xda\x96\xba\x9e\xd1\ \xb6\xdd\x22\xb8\x57\x9b\xe1\x66\xa8\x96\x05\x2b\x77\x5f\x02\xf0\ \x20\x22\xc2\x06\xf7\x45\x80\xa9\xd1\xcc\x93\xbb\xe3\xe1\xa8\x29\ \x6d\xdb\xd2\xb6\xdd\x2a\x83\x52\x50\x2d\xf4\xf1\x41\x89\x58\xe9\ \xc4\xa3\xb6\x9d\x3d\x14\x91\xbd\xb6\xad\xcf\xb9\x47\xdf\xaa\xbd\ \x74\x17\x2f\x5c\x18\xbf\x78\xf1\xa2\xbc\xf1\xfa\x6b\x04\xc1\x78\ \x34\x66\x3c\x1e\xad\x04\x8b\x08\xf7\xee\xdf\xe7\xe0\xe0\x80\xd9\ \x6c\x46\xce\x09\xf7\x20\xa5\x47\xa6\x14\x20\x01\x67\x36\x36\x36\ \xbe\x98\x4c\x36\x47\x6d\xdb\x9c\x9e\x4e\xa7\xbf\x9f\x7c\xfa\xe4\ \xa9\x9c\xb2\xa4\x94\x44\x7a\xd9\xc8\x90\x54\x86\x22\xc7\xbc\xd8\ \x77\xef\xfe\x56\x45\x04\x11\x1e\x11\x11\x66\x76\xab\x69\x9a\x6b\ \xbd\x5f\x96\x76\xa4\xaa\xe2\xee\x9b\x39\xa5\xad\x80\x23\x29\xa5\ \xa9\x88\x4c\x45\x64\x0a\x6c\x02\x15\x90\x87\xcf\x0d\x68\x23\xa2\ \x16\x91\x1a\x78\x18\xe1\x0f\xcd\xfc\xc0\xcc\x1e\x54\x55\xd5\x3d\ \x06\x30\xec\x32\x0f\xfe\x38\x3c\xf3\xc0\x76\xce\x3f\x00\x1f\x80\ \xf4\x3f\x26\xff\x00\xbd\xc3\xa8\x16\x2a\xc1\xd3\xa3\x00\x00\x00\ \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x4f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdc\x09\x14\ \x11\x19\x29\xbf\x15\x2c\x7e\x00\x00\x03\xcf\x49\x44\x41\x54\x48\ \xc7\xd5\x54\x6d\x68\x5b\x55\x18\x7e\xce\xbd\x37\x1f\x6b\xbe\xba\ \x36\x4b\xb5\xb4\x74\xab\x62\xed\xdc\x04\x6d\x31\x28\x85\x76\x1d\ \x6c\x43\x37\xea\x0f\x11\xac\xae\x85\x09\x43\x41\x5d\xc2\x42\xad\ \x22\xe8\x7e\x08\xb2\x2a\xd6\x51\xdd\xef\x6e\x13\x51\x1a\x70\x52\ \x9a\xb2\xb1\x6a\xa1\x13\x24\x0e\x95\x85\xe4\x26\x69\xb7\x26\x4b\ \x93\xb6\xc9\x3e\x6e\x73\x9b\x34\xad\xf7\x1e\xff\x78\xaf\xb9\x69\ \x9a\x4d\xf0\x8f\x2f\x1c\xee\x39\x87\x73\x9f\xe7\x3d\xef\xf3\xbc\ \x87\x8c\x8e\x7a\x0d\x97\x26\x26\x9e\x78\xb8\xb1\xe1\x64\x6b\x4b\ \x4b\x87\xd1\x68\xd8\xc6\xb2\x2c\x59\x2b\xac\xa3\x50\xc8\xdf\x9a\ \xbb\x19\xff\x61\x79\x21\xf1\xfd\xe3\xbb\xf7\x86\x07\xdf\x7f\x2b\ \x8f\x7f\x19\xe4\xdc\xa8\xf7\x6c\xd3\xce\xc6\xa3\x84\x61\x4d\x2b\ \x2b\xab\xb0\xd9\xcc\x58\x2b\x14\x70\xe7\xb6\x00\x8b\xc5\x08\x42\ \x18\x18\xf4\x3a\x84\x82\x01\x34\x34\x3a\x1e\x18\xb8\xa7\xa7\x87\ \x00\x00\x97\xb9\x23\x34\x1f\x7c\xfe\x80\x29\x78\xfd\x77\x1a\x8f\ \x45\x89\xd5\x6a\x42\x3e\x9f\x43\x26\x73\x0f\x75\x75\xb5\xd8\xb3\ \xa7\x0d\xc2\x3d\x01\xbf\xfc\xec\xc7\x1b\xe7\xcf\x82\x10\xa2\x82\ \xc8\xb2\xac\x0e\x49\x92\x20\x49\x12\x8c\x46\x23\x7c\x3e\x9f\x7a\ \x86\xbb\x31\x37\x6b\xbb\x79\xe3\x16\xba\xf6\x75\xe0\x19\x67\x3b\ \xa2\xb3\x71\x3c\x54\xe7\xc0\x0e\x47\x35\xc2\x7c\x0c\xf1\x78\x02\ \x9f\x7f\x76\x06\x6f\xbf\x73\x0c\x0c\xc3\x68\xb2\x64\x59\x16\x0c\ \xc3\x80\x52\x0a\x86\x61\xc0\x30\x0c\x74\x3a\x9d\xe6\x0c\xf3\xc8\ \xa3\xbb\x86\xbe\xfd\xc6\x3b\x91\x4c\x0a\x44\x5c\x15\xa9\xff\xd7\ \xdf\x70\x3d\xc0\x23\x93\xc9\x62\x69\xf9\x36\xbc\xde\x71\x1c\x38\ \xd4\x85\x83\x87\xf6\x43\x92\x24\x35\xe3\x4d\xb5\x26\x64\x53\x02\ \x00\xc0\xf4\x1f\xeb\xa7\x42\x76\x65\x71\x6c\xec\x22\xad\xae\xb6\ \x13\x86\x10\x88\xe2\x2a\xee\xde\x5d\x45\x62\x61\x09\x1c\x4b\xd1\ \xd7\xf7\x32\x00\x80\x52\x0a\x4a\xa9\x3a\x57\x80\x15\xf0\xb2\x04\ \xe3\x17\x27\xfa\xb7\xd7\x58\xc6\x63\xf3\xf1\xce\xc5\xd4\x32\x5a\ \x5b\x5b\x90\xcd\x0a\x00\x28\x22\x7c\x08\xc7\x8f\xbf\x0a\xab\xd5\ \xa2\x82\x17\x0f\xe5\x26\x95\x08\xb8\xbe\xa3\x2f\xf6\x00\x40\x77\ \xe7\x4b\xe4\xda\xb5\xc0\x17\xed\x6d\x4f\x9d\x08\x05\x79\xf8\xfd\ \x7e\x38\x9d\x4f\xa2\x75\xf7\x63\x9a\x6c\x4b\xb3\x97\x65\x59\x05\ \x2e\x4b\xa0\x4c\xa6\xa6\xc7\x68\x7d\x43\xfd\xc7\x3a\x1d\x7b\xa2\ \x69\x67\x33\xf8\x50\x00\x87\x5f\xe8\x84\x2c\xcb\x1a\xe7\x00\xc0\ \xc6\xc6\x06\x04\x41\x80\xdd\x6e\x07\xcb\xb2\x9b\x12\xd0\x94\xa8\ \x78\x71\xe1\xeb\x33\xe9\x58\x7c\x0e\x14\xc0\xae\xe6\x26\xe8\xf5\ \xff\x38\x42\x29\x4b\x36\x9b\xc5\xc8\xc8\x08\xa6\xae\x5c\x01\x21\ \x44\x53\xb2\x72\xb1\xe9\x4e\x46\x83\x11\x36\x9b\x15\x06\xc3\x36\ \xb5\xce\xb2\x2c\x83\x52\x8a\xe9\xe9\x69\xb0\x2c\x8b\xfd\xdd\xdd\ \x38\x7c\xe4\x88\x46\x8b\x62\x4d\x2a\x12\x58\x6d\x26\xe4\xf2\x79\ \x38\x1c\x35\x1a\x5b\xf2\x3c\x0f\x93\xc9\x8c\xab\x33\x57\xe1\x9b\ \x9c\x84\x5e\xaf\x57\x1b\xac\xb8\xe1\xb6\xd4\x40\x09\x83\x9e\xa0\ \xe3\xd9\xbd\x10\x45\x51\x2d\x4d\x38\x1c\x41\x7e\x6d\x0d\x0b\x89\ \x24\xc2\xe1\x10\x3c\x9e\x93\x6a\x27\x97\xab\x7b\x45\x82\x52\xbf\ \x47\x23\x51\x64\x45\x11\xa9\x54\x0a\xe1\x30\x0f\xb7\xdb\xad\x9e\ \x51\x34\x50\xbe\x0f\x4c\xa0\x44\x38\x1c\xc1\x8a\x98\xc5\x62\x72\ \x09\xd1\x28\x0f\x97\xcb\x05\x8e\xe3\xca\x5a\x55\x69\xb8\xfb\x6a\ \xa0\xfc\x1c\x0c\x06\x61\x36\x5b\x90\x5e\xca\x20\x12\x09\xc1\xe5\ \x72\xa9\x96\x2c\x1d\xa5\xb7\xbe\x2f\x41\x20\x10\xc0\xf6\x5a\x3b\ \x92\xa9\x45\x04\x02\x7f\xc0\xe5\x72\xa9\x4d\x54\x0e\xb4\xf4\xf9\ \xa8\x48\x90\x4e\xa7\x51\x55\x65\x46\x32\x91\xc0\xe5\x4b\x13\x70\ \xbb\xdd\x1a\xbf\x57\x22\x29\x47\xa0\xd1\x60\x70\xf0\xbd\xd7\x9c\ \xce\xe7\x90\x48\x24\x30\x39\xe9\x83\xc7\xe3\xd1\x64\x5e\xfc\x72\ \x16\x6b\xb0\x95\xc0\x1a\x82\x8f\x3e\x3c\xf5\xfa\x2b\xbd\xbd\x5f\ \xce\xc7\xe6\xf1\xd3\x8f\x53\x18\x18\x18\x50\x05\x2d\x16\x50\x99\ \x97\xae\xb7\x7c\x8b\xba\xbb\xf6\xe9\x9f\x6e\x6b\x7f\xb7\xb1\xa1\ \xfe\x54\x2c\x16\x93\x2e\x9c\x3f\x87\xe1\xe1\xe1\x3f\x73\xb9\x1c\ \xd6\xd7\xd7\xb7\x04\x2c\x76\x4c\xf1\xde\xdf\xfb\x6a\xe2\xdc\x6c\ \x24\xf2\xa9\x8e\xe3\xde\xdc\x61\xaf\x21\x9f\x9c\x3e\xfd\xdd\xd0\ \xd0\x50\xef\xcc\xcc\x0c\x87\xff\x2a\x08\x21\x55\x1c\xcb\x7d\x50\ \x5b\x53\xfb\x15\x00\x16\xff\xb7\xf8\x0b\x5c\x7f\x25\x61\x68\x07\ \x46\x1b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x35\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdc\x09\x14\ \x11\x13\x07\x99\x2c\xc9\x3b\x00\x00\x05\xb5\x49\x44\x41\x54\x48\ \xc7\x85\x94\x5b\x6c\x5c\xd5\x15\x86\xff\xbd\xcf\x39\x73\xe6\x62\ \xcf\x8c\x1d\x5f\x12\xe7\x62\x7b\x92\x8c\x33\x76\xb8\x14\x22\x4a\ \x70\x62\x12\x02\x22\xe1\xa1\x79\xea\x03\x15\xd4\x84\xd0\x56\x22\ \x15\x3c\x18\x84\x40\xe2\xa1\x42\x15\x52\x6f\x5c\x84\x78\x44\x40\ \x2f\x28\x22\x0e\x4d\x09\x8e\x08\x22\x02\x6a\xa8\xd3\xc4\x2d\xd4\ \x21\xc6\x97\x38\x19\x27\xc4\x63\x7b\x6c\xcf\xd5\x33\xe7\xec\xbd\ \xd7\xee\xc3\xc4\x83\x27\x4e\xe9\x92\x96\xf4\xe9\x68\xed\xb5\xd6\ \xbf\xd7\xda\x87\xbd\xf5\x56\xaf\x7d\xb2\xaf\xaf\x63\xcd\xfa\x75\ \x3d\xb1\xb6\xb6\x1d\x5e\xaf\xed\x33\x0c\x83\x15\x1d\x17\x8e\x53\ \xb8\x7c\xe1\xe2\xe4\xdf\x66\xbe\xbd\xf2\xd7\x2d\xed\x37\x8d\x3c\ \xf3\xec\xa1\x02\x00\xf4\xf7\xf7\x9b\x96\x65\x05\x18\x63\x01\xc6\ \xd8\xda\xea\xaa\xaa\x28\xe3\xc6\x56\x07\xd6\x4d\x63\x13\x13\xa7\ \xb6\x46\xd6\xff\xc1\x81\x85\xb1\x89\x09\x98\x0c\x78\xf9\xe7\x8f\ \xff\xe2\x61\xc6\x8d\x40\x26\x93\x47\x28\x54\x85\xa2\xe3\x60\x7e\ \x2e\x8d\x86\xd5\x0d\x75\x1b\x5a\x5a\x7f\xe0\xb5\x3d\xcf\x0d\x9f\ \x3f\xff\x75\x3c\x1e\xff\xd2\xef\xf7\xb7\xdd\x7c\xf3\x2d\xf5\x1e\ \x8f\x55\xed\x31\x8d\xa0\x20\xe6\x5b\x94\x80\xab\x19\x2c\x83\x21\ \x91\xce\x5e\x0d\xaf\xdb\xb8\xc4\xe0\xc9\xf9\x74\x64\x4b\x7b\x2c\ \xa0\xc4\xa2\x9e\x8c\x8f\x21\x7e\x69\x14\x97\x26\x86\x31\x71\xe1\ \x3c\x12\x53\x71\xac\xaa\xad\x85\x14\xca\x1a\xf8\x7c\xe0\xd6\xe6\ \xe6\xe6\x47\xea\xeb\xeb\xb7\x07\x83\xd5\x9b\x3c\xb6\xdd\xb8\xe0\ \x30\xdf\x9c\x03\x28\x6e\xc0\xf6\x18\x50\x9a\x40\xa4\xd9\x32\x86\ \x39\x71\x61\x3c\x74\x71\xe2\x32\x76\xed\xde\x81\x3b\x7e\xb8\x0d\ \x63\xe3\x93\x58\xdd\xd8\x80\xfa\x86\x30\x46\xbe\x89\x63\x72\xf2\ \x0a\x5e\xfa\xfd\xab\x78\xe2\xc9\x83\x58\x6e\x89\x54\x11\x0e\xb7\ \x10\xf0\x9a\x20\x0d\xb8\x0a\x50\x0a\x50\x54\xc9\x7c\xe3\xa6\xd6\ \xdf\x1e\x7e\xa7\xb7\xef\xea\xd5\x34\xcb\xe5\x73\xfa\xcc\xd9\x7f\ \x63\xe8\xdc\x37\x48\x26\xb3\x98\x9e\x99\x43\x6f\xef\x71\xdc\xbf\ \x6f\x37\xf6\x3d\x70\x1f\xb4\xd6\x20\x22\xb8\xc5\x45\xcc\xa7\x73\ \xf0\x59\x06\x5c\x05\x08\x02\x24\x01\x2e\xad\x64\xde\xfd\x68\xb7\ \x4e\x67\x33\x89\x23\x47\x8e\xe9\x70\xb8\x8e\x71\xc6\x74\x2e\x97\ \xc7\xc2\x42\x1e\x57\xbe\x9d\x86\x69\x68\x1c\x38\xf0\x60\xb9\xf3\ \x62\xa1\x80\xc5\xc5\x02\x66\x12\x53\x50\x04\x08\x55\x72\x57\x01\ \x52\x69\x48\x5d\xc9\xfc\xf8\xb1\xbe\xee\x9a\xda\xea\xe3\xf1\x4b\ \x93\x77\x27\xa6\x66\x10\x8b\xb5\xb1\x6c\x36\xad\x01\x8d\xb1\x91\ \x61\x3c\x7e\xa8\x1b\xa1\x50\xb0\x5c\x40\x2a\x55\x66\x0d\x94\x15\ \xb8\x4a\x97\x12\xcb\x4a\xe6\x0f\x3f\xb4\x7f\xff\xef\x7e\xf3\xfc\ \x7b\x5f\xfe\xeb\xab\xfe\xc1\xc1\x73\xaf\xac\x6b\xda\x00\xe1\x0a\ \x76\xe6\xcc\x19\x74\x76\xde\x8e\x8e\x8e\x2d\xb8\xb1\x69\x90\xd6\ \x10\x54\x72\x57\x2a\x08\x22\x28\x4d\x15\xcc\x97\xc2\x3f\xfe\xe4\ \x5d\x7d\xb4\xf7\xd8\xaf\xff\x33\xf4\xf5\x70\x73\x4b\x04\xe9\xd4\ \x1c\xba\xba\xee\x84\xd6\x1a\x5a\xeb\x1b\xa4\x07\x14\x69\x28\x45\ \x10\x92\xe0\x0a\x09\xa9\x34\x94\xd2\x15\xcc\x97\x1f\xfa\xe3\x9f\ \x5e\x99\x1d\x38\xfd\xcf\xf7\x35\xa0\x23\x1b\x5b\x60\xdb\x9e\xef\ \x12\x5e\x2b\xb4\xdc\x4b\x33\xd0\x70\x5c\x01\xa1\x34\xa4\xd2\x28\ \x08\xaa\x60\xf3\xfa\xce\x56\xd5\x86\xc3\xa1\x50\x10\xb9\x8c\x2a\ \x27\x62\x8c\xdd\xf0\x92\x88\x08\x8e\xab\x40\xa4\x60\x30\xa0\x28\ \x35\x52\x05\x05\xa5\xa8\xcc\xfc\xfa\x43\x35\x75\xab\x3e\x9f\x9b\ \x9f\x4f\x37\xae\xae\xfb\xde\xee\x35\x00\xa9\x08\x8e\x2b\x20\x25\ \x41\x29\xc2\xc2\xa2\x42\xc1\x51\x15\xbc\x42\x41\xf7\x43\xfb\xdf\ \xde\xb9\x73\x67\xf6\xc4\x89\x13\x47\x97\x92\x03\x58\xa1\x82\x88\ \x20\x84\x82\x2b\x08\x06\x07\x8a\x42\x23\x99\x13\x50\x44\xc8\x39\ \xaa\xcc\xe6\x8d\xa4\x77\x76\x76\xfa\x4d\xd3\xac\x18\xee\x12\x6b\ \xad\xa1\x94\x84\x14\x6e\x69\x83\x14\x81\x08\x98\xce\x49\xb8\x82\ \x40\x44\x48\x64\x44\x99\x57\x14\xf8\xd9\xc1\x83\xdb\x5f\x7b\xfd\ \xf5\xb7\x0d\xc3\x00\x11\x95\xbf\x33\xc6\xa0\xb5\x86\x10\x02\x45\ \xc7\x45\x7b\x6b\x13\x06\xc6\xc6\xb1\xa1\xb9\x15\x7d\x83\x1f\x61\ \x74\xa6\x0f\x5c\x99\xf0\x88\x75\x1b\xeb\xd7\x6f\x02\x67\x00\xa9\ \x6b\x33\x88\x45\xa3\x3c\x16\x8d\x5a\x00\x90\xcd\x64\x1a\x6c\xdb\ \xe6\xcb\xbb\x27\x22\xb8\xae\x0b\xc7\x71\x60\x59\x16\x38\x37\xe0\ \x35\x34\x2c\x2a\x60\x36\x27\x90\xd7\x05\xac\xdf\x6b\xa3\x75\x5b\ \x15\x0c\x93\x6c\xad\x08\x52\x96\x66\xc1\x63\xd1\x68\x10\x40\x18\ \x40\x6d\xa4\xb9\xb9\x0e\x8c\x55\x13\x11\xa4\x94\x10\x42\xc0\x71\ \x1c\xb8\xae\x0b\xa5\x4a\x5b\x65\x9a\x26\x38\xe7\x20\x5d\x5a\x51\ \x21\x15\x0c\x6e\xa1\x6a\x4d\x15\x32\xb5\x69\x68\x18\x52\xaa\x52\ \x72\xa5\x4a\x57\xe4\x07\x10\x04\x60\x00\x10\x5a\xeb\x80\x10\x02\ \x52\xca\xca\x87\x75\xdd\x63\xeb\x1f\xff\x02\x23\x99\x24\x02\x32\ \x89\xa2\x13\x87\x8d\x22\x52\x7c\x16\x4a\xd9\x4d\xa7\x07\x9f\x7a\ \x0c\x9c\xd9\x73\xe9\xe4\x82\x09\x60\x16\x80\x17\x40\x23\x00\xa9\ \xb5\xf6\xff\xaf\xd7\xbb\xbc\xd8\x9b\x43\x6f\x62\xec\x9e\xb3\xb8\ \x73\xf3\x5d\x68\xc0\x1a\x0c\xa5\x47\x90\x1b\x29\xa0\xa6\xdd\x89\ \x54\xd7\x56\xbd\xe6\x5b\xf4\x1b\xb9\x2f\xac\x0b\xe6\xf0\xe8\xa8\ \x8a\x45\xa3\xf3\x00\x5a\x00\xf0\x6b\x8a\xca\x43\x5d\xa1\x80\x31\ \xf8\x7c\x3e\xe8\x02\xc3\xd4\x87\x59\x7c\x30\x7e\x12\x6e\x58\x6a\ \xef\x45\x8e\xa6\xd0\x1a\xd8\x6d\xb6\xf6\x05\x2c\x64\x33\x12\xc2\ \x23\xca\x5b\xe4\x02\x28\x00\x68\xe4\x9c\xfb\xbc\x5e\x2f\x84\x10\ \x2b\x54\x24\x12\x09\x10\xd1\xa5\x73\x43\x43\x27\x3c\x53\x06\x6b\ \x33\xef\xd9\xb0\xa9\x66\xe7\xda\xa1\x73\x83\x9e\x2b\x35\x1f\xb4\ \xcd\xdf\x3a\x4d\x4d\x27\x63\x87\x33\x45\xfe\x89\x64\xc2\x96\x49\ \x5a\x30\x01\x60\x78\x74\xb4\x18\x8b\x46\x07\x4d\xd3\x6c\xbb\x3c\ \x39\xd9\xf0\xde\xd1\xa3\x9f\xee\xde\xb3\x67\xc7\xcc\xf4\x34\x93\ \x52\xce\x16\x0a\x85\x81\x64\x32\x79\xaa\xab\xab\xeb\x1f\x83\x67\ \xcf\x7e\x15\x0c\x85\xdc\xc3\x2f\x1e\x41\xf4\xbe\xee\x03\x7b\x3b\ \x7f\xfa\x93\xf3\x23\x57\x93\x9e\x6d\x3a\x12\x6e\x09\x81\x3e\xa3\ \x53\x23\x47\xc4\x1b\xa3\xa7\xfb\x56\xfe\x06\xb6\x6c\xde\xcc\x36\ \x47\x22\xfe\xd5\xf5\xf5\xfc\xe9\x9e\x9e\x5d\xf9\x7c\xbe\x23\x95\ \x4a\xf9\x9f\xee\xe9\x41\x3e\x9f\x47\x2a\x95\xaa\x88\x6f\xe9\x7a\ \xf0\xb1\xb5\xdd\x7f\xfe\xe5\x1d\xbf\xda\xfe\xe4\xaa\x63\x5e\xd1\ \x71\xb9\x41\xdc\xfb\xf2\x9e\x43\xcb\x63\xd8\xf7\x0d\xf3\xff\x59\ \xfb\xd6\xdb\x02\x5a\x16\xdd\xda\x1f\xd5\xfd\x38\x1b\x9e\x7f\xde\ \xe3\xb3\xe0\x9b\x09\xbe\xf0\xf7\x17\x3f\xfd\xcb\x52\xcc\x7f\x01\ \x6c\x42\xab\xe5\xca\x5a\xa1\xde\x00\x00\x00\x00\x49\x45\x4e\x44\ \xae\x42\x60\x82\ \x00\x00\x04\x68\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdc\x09\x14\ \x11\x0a\x0b\x0b\x9a\x2c\x08\x00\x00\x03\xe8\x49\x44\x41\x54\x48\ \xc7\xa5\x96\x4d\x6f\x1b\x55\x14\x86\xdf\x7b\xaf\x8d\x9d\x38\xae\ \x1d\x37\x6d\xa1\xb1\x49\x54\x22\x25\x81\x96\x0d\x25\x69\x51\x05\ \x54\x50\x55\x61\x93\x4a\xac\x00\x75\x41\x37\x88\x35\x0b\x7e\x41\ \x60\x85\x8a\xfa\x0b\xa8\xc4\x8e\x86\x28\x80\xba\x60\xd3\x48\xac\ \x20\x48\xe4\xab\x6d\x6a\x7b\xc6\x33\xe3\x38\x8e\xed\xd8\xb1\x87\ \xb1\xe3\xb1\x67\xee\x61\x61\xc7\x75\x8a\x10\x71\x7a\xa4\x77\x33\ \xd2\x3d\xef\x39\xe7\xb9\x1f\xc3\x00\xe0\xee\xdd\x79\xdf\xaf\xf7\ \xef\xbf\xf6\x52\x2c\xfa\xc5\xe4\xf8\xf8\x15\xbf\xdf\xd7\x27\x84\ \x60\xb5\xfd\xba\xa7\x56\xb3\xac\xa4\xaa\xae\x98\xe5\xc2\xaa\xd7\ \x2b\x76\x5c\xe9\x36\x89\x24\x5c\xd7\x85\xeb\x4a\x00\x84\x67\x83\ \x73\xce\x2d\xcb\xb2\x16\x17\x17\xbf\x67\x5f\xcd\x7d\xeb\x8f\x46\ \x63\xb7\x47\x46\x63\x37\x19\x17\x01\xd3\xac\x22\x14\x1a\x40\xdd\ \xb6\x51\x2a\x56\x10\x0c\xfa\xc1\x18\x47\x7f\x9f\x0f\x7b\xa5\x22\ \x66\x6f\xcc\xe0\x28\xb1\xb4\xb4\x54\x9e\x99\xf9\xe0\x14\x7f\xf0\ \xe0\x37\xbe\x5b\xaa\x9c\x9b\x78\x75\x32\xe0\x36\x6b\x64\xe8\x09\ \xe8\x5a\x1c\x9a\xfa\x18\xaa\xf2\x08\x3b\x59\x1d\x27\x23\x11\x34\ \x6c\x07\x3f\xfe\xb0\x80\x5a\x6d\xff\x7f\xe5\x38\x2e\x6c\xdb\x66\ \x04\x62\x9e\xf1\x89\xb1\x68\x22\xfe\x64\x28\xa5\xa6\xf1\xee\xd5\ \x2b\x98\x9a\xbe\x88\x44\xd2\xc0\x8b\x67\x4e\xe3\xd4\xe9\x30\x9e\ \x6c\xea\x30\x8c\x2d\xdc\xfe\xe6\x0e\x3e\xfb\xfc\x26\x8e\x1e\x0c\ \x0c\x20\x5e\xdc\x33\x3f\x9d\x9d\xbd\x76\x76\x75\x65\x05\xdb\xdb\ \x15\x66\x55\x2d\x2c\xff\xf9\x17\xd6\x37\x36\xb1\xbb\xfb\x37\x72\ \xf9\x22\xe6\xe7\x7f\xc1\xfb\xd7\xde\xc6\xf5\xeb\xef\xa1\xd7\xe0\ \xa1\x13\xe1\xd1\x91\xd1\x51\xe9\xf5\x7a\x70\xef\xde\x22\xc2\xe1\ \x21\x70\xc6\x60\x59\x55\x94\x4a\x16\xb6\x32\x39\x08\x2e\xf1\xf1\ \x27\x1f\x82\x88\x8e\xae\x36\x7c\xcf\xc9\x48\xf8\xeb\xe5\x3f\x56\ \xae\x5e\x7c\xf3\x02\x04\x17\xd8\xc9\xe6\x31\x39\x39\x8e\x64\x52\ \x01\x63\x40\x7c\xf3\x31\x6e\xdd\xfa\x08\xc1\x60\x10\x52\xd2\x91\ \xaa\x96\x92\x40\xb2\xdd\xc1\xdc\xdc\x97\x6b\x6b\x6b\xbf\x7f\x77\ \xe1\xfc\x04\x46\x46\x86\x51\x28\xec\x22\x7a\xf6\x65\x34\x1b\x4d\ \x2c\x2f\x2f\x63\x7a\xea\x75\x8c\x4f\xbc\x02\x22\xd9\xb3\x00\x80\ \x03\x80\xa2\x24\xe3\x07\xee\xc3\xc3\x43\x48\x2a\x0a\x46\x46\xcf\ \x21\x6d\xa4\x70\xf9\xad\x37\x8e\x95\x9c\xa8\x3d\x22\x00\x30\x0c\ \x23\x55\xaf\xdb\x20\x00\x81\x40\x3f\xaa\x35\x13\xfe\xbe\x20\x06\ \x07\x43\xf0\x7a\xbd\x70\x1c\xa7\x27\xb0\xad\x51\xd2\xd3\x0e\x32\ \x99\x4c\xba\x5c\x2e\xd7\x19\x00\x22\x82\x47\x70\x84\x42\x27\xe0\ \xef\xeb\xeb\x0d\xec\x21\xe1\xa9\x41\x2e\x97\xdb\xd6\x75\x7d\x4b\ \x08\x01\x22\x42\x34\x36\x0c\xcb\xb2\x10\x0e\x9f\x80\x24\x3a\xb6\ \x3a\x06\x44\x54\x53\x14\x25\xc5\x85\x80\x94\x12\xb1\xe8\x19\x8c\ \xc4\x22\x88\x44\x06\x20\xa5\x3c\x96\xa8\xdb\xa0\x05\x5a\x49\x72\ \xc6\x40\x1d\x77\x7a\x8e\xf1\x10\xd0\x0d\x19\x00\x56\x57\x57\xd6\ \x5c\xd7\x85\x24\x02\x97\x84\x03\x4e\x9d\x05\x3d\x42\xee\x1c\xb4\ \x83\x8f\xaa\xaa\xc6\x6b\xb5\x1a\x40\x04\x82\x04\xc9\x76\x35\x52\ \x82\xa4\xec\xc9\x80\xa4\xdb\x81\xdc\x31\xc8\x66\xb3\x86\x69\x9a\ \xf5\xc0\xc0\x80\x5f\x76\xb5\xda\x0d\xec\xc8\x1d\x74\x75\xdd\x61\ \x50\x2a\x95\xf2\xf9\x42\x61\x97\x73\x0e\x92\x04\x40\x42\xd2\x73\ \x72\xe8\x36\x68\x34\x1a\xa6\xa1\xeb\xba\xe0\x1c\x44\x12\x52\xa2\ \x03\xea\xbf\x2e\x63\x06\x06\xc6\x5a\x6a\xbf\x64\x10\x42\xb4\xc5\ \x01\x80\xf1\xee\x45\x0f\x1f\x6e\x3c\xe2\x9c\x77\x2a\x6f\x36\x9b\ \x60\x00\x04\xe7\xff\x12\x63\x00\x18\x81\xb5\x13\xfb\x7c\x2f\x80\ \xa4\xeb\x36\x1b\x8d\x66\xc3\xae\xcb\x52\xb1\x64\x03\x20\x4f\xb7\ \x81\xa2\xa8\x71\x02\x20\xa5\x84\xcf\xd7\xba\x22\x16\x16\x16\x5a\ \xc9\xc0\xc0\x85\x80\x47\x08\x70\xde\xaa\xcb\x95\x12\x76\xbd\x8e\ \x72\xa5\xe2\x38\x8e\x53\xf9\xf9\xa7\xc5\x3b\x5e\xaf\xb7\x56\xad\ \x56\xb7\x38\xe7\x0d\xdb\xb6\xdd\x43\x06\xc9\x64\x62\xb3\xd9\x68\ \x40\x70\x81\xfe\x40\x10\x53\x53\xd3\xb8\x74\xe9\x32\x1c\xd7\xc1\ \xfe\xfe\x3e\xf6\x4a\x7b\xcd\x94\x96\xda\x56\x55\x55\xd3\x75\x2d\ \x65\xe8\x86\xa2\x69\x9a\x92\x4e\x1b\x49\xd3\x34\xd3\x52\xca\xdc\ \xb3\x7f\x01\x87\x0c\x54\x55\x4d\xe4\xf3\x05\xdb\x71\x1d\xca\x66\ \xb3\x3b\x9a\xa6\xe9\x1b\xeb\xeb\x9b\x29\x2d\x95\x30\x0c\x43\xd9\ \xce\x64\xf4\x62\xb1\xb8\x45\x44\x25\x00\x6e\xcf\xcf\x9b\xc7\xe3\ \xf1\x8d\x8d\x8d\xbd\x33\x38\x38\x78\x9e\x73\x1e\xe9\xde\x04\xc7\ \x8d\x7f\x00\xae\x78\x85\xc4\xff\x99\x5a\x29\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\xe7\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01\ \x42\x28\x9b\x78\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdc\x09\x14\ \x11\x0b\x26\x57\x5e\x41\x3c\x00\x00\x04\x67\x49\x44\x41\x54\x48\ \xc7\x95\x54\x6b\x4c\x5b\x65\x18\x7e\xbe\xef\x14\xce\x29\xb4\x05\ \xe4\xde\x71\x2b\x05\xb9\xd5\x18\x75\x9b\x31\xb0\xb8\x39\x27\x2a\ \x31\x2e\x9a\x28\x44\x1c\xd9\x16\x13\xe3\xbf\xe9\x0f\x7e\x6a\xe2\ \x70\x89\xc6\xcc\x99\xa8\x71\xfe\x5a\xcc\x5c\xcc\x86\x66\x1b\xc1\ \xf0\x63\x01\x22\x57\xd1\xcd\x80\x0c\x58\x91\x6b\x81\x16\x68\x4f\ \x4f\xef\xb4\x3d\xfd\xfc\x01\xd4\xd3\x96\x32\xfd\x92\x2f\xdf\x25\ \xe7\x3c\xcf\xfb\x3c\xe7\x39\x2f\x01\x80\x2b\x57\x3a\xf9\xdb\x3f\ \xff\xf4\x78\xb1\xa1\xec\x83\xba\x9a\xda\x67\x04\x81\x57\x73\x1c\ \x47\x02\x5b\x41\x04\x02\x3e\xcb\x8c\x79\xae\x7b\xde\x3c\xdd\xb5\ \x61\x5f\x37\x0f\x0d\xf7\xfb\xb1\xff\x60\x00\x82\x00\x42\x00\x40\ \x3e\xe9\xf8\x42\x28\x2a\x2a\xbe\x58\x5c\x72\xa0\x8d\x53\xa5\xa8\ \x5d\x2e\x2f\x32\x32\x34\x08\x6c\x6d\xc1\x61\x97\xa0\xd5\x0a\x20\ \x84\x42\xe0\x53\xe5\xe9\xfb\x93\x0b\x4f\x1e\x34\xf5\x25\x85\x26\ \x04\xa1\x50\x28\xd0\xde\xde\x7e\x79\x70\x60\x60\x1c\x00\x54\xbd\ \xbd\xbf\xd2\x97\x9a\x9a\xca\x1b\x5f\x7e\x41\x7d\x7f\xe2\x4f\x2c\ \x2d\x9a\xa1\xd3\xa5\xc3\xef\xf7\x61\x73\xd3\x89\xfc\xfc\x6c\x98\ \x4c\x4f\x41\x72\x4a\xdc\xd0\xe0\x88\xb1\xf5\xd4\x1b\x46\x10\x02\ \xa2\x00\x8d\x6e\x01\x84\xc3\x61\x7f\x4e\x76\xf6\x2d\x00\xdb\x04\ \xb5\x75\xd5\x07\xe6\xfe\x9e\xcd\x98\x9f\x5b\xc6\xb3\x47\xeb\x71\ \xf8\xe9\x83\x30\xcf\x2e\xa1\x20\x3f\x0f\xb9\x79\x99\x98\x99\x5e\ \xc4\xd2\x92\x05\x17\x3f\xff\x12\x67\xdf\x69\x81\x2c\xcb\x20\x84\ \x44\x81\x49\x8c\x00\x82\x48\x24\x12\xda\xb1\x09\x00\x40\x25\xb7\ \xaf\xd9\x58\x61\xf8\xec\xea\xf7\xd7\x7e\x5b\x5b\x73\xc1\xe3\xf5\ \x60\xec\xf7\x7b\x98\xf8\x6b\x1a\x9b\x9b\x6e\xd8\xd6\xed\xe8\xec\ \xec\xc2\xb1\xe3\xf5\x68\x7c\xf1\x38\x28\xa5\x20\x94\x82\xc6\x4d\ \x6e\x67\x25\x84\xc4\xb8\x46\xd3\xd4\xe9\x55\x6d\x67\xda\x98\xcb\ \xe3\x12\x6f\xdc\xb8\x89\xcc\xcc\x1c\x50\x42\xe0\xf1\x78\x21\x8a\ \x5e\x58\x56\x6c\xe0\x68\x04\xad\x6f\xbd\x0e\x4a\xc8\xbf\xa0\xca\ \xfd\x0e\x29\x21\x24\x91\x20\x2b\x53\xfb\x69\xd7\xcd\xee\xb6\x54\ \x1e\x23\x47\x8e\x3c\xe1\xb5\xae\xad\xa3\xa6\xa6\x0a\x6e\xb7\x04\ \x80\xe1\xc1\xf4\x14\xce\x9c\x6d\x46\x66\x56\x66\x14\x84\x12\xb2\ \xad\x62\x77\x55\x12\xc5\x13\x74\x74\xb4\x8f\x9f\x7a\xfb\xe4\xab\ \xeb\xd6\x85\xc1\x92\x12\xbd\x6c\xb5\xd9\x50\xa4\x2f\x41\x28\x18\ \xc2\xd8\xd8\x18\x0e\x1d\x32\xa1\xb6\xae\x2a\x0a\x4c\xf7\xb0\x67\ \x5f\x82\x98\x03\xa5\xd0\x17\x66\xc3\x3c\x3b\x8b\xd2\xb2\x72\x38\ \x45\x3b\x1a\x1a\x0e\x27\x54\x1a\x55\xa1\x4c\x93\xe2\x43\x2b\x49\ \x68\x7c\x8e\x75\x3a\x0d\xbc\x3e\x09\x0c\x80\xb1\xa2\x0c\x82\xc0\ \xc7\x02\x2a\x00\x48\xdc\x5d\x7c\xf5\x00\xa0\x8a\xc1\xdf\x79\x29\ \x45\xa5\x42\x46\x86\x0e\x1e\x77\x64\x1b\x3c\x4e\x7a\xb2\xfd\x5e\ \xe7\x04\x05\x84\x10\x94\x94\x16\xc1\xe7\xf7\xa1\xb0\x30\x37\x06\ \x7c\xaf\xea\xf7\x52\xf2\x50\x05\x65\xa5\x7a\x18\x0c\x34\x6a\x8b\ \xb2\xb2\xff\x53\x7d\x02\x81\xb2\x9a\xfd\xc0\x63\x56\xc6\x62\xda\ \x05\x08\x01\x63\x6c\x6f\x8b\x76\x5b\x40\x32\x1b\x94\xcf\x80\x31\ \x38\x86\x87\x30\xff\xed\xd7\xf0\x2e\x2c\x80\xed\xf4\x87\xb0\x24\ \xa5\xbe\x26\x6e\xbe\xdb\x7f\xac\xe1\xf4\x45\x20\x35\x51\xc1\x1e\ \x51\x8b\xb7\x80\x00\xb0\xf5\xde\x81\x74\xfd\x07\xa8\xd5\x69\x58\ \x5c\xb1\x20\xab\xb9\x15\x9c\x46\x03\xfb\xf5\x6b\x42\xfd\x63\xd5\ \x27\x65\xff\x56\x43\xe5\xdc\x5c\x96\x2a\x29\x48\x9c\xd7\xca\x7b\ \xc6\x18\xac\x83\x03\x48\xf5\x3a\x41\x54\x6a\xb0\x55\x0b\xee\x7e\ \x73\x09\x8c\x17\x50\xe4\xd8\x80\x36\x2d\x8b\x06\xd3\x68\x1e\xd5\ \x69\x1b\x55\xf1\x29\x4a\x46\xa2\x3c\x33\xc6\xa0\x6b\x7a\x05\x8e\ \x1f\x45\xf8\xcc\x33\x50\x41\x80\x8e\x13\x11\xe1\x08\xa8\x9c\x02\ \xbb\x7f\x2d\xb2\xb9\xb2\xdc\xef\x58\xdf\xf8\x90\x26\x53\xb0\x5f\ \x32\xc2\xe1\x30\xb8\xfc\x02\x18\xdf\x7b\x1f\x72\xb9\x11\x5e\x69\ \x15\x29\x4b\x36\x08\xab\x22\x02\x21\x89\x2d\x2f\x3d\x18\x99\xff\ \x63\xe2\x5c\xab\xcd\x31\x92\x10\xd3\x87\x0d\xc6\x18\xc2\xe1\x30\ \x42\xc1\x20\x38\xad\x0e\x2c\x4d\x83\x88\x68\x47\x64\x6e\x03\x61\ \xaf\x1f\x29\x86\x6c\xf8\x08\x75\x6e\x04\x42\xce\x84\x14\x29\xe3\ \x95\x4c\x19\x63\x0c\xb2\x2c\x23\xe0\x74\x62\xf2\xbb\xaf\x40\x7f\ \xb9\x85\x1c\xf3\x2a\xe4\x2c\x0d\xb6\x2a\xf4\xc8\x5e\x73\x93\x8a\ \x08\x7d\xde\x58\x53\x76\xfe\x42\x41\x7e\xb9\x4a\x01\x40\x38\x8e\ \x4b\xe1\x38\x2e\xe9\x1f\xbb\xdb\x10\x29\xe5\xb0\x72\xa7\x07\x79\ \x3d\xdd\x28\x99\x5e\xc4\x72\x6e\x2e\x7a\x34\xea\x61\x49\x8e\x88\ \x6f\x16\xe9\x4f\x98\x2c\x6b\xa9\xe9\x95\x86\x16\x54\xea\xf9\x28\ \x81\xd5\x6a\xdd\x18\x1d\x1d\xbd\xca\xf3\xbc\xb0\x5f\xa2\x22\x8c\ \xc1\x1f\xd8\xc2\xd4\xdd\x7b\xbc\xce\x1f\x3c\x6a\x7f\xb4\x32\xb7\ \x5f\x96\xfb\xc6\x2d\xab\xe7\x3c\xa2\x24\xf6\x99\x6a\x3e\x7e\xa4\ \xba\xb2\x85\x50\xea\x0f\x4a\x2e\x8b\xd2\x76\x61\x67\xfe\xd7\xa1\ \xba\x54\x55\xde\x06\x9e\x3f\x31\x69\xb1\x7e\x74\xd9\x21\x8e\x00\ \xc0\x69\xad\xd6\xf0\x9c\xa9\xe6\x02\x75\xb9\x57\xc6\x26\xa7\xce\ \xff\x03\x89\xf8\xb0\x39\x0e\x96\x4d\xd6\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x04\x38\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdc\x09\x14\ \x11\x15\x13\xd5\xac\xba\xc0\x00\x00\x03\xb8\x49\x44\x41\x54\x48\ \xc7\xad\x55\x6d\x68\x5b\x55\x18\x7e\xce\xb9\x1f\xb9\x31\xcd\x87\ \xdd\x4c\xd7\xd0\xda\xae\xd3\xa5\xdd\x87\x22\x9b\x86\x4a\xa1\xab\ \x93\x6d\xa8\xd0\xb1\xa9\x08\xb2\x16\x2a\x4c\xa1\xea\x04\x41\xc5\ \xff\xc3\x1f\x22\xce\x81\x54\x7f\x49\xfd\x40\x84\x06\x56\x29\x29\ \xce\x8f\xcd\xfe\x18\x6c\x71\x38\x68\x48\xd3\x2e\x59\x6d\xda\x6d\ \x6d\x9a\x36\xbd\xc9\x4d\xd2\x24\xbd\xf7\xf8\xeb\xc6\x9b\x34\x49\ \x3b\xf0\x85\x03\xef\xfb\xde\x7b\x9f\xe7\x3d\xcf\xfb\x9e\x73\xc9\ \xf0\xb0\xd7\x74\xd9\xe7\xdb\xdf\xd8\xdc\xf4\x7e\x87\xdb\xdd\x25\ \x49\x26\x33\xc7\x71\x64\x3d\x97\x47\x2e\x97\x9d\x8f\xcc\x46\x7f\ \x8e\xdd\x5d\xb8\xd4\xbe\xef\xe0\xf4\x47\x1f\xbf\x9d\xc5\x03\x1a\ \xf9\x76\xd8\x3b\xd4\xd2\xda\x7c\x86\x50\xce\x92\x4c\xa6\x61\xb7\ \xd7\x61\x3d\x97\xc3\xea\x8a\x0c\xab\x55\x02\x21\x14\x26\x51\xc0\ \x54\x30\x80\xa6\x66\xe7\xb6\x81\x7b\x7b\x7b\x09\x00\xf0\xf1\x55\ \xb9\xed\xf8\x0b\xc7\x2c\xc1\xc9\x5b\x2c\x3a\x77\x9b\xd8\x6c\x16\ \x64\xb3\x19\xc4\xe3\x6b\x68\x68\xd8\x81\x03\x07\x0e\x41\x5e\x93\ \x71\xfd\x9a\x1f\x6f\x7d\x37\x04\x42\x48\x11\x44\xd3\xb4\xe2\x52\ \x55\x15\xaa\xaa\x42\x92\x24\x8c\x8f\x8f\x17\xdf\xe1\xef\x44\xc2\ \xf6\xd9\x3b\xf3\x38\xd2\xd3\x85\x67\x3c\x87\x71\x3b\x1c\xc5\xae\ \x06\x27\x1e\x71\x3a\x30\x1d\x9a\x43\x34\xba\x80\xcf\x3f\xbb\x88\ \x77\xde\x1d\x00\xa5\xb4\xa4\x4a\x8e\xe3\x40\x29\x05\x63\x0c\x94\ \x52\x50\x4a\x21\x08\x42\xc9\x3b\x74\xcf\x63\xbb\x3f\xfd\xe9\x47\ \xaf\xef\xde\x3d\x99\x28\x69\x85\xf9\xff\xfa\x1b\x93\x81\x10\xe2\ \xf1\x14\x96\x62\x2b\xf0\x7a\xc7\x70\xec\xc4\x11\x1c\x3f\x71\x14\ \xaa\xaa\x16\x2b\xde\xa4\x35\x21\x9b\x0a\x00\x00\xda\x3f\xd0\xcf\ \xe4\x54\x72\x71\x64\x64\x94\x39\x1c\x3b\x09\x25\x04\x8a\x92\x46\ \x22\x91\xc6\xc2\xdd\x25\xf0\x1c\x43\x5f\xdf\xab\x00\x00\xc6\x18\ \x18\x63\x45\x5f\x07\xd6\xc1\x2b\x12\x8c\x8d\xfa\xfa\x1f\xae\xb7\ \x8e\xcd\xfd\x13\xed\x5e\xbc\x1f\x43\x47\x87\x1b\xa9\x94\x0c\x80\ \x61\x26\x34\x85\xb3\x67\x5f\x87\xcd\x66\x2d\x82\x1b\x97\xbe\x93\ \x5a\x04\x7c\xdf\x99\x93\xbd\x00\xf0\x5c\xf7\xcb\xe4\xe6\xcd\xc0\ \x17\x87\x0f\x3d\x75\x6e\x2a\x18\x82\xdf\xef\x87\xc7\xf3\x04\x3a\ \xf6\xed\x2d\xa9\xb6\xbc\x7a\x4d\xd3\x8a\xc0\x15\x09\x74\xe7\x8f\ \x3f\x47\x98\xab\xc9\x75\x5e\x10\xb8\x73\x2d\xad\x6d\x08\x4d\x05\ \xf0\xd2\x8b\xdd\xd0\x34\xad\x64\x72\x74\x60\x23\x49\x79\x01\x25\ \x12\x19\x83\xef\x7f\xb8\xb8\x3c\x17\x8d\x80\x01\xd8\xdd\xd6\x02\ \x51\xfc\x6f\x22\xca\xe5\xa9\x96\xab\xba\x03\xdd\x24\x93\x04\xbb\ \xdd\x86\xa4\xbc\x51\xfc\x50\x6f\xa4\x91\xcc\x98\xd3\x63\xa3\x5c\ \x55\x09\x6c\x76\x0b\x32\xd9\x2c\x9c\xce\x7a\xa8\xaa\x5a\x02\xa4\ \xfb\x7a\xac\x83\x19\xf3\x5b\x12\x98\x44\x82\xae\xce\x83\x50\x14\ \x65\x53\x43\x8d\x32\xe8\x15\x57\xd2\xbd\x26\x41\xf9\xbc\x57\x6b\ \xa8\x31\x2e\xcf\x6f\x49\x60\x24\xaa\x36\x29\xc6\xf8\xb7\x5b\xbf\ \x63\x74\xf2\x12\xa8\xc6\xe3\xf4\xd3\xa7\xb6\xbf\x83\x5a\xd5\x1b\ \x2d\x47\x73\xb0\xf5\x08\x10\x97\xcc\xc8\x6b\xf9\xea\x63\x5a\x69\ \x24\x2b\x5d\x11\xe5\xbe\x49\x10\x61\x75\x59\x90\xaa\x97\x21\xf0\ \xc2\x83\xf5\xa0\xd2\xa5\xc6\x18\xc3\x95\xe0\x55\x14\x84\x3c\xea\ \x60\x45\x78\x25\x8c\xfc\xde\x1c\x12\x34\x86\xc0\x7c\x00\x6c\x55\ \xc3\xe9\x4f\x5e\x19\x5c\x91\xe3\x09\xbe\x96\xf6\xb5\x9a\xfb\xb5\ \x7f\x08\x33\x3d\x37\xd0\xf9\x78\x27\x9c\x70\x61\x46\x0e\x41\x99\ \xce\x62\x5d\xfc\x15\xd6\xf6\x3a\xec\x6c\x31\x5f\x50\xae\x09\x91\ \x8a\x04\x94\xd2\x8a\xf3\x6f\xf4\xd5\x0c\xc3\xfd\x5f\x92\xf0\x85\ \x2f\x23\xef\x50\x21\xce\x52\xb8\xec\x8d\x30\xbb\x1f\x82\x59\x12\ \x90\x57\xf2\x28\x88\x85\xca\x12\x65\x32\x99\x8d\x4c\x26\x53\x72\ \x80\xca\x09\xde\xf0\x0c\x90\x53\xec\x24\xe1\x78\x8a\xc0\x62\x90\ \x7c\x93\xfd\x8a\xac\x3d\xb9\x8c\xd7\x22\x6f\x32\x7e\x59\x20\x57\ \x62\x57\xdf\xdb\x88\x6b\x95\x25\x9a\x98\x98\xe0\xb7\xfa\xe7\x9a\ \x60\xc2\x2e\x34\x02\x00\xea\xd3\x31\x98\x5a\x09\x1c\x8f\xda\x41\ \x83\x94\xb4\x3b\xdc\xf8\xb0\xff\x83\x2f\xf1\x7f\x99\xe7\xfc\xb3\ \x83\x3b\x46\xa5\xc2\xfe\x79\x67\xe1\xf9\x0b\x47\x07\xb7\x7d\xd0\ \xb6\x6b\xdc\x1a\x97\x70\x05\xf6\x84\xc5\x88\x80\xf5\x58\x21\x61\ \x7c\xf6\x2f\xba\x39\xfa\x1f\x59\xc6\x15\xc2\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x1f\xdd\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdc\x09\x19\ \x0f\x31\x0d\x3a\x99\x30\xa2\x00\x00\x00\x08\x74\x45\x58\x74\x43\ \x6f\x6d\x6d\x65\x6e\x74\x00\xf6\xcc\x96\xbf\x00\x00\x1f\x49\x49\ \x44\x41\x54\x78\xda\xdd\x7b\x69\x78\x5c\xc5\x95\xf6\x7b\xaa\xea\ \xf6\xaa\x6e\xed\x6a\xad\xb6\x6c\x79\x95\x2d\x4b\xb6\xf1\x06\x36\ \xd8\x06\x6f\x30\x01\x0c\x84\x78\x60\x08\x24\x2c\x61\xc9\x24\x84\ \x84\x90\x99\x04\x42\x12\x32\x99\x21\x10\x18\xb6\x61\x4b\x02\x04\ \x08\x5b\xb0\xc1\x36\x78\xc3\xfb\x22\xbc\x80\x77\x63\x2d\xd6\x62\ \xed\xbb\xba\xa5\xee\xbe\x7d\xef\xad\xf3\xfd\x68\x89\xe1\xcb\x97\ \xcc\x17\x0c\x49\x26\x39\xcf\xf3\x3e\x55\xb7\x54\xba\x7d\xcf\x5b\ \xa7\x4e\x9d\x3a\x75\x2f\xe1\x33\xc8\xf7\xfe\xe5\x1e\xfa\xf7\x9f\ \xfd\x98\x87\xaf\x8b\x47\x8f\xcf\xbf\xf2\xca\x2b\xa7\x8e\x1e\x55\ \x3c\x25\x33\x33\x63\x52\x5a\x5a\x5a\x9e\xdb\xe5\xca\x96\x4a\x78\ \x08\xc4\x09\x2b\x41\xa6\x99\xe8\xef\xed\xed\xed\x6e\x6f\xef\xa8\ \x6f\x6a\x6a\x39\xb6\x6f\xff\xfe\xbd\x5b\x37\xaf\xaf\x02\xd0\x8b\ \xbf\x82\xd0\xe7\x70\x8f\xd4\xbb\xef\xbd\xef\x92\x59\x33\xa6\xff\ \x63\x71\xf1\xc8\x8a\xd4\x60\x30\x57\x08\x42\x3c\x16\x47\x2c\x16\ \x43\x3c\x16\x83\x65\x59\x60\xd6\x30\x5c\x2e\x78\x3d\x5e\x78\x3c\ \x1e\x78\x7d\x5e\x38\x9a\xd1\xdb\xdb\x87\xfa\xfa\x86\xba\xbd\xfb\ \xf7\xbf\xb7\x75\xeb\xf6\xd7\x76\xed\xd8\xbc\xf1\x6f\x82\x80\xb3\ \x66\xce\x2d\xbe\xfe\xfa\xeb\xbe\x36\x7d\xda\xd4\x9b\x46\x14\x15\ \x66\x58\x09\x13\x55\x27\x4f\xe2\xc8\xe1\xc3\xa8\xab\x6f\x68\x6d\ \x69\x6e\x6e\x3a\xdd\x74\xba\x3b\x1a\x8d\xf5\x31\xeb\x38\x18\x10\ \x52\x4a\xc3\x50\x29\x99\x99\x99\xe9\xa3\x46\x8d\x2a\x28\x2c\x2c\ \x2c\x2c\x2f\x2f\xf7\x4e\x2c\x2d\x45\x30\x35\x0d\xf5\x0d\x8d\xd8\ \xbd\x7b\xcf\xa1\x6d\xdb\xb6\x3f\xbd\xf2\xcd\xd7\x7e\x09\xc0\xfc\ \xdf\x48\x80\xeb\xfe\x07\x1e\xba\x73\xc9\xe2\x0b\xbe\x5d\x90\x9f\ \x97\xde\x58\x57\x8f\xad\xdb\xb6\x62\xcb\xd6\xad\xb5\x55\x27\xab\ \x36\x9e\x3a\x75\xea\x80\xe5\xd8\x0d\x00\x3a\x00\x44\x01\x24\x00\ \x30\x00\x0d\x40\x02\x70\x01\xf0\x00\x48\x03\x50\x90\x93\x9d\x3d\ \xa9\x64\x74\xc9\xbc\x85\x0b\x16\x94\x2f\x5a\xbc\x28\xad\xbc\xa2\ \x02\xcd\x2d\xad\x58\xb3\x76\xdd\xa1\x37\x57\xae\xfa\xc9\xde\xca\ \x1d\xbf\xc3\xff\x16\xb9\xe2\x8b\xff\x78\xce\xba\x75\x1b\x4f\x76\ \x77\x77\xf3\x87\x07\x3e\xe0\x7b\xbe\xff\x7d\x7b\x5a\x79\xc5\x3b\ \x00\xbe\x62\x00\x93\x00\x14\x01\xc8\x01\x90\x45\x44\x19\x52\xca\ \x54\x00\x29\xbf\x87\x20\x11\xa5\x03\xc8\x1c\xea\x5b\x08\x60\x2c\ \x80\x8b\xd3\xd3\xd2\x1e\xbe\xe1\xfa\xeb\x6b\x37\x6f\xda\xc4\xfd\ \xfd\xfd\xbc\x71\xe3\x7b\x7c\xdd\x57\x6f\x7a\x4d\x18\xfe\x3c\x00\ \xb8\x60\xd1\x85\xf4\x57\x53\xfe\xde\x1f\xfd\xf4\x3b\x1f\x7d\x54\ \x95\xe8\x68\x6b\xe7\x27\x1e\x7d\x8c\xcf\x9e\x3d\xa7\x72\x24\x70\ \xcb\x5e\xe0\xb9\xd5\xc0\x15\x86\x61\x64\x67\x00\x41\x00\xea\x93\ \x96\x75\xcf\xbd\x3f\xa5\x83\x47\xab\x45\xe5\x07\x27\xa8\xa9\xd3\ \xa4\xdf\xb3\x3e\x09\xc0\x4f\x44\x59\x6e\x97\x2b\x1f\x40\x31\x80\ \xc5\x59\x99\x99\x4f\x7e\xef\xae\xbb\x3a\xea\x4f\x9d\xe2\xd3\xa7\ \x9b\xf8\x87\x3f\xba\xef\x74\x6a\x5a\x68\xf6\x5f\x4b\x77\xf1\x9f\ \x8f\x3c\xfe\xd4\xe9\xd3\x4d\x7c\xe4\xf0\x21\xbe\xfe\xda\xeb\xc2\ \x5e\xb7\xe7\xee\xe5\x40\x79\x2b\x70\x3c\x0c\xf0\x20\x10\x63\x20\ \x1f\x00\x59\x96\x9d\xc2\xcc\x79\xcc\x3c\x96\x99\x27\x31\x73\xd9\ \x50\x39\x9e\x99\x4b\x98\xb9\x90\x99\xb3\x99\x39\x85\x99\x5d\xff\ \x4d\x87\x50\x44\xc2\x0f\x20\x6b\xc8\x92\x56\xcc\x9e\x39\x6b\xc3\ \xc6\xf5\xeb\x9d\xfe\xfe\x30\x3f\xf2\xe8\x13\xce\x9c\x73\xe6\x7f\ \xe5\x2f\xae\xfd\xe3\x4f\x3c\xfd\x6a\x6f\x6f\x1f\x6f\xde\xb4\x89\ \x2f\x5a\xba\xac\x56\x02\xcb\x01\xe4\x9c\x06\x3d\x1b\x03\x98\x01\ \x76\x88\x58\x4f\x9b\xf6\x1c\x33\xcf\x61\xe6\x45\xcc\xbc\x48\x6b\ \x3d\x5f\x6b\x7d\xb6\xd6\xfa\x2c\xad\x75\xb9\xd6\xba\x54\x6b\x3d\ \x4e\x6b\x3d\x5a\x6b\x3d\x42\x6b\x9d\xaf\xb5\xce\xd1\x5a\xa7\x31\ \xb3\xf7\x63\x07\xe3\xf2\x49\x22\x0a\xba\x92\x16\x71\x4e\x6e\x28\ \xf4\xcc\x2f\x9f\x79\xa6\x2f\x16\x8b\xf1\xd3\xcf\xfc\x8a\x4b\x27\ \x4d\xbd\xee\x2f\xa6\xfc\x2f\x1e\x7e\xe4\xf9\x8e\xce\x2e\x7e\x67\ \xf5\x1a\x9e\x3e\x75\xea\x16\x00\xd3\x42\x80\x7f\x84\xdf\x1f\x70\ \x00\x76\x00\xd6\x63\xc7\x5a\xbc\x6c\x19\xeb\x6f\x7c\x63\x0b\x33\ \x7f\x41\x6b\xbd\x88\x99\xcf\x63\xe6\x39\x5a\xeb\x19\x5a\xeb\x72\ \x66\x9e\xa4\xb5\x1e\xaf\xb5\x2e\xd1\x5a\x8f\x60\xe6\x7c\xad\x39\ \xc4\xac\xb3\x98\x39\x60\x3b\xda\xf5\xfb\xbf\x2d\xa5\x72\x11\x51\ \x10\xc0\x04\x00\x3f\xf8\xcf\x87\x1e\x6a\x1f\x1c\x1c\xe4\xc7\x1e\ \x7f\x92\x67\xce\x9e\xf7\x15\x00\x38\x6f\xfe\xe2\x3f\x9f\x4f\xf8\ \x97\x7f\xbd\xfb\xc7\xad\xad\x6d\xbc\x79\xd3\x26\x3e\x67\xf6\x9c\ \x5d\x00\xc6\xfb\xfd\xfe\x34\x00\x3e\x06\xae\xd2\xa9\xa9\xcc\x17\ \x5e\xd8\xad\x6f\xbf\xfd\x43\xbd\x7c\x39\xeb\x9b\x6e\x5a\xc7\xcc\ \x8b\xb5\xd6\xf3\x99\xf9\x1c\x66\x9e\xc9\xcc\xd3\xb4\xd6\x93\x99\ \x79\x82\xd6\x7a\x0c\x33\x17\x6b\xd6\x85\xac\x39\x8f\x59\x67\x6a\ \xad\x3d\xc3\xbf\xb7\xb1\x4e\x13\x00\xbc\xf9\x81\x45\x6b\x0e\xc7\ \x09\x00\x0a\x0a\x46\x08\xa5\x54\x2a\x80\x31\x86\x52\xf7\x3e\xf9\ \xf8\xe3\x6d\xb1\x68\x8c\xef\xfd\xd1\x4f\x9d\x60\x5a\x68\xd6\xe7\ \xa1\xa7\xfa\x43\x8d\x97\x7d\xf1\xaa\x8b\x57\xac\xf8\xd2\xdd\x9d\ \xed\xed\xf8\xe9\x7d\x3f\x3d\xb8\xab\x72\xcf\x8d\x00\xea\x07\x07\ \x07\x09\x40\x1c\x33\x67\x2e\xa3\x71\xe3\x80\x94\x94\x18\xfc\xfe\ \x93\x64\xdb\x15\x1c\x8f\xbb\x01\xd8\x44\xe4\x30\xb3\x03\xc0\x21\ \x22\x87\x88\x34\x33\x6b\x02\x1c\x06\x1c\x62\x68\x26\xc4\x4d\xa6\ \x7e\xaf\x20\x0d\x00\x07\xc3\x9a\x1c\x9b\xb0\xa7\x4d\x93\x69\x12\ \x22\xe1\xe4\x73\x34\x37\x37\x6a\x00\xfd\x81\x40\xd0\x8c\x44\xc2\ \xbf\xbd\xf9\xb6\xdb\x10\xca\xcb\xfb\xe6\x2d\x37\xdf\x90\xd6\xd4\ \xdc\xfc\xfa\x3b\xef\xac\x9b\xd5\xd2\x74\xaa\xf5\x33\x39\xb8\x3f\ \xd0\x96\x75\xdd\x97\xff\xe9\x91\xbc\x50\x0e\x1e\x7b\xec\xb1\xbe\ \xf7\xb6\x6e\xb9\x5d\x4a\xd9\x38\xe4\xb5\xe3\xcc\x5c\x86\x85\x0b\ \xcb\x98\x19\x50\xaa\x01\x89\x04\xb1\x6d\x03\x8e\xe3\x00\xb0\x87\ \x95\x1f\x06\x33\x3b\x20\x72\x00\x68\x02\x18\xa0\x01\x41\xd4\x3b\ \xac\x3c\x00\x54\x04\x05\x4f\xcf\x20\x9e\x93\x2b\x78\xfe\x48\xe2\ \x2f\x94\x19\xfc\xc9\x07\x8a\x44\xc2\x71\x97\xa1\x4e\x03\x78\xfb\ \x8e\x3b\xee\x78\xa3\xbb\xb3\xd3\xbe\xe1\xab\xd7\x15\x95\x96\x4e\ \xfc\xc5\x67\xf6\xf0\x1f\x2f\x73\xf7\xfd\x3b\x01\xc0\x0f\x7f\x74\ \xdf\x03\x67\xcf\x99\x35\xf2\xd5\x57\x7e\x8b\x17\x7e\xf3\xc2\x5d\ \x00\x76\x3a\x8e\xc3\x43\xca\x4f\x42\x6b\xeb\x62\xee\xec\x2c\x86\ \x69\x02\xff\xf0\x0f\xaf\x53\x4a\x4a\x27\x6c\x1b\x64\x59\x72\x58\ \x69\x4a\x2a\x9c\xac\x27\x03\x20\x0d\x40\x6b\xa0\x9f\x04\x85\x6b\ \xb4\xa6\x56\xd6\xd4\xc4\x9a\x1a\x58\x53\x1d\x6b\xaa\x76\x34\x1d\ \x37\x35\x1d\x8a\x68\xda\xd7\xad\x69\x47\xb3\xa6\x4d\x35\x9a\x5e\ \xdf\x9b\x5c\x3a\x6f\xf8\xd7\x17\x63\x86\xcb\x73\xbc\xae\xbe\xfe\ \xf5\x1f\xdc\x7d\xf7\x86\x49\x93\x26\x60\xd9\xd2\xc5\x2b\xc6\x4d\ \x2c\x5f\xfe\xf9\x10\xf0\x83\xef\x71\x6e\x41\xf1\x8c\x45\x17\x9c\ \x7f\x6d\x53\x63\x23\x5e\x79\xe5\x95\xdf\xc5\x4d\x73\x95\x94\x2e\ \x2f\x80\xa8\xed\xf0\x28\x00\x73\x78\xed\xda\x52\x1a\x1c\x48\x85\ \x52\x7d\x3c\x73\xe6\x69\xce\xca\x6a\x83\xd6\x40\x3c\xee\x03\xc0\ \x44\xa4\x87\x22\x3f\x66\x66\x66\x22\x26\x80\x34\x51\xb8\x85\x79\ \xb0\x43\x6b\x19\x04\x84\x60\x08\x05\x08\xc5\x10\x12\x10\x8a\x20\ \x0c\x05\xa1\x0c\x08\xc3\x80\x70\x19\x10\x2e\x17\x44\x20\xd5\x25\ \x7e\xb7\xcf\x91\x57\xdd\xf2\x25\x71\xe7\x43\x87\x2c\xc3\x30\x8e\ \xbf\xb9\x72\xe5\xda\xb7\x57\xbd\xd5\x74\xc5\xe5\xcb\x31\xb9\x74\ \xe2\x3d\x00\x8c\xcf\x65\x0a\xdc\x7a\xf3\xd7\xee\x9d\x30\x7e\x1c\ \x7e\xf7\xc6\x1b\x3d\x07\xf6\xec\x79\x50\x19\x29\x31\xc7\x77\x96\ \xd3\xd4\xc3\x01\xc9\xce\x7c\x66\x66\x1c\x38\x30\x9f\x1d\x0d\xe4\ \xe6\xee\xa2\xf4\xf4\x38\x88\x2c\x38\x0e\xb8\xb7\x77\x0a\xbf\xf8\ \x62\xd1\xf0\x68\x83\x48\x13\xc0\x94\x6c\x08\x77\x00\x03\x7e\x22\ \xb9\xb5\x6d\x93\x52\x48\x2a\x2f\x19\xc2\x00\x84\xc1\x10\x06\x41\ \x18\x22\xa9\xb4\xcb\x0d\xe1\xf6\x40\xb8\xbd\x10\x1e\x0f\x0b\x5f\ \x0a\x89\xe6\x7a\x5b\x5c\x7b\xeb\x38\x5a\xf1\xf5\x17\xda\x01\x54\ \xfe\xdb\xbf\xfd\x6c\x9d\xdb\x65\xf0\xd2\xa5\x8b\x2b\xa6\xcd\x38\ \xfb\xda\xcf\x4c\x40\x5e\xfe\xc8\x59\xe7\x9e\x3b\x77\x71\x63\x7d\ \x1d\x36\x6f\xd9\xf2\x7a\x1c\x38\x16\x0c\x4d\x93\xdf\xbd\xff\x37\ \xba\x33\x06\x9b\xb5\xee\x26\x22\x86\x69\x7a\x60\xdb\x80\xdf\xdf\ \xcd\xcc\x1a\x3e\xdf\x20\x31\x03\xb6\xed\xa1\x86\x86\x74\x1e\x12\ \x70\x72\x1a\x33\x73\x6c\x90\x39\xd2\x39\xd0\x60\x28\x66\xb9\x24\ \xf7\x02\x92\x44\x52\x02\x52\x12\x49\x31\x54\x4a\x40\x2a\x90\x34\ \x08\xd2\x30\x48\x1a\x06\xa4\xcb\x20\xe9\x72\x41\xba\xdd\x24\xbd\ \x3e\x25\x8f\x7d\x08\x35\x6f\xc9\x0a\x09\x4f\xc9\xa9\x63\x27\x8e\ \xef\xdf\xb0\x61\xfd\x89\xf3\x17\xce\x47\x51\x61\xe1\xad\x9f\x99\ \x80\x65\x17\x2e\xbd\x75\xec\xd8\x12\xb5\x63\xf3\x96\xde\x3b\xf7\ \xec\x9e\x13\x01\xf5\xd7\xf4\x1c\xba\x7b\x74\xc5\x68\x54\x6e\xad\ \xd3\xcd\x35\xed\xbb\x18\xdc\x45\xf1\x78\x08\xcc\xa0\x69\xd3\x0e\ \x10\x91\xc6\xd5\x57\x1f\x67\x8f\xa7\x1a\xcc\xe0\x81\x01\x0f\x11\ \x69\x22\x62\x10\x31\x13\xd9\x26\x51\x3f\x01\xa2\x24\xe2\x92\x63\ \xd7\x4c\xfc\x72\xee\xaa\x82\xc8\x84\x35\xa5\x5f\x12\x80\xe8\x8e\ \xb5\x4b\x09\x08\xc5\x2c\x14\xff\x77\x69\x10\x0b\xc3\x05\x61\xb8\ \x58\xb8\x5c\x10\xfe\x70\xab\x0c\x84\xdb\x24\x6b\x16\xc1\x20\x44\ \x63\xac\x26\x0a\xe0\xf0\xa3\x8f\x3e\xb6\x37\x23\x3d\x1d\x53\xa7\ \x96\x4f\x1d\x3d\xa6\xf4\xfc\xcf\x42\x40\xc6\xd4\x8a\xf2\xa5\x70\ \x1c\x98\x6f\xbf\xed\xaf\x00\xa6\xb0\xe1\x81\x9f\xf8\x8e\xeb\x9f\ \xbe\xe1\xd6\xfc\xa9\xc5\x72\xb7\x2a\x8c\xc6\xef\xb8\xb3\x1d\xd1\ \x41\x49\x00\xf3\xf2\xe5\xd5\x00\x34\xa4\xd4\x10\x62\x00\xcc\x18\ \xf2\xf6\x60\x80\x89\x99\x75\x7b\xfb\x80\xaa\xa8\x28\x77\xdf\x72\ \x4b\x08\xb9\xb9\x22\xae\x63\x5f\x97\x24\x55\xc4\x8a\xfc\xfa\x87\ \x47\xee\xcd\x08\x79\x43\x42\x12\x49\x31\x04\x39\x0c\x90\x94\x82\ \xa4\x52\x24\x95\x41\x92\xf3\xf3\x04\xe7\xe7\x0a\xb7\x9b\xa4\x6d\ \x6b\x69\x00\xf2\x9c\x45\x5f\x69\xdb\xb7\x7f\xff\xd1\xe3\xc7\x8f\ \x76\xcc\x9a\x35\x13\xa1\x50\xce\xf2\x33\x26\x20\x14\x2a\x58\x5a\ \x51\x5e\x9e\x53\x5d\x5d\x8d\x9c\x43\x47\x5c\x01\xe9\x06\x84\x3a\ \x2c\x72\x43\x50\x5e\xf7\xcf\x96\xb4\xed\x98\x2e\x5c\x10\xf4\xda\ \x6b\x13\xf5\x87\x87\xc0\xb6\x3d\x40\x00\xd8\xb2\x98\x88\x34\x29\ \x15\x21\x66\xa0\xb3\x33\x0b\x00\x63\x60\x40\xf0\x25\x97\x2c\xa0\ \x09\x13\xde\x13\x75\x75\x3b\xe5\x2b\xaf\xd4\xfd\xd7\xd7\x46\x3d\ \x0a\xa0\x4c\x92\x80\x14\x82\x5e\xaa\x7f\xe9\x59\xc1\x2c\x89\x59\ \x0a\x66\x29\x3f\x51\x66\x5d\x76\xd9\xd8\xbc\x05\x0b\xa6\x65\x3e\ \xf8\xef\xe9\x59\x2f\xff\x32\x30\x6d\x62\xf6\x3b\x73\xa7\x66\xd4\ \x2c\x5c\x54\xf4\x63\xb7\x87\x64\xe5\xe6\x5e\xd7\xfd\xcf\xfc\xaa\ \x07\x50\x75\xeb\xd7\x6f\xfc\x68\xd2\xc4\x09\x28\x28\xc8\x5f\x32\ \xa5\x62\x66\xea\x19\x11\x30\xa5\xbc\x7c\x61\x61\x61\x21\xaa\xab\ \x6a\x3a\xf3\xa3\x31\xcd\x5e\xff\xda\x7b\x1f\x6d\x3d\x97\xc6\x8e\ \x69\x81\x6d\xb9\xdd\x7b\xf7\xdc\xba\x30\x0f\x21\xe1\xd8\x93\x74\ \x5f\x2f\x74\x75\xf5\xe9\xa1\xa0\x07\x43\x9e\x3e\x0e\x00\xa8\xa9\ \x59\xc4\xf7\xdf\x3f\x81\x2e\xb8\xe0\x49\x54\x56\x3e\x41\x44\x93\ \x90\x1c\x4f\xec\x19\xe1\x5c\x2b\x20\x20\x21\x07\x04\x49\xd3\x62\ \x67\xc9\xd7\x9f\x5b\xb0\xc8\x37\x6a\xd4\x8f\xfd\x79\x79\xab\x03\ \xf9\xf9\x6f\xa4\x7c\xe1\x0b\x65\x19\x85\x85\xcf\x1a\xdb\xb6\xed\ \x76\x1f\x3a\xbc\x35\xfd\xc1\x07\xb7\x67\xff\xdb\x4f\xfe\x95\xb4\ \x9e\x0b\xa2\x1c\x15\x8b\xde\xbe\xe8\xaa\xf2\x2f\x46\x54\xba\x70\ \x05\xa1\xcb\x66\xfd\x43\xe7\xc1\x43\x47\x1a\xbd\x1e\x37\x46\x8c\ \x18\x51\xc2\xe0\xf1\x67\x42\x40\xea\xb8\x71\x63\xcf\xf2\x79\xdd\ \xa8\xab\xaf\xaf\xb9\xba\xf0\xac\x8a\xbb\xbe\xb5\xe6\x2b\x17\xce\ \xf1\xfb\xe9\xea\xab\x5e\x40\x22\x01\x1c\x3d\xf2\xa5\x0c\x17\x4f\ \x11\x59\x99\x93\x60\x18\xd0\xa6\xb9\x3e\x0a\xd4\xb2\x94\x16\x01\ \xc0\x65\x97\x3d\xcf\x5a\x03\xfd\xfd\x73\xf0\xf2\xcb\xaf\xe8\xce\ \xce\x39\x60\xb6\xe1\xf7\xef\x71\x2a\xca\x57\x20\x10\x58\xb3\xbd\ \xdc\x03\x25\x14\x66\xd5\x53\x22\x27\xa6\x5a\x95\x50\x28\x38\x70\ \xea\x35\x8a\x46\xff\x99\xb4\x9e\x0b\xc7\x39\x5f\xed\xdd\xbb\x9d\ \x2c\xeb\x72\x92\xd2\xcd\x4a\x02\x82\x46\x8a\x58\xf4\x36\x28\x09\ \x18\x46\x1f\x2b\xa5\x3d\x3d\x6d\x4f\x9f\x7d\xff\xf5\x13\x3e\x3a\ \x0a\xd7\xe5\xff\x78\x5b\x67\x67\x4f\xb8\x39\x1c\x09\xf7\x8f\x29\ \x19\x4d\x86\x32\xce\x3a\x13\x02\x8a\x0a\x0a\x0a\x0a\xe2\xf1\x38\ \xfa\xfa\x23\x4d\x65\x63\xa6\x24\x82\xee\xa0\x18\xe1\x8d\xa4\x89\ \x7f\xba\xfa\x23\x06\x0d\x70\xc2\x02\x7e\xfe\xe0\x85\xb2\xb4\x74\ \x24\x79\x7d\x70\x46\x8d\xda\x17\x06\x06\x4c\xa0\x09\x96\xc5\x74\ \xed\xb5\xf5\x18\x39\xf2\x37\x24\x04\x88\x99\x01\x1c\xd0\xe7\x9d\ \x77\xb1\xd5\xd8\x78\xb9\x7e\x6f\xf3\xf6\x59\xbf\x1a\xb3\x55\x92\ \x84\x24\x89\x37\x7e\x11\xcd\x38\xeb\x94\x53\x2c\x49\x02\x4a\x81\ \xdd\xee\x5a\x6b\x4c\xc9\xb7\xd8\xe3\x39\xce\x52\x82\xfd\xfe\xdd\ \xd6\xec\xd9\x97\x47\xbf\xf9\xcd\xa9\xec\x4f\xd9\xca\x52\x82\xa5\ \x44\x64\xf6\xdc\x6b\x1c\x9f\x7f\x07\x0b\x89\xec\xa3\xbb\xbe\x16\ \x1d\x84\x31\xed\xec\x0b\x62\x19\xfe\xb4\x48\x4f\x77\x77\x5f\x5e\ \x6e\x2e\x3c\x1e\xf7\xe4\x33\xd9\x0b\x14\x17\x16\x14\xa4\xc6\x62\ \x51\x98\x96\xee\x2c\x2c\x3f\x2f\xee\x09\x15\x8a\x40\x56\x20\x05\ \x60\xa2\x92\x92\x0d\x7c\xe8\xd0\x65\xbc\x7f\xdf\x15\xd0\x5a\x8a\ \x71\x63\x41\x93\x27\x47\x88\x48\x0d\x02\x31\x18\x46\x8b\x1b\xc8\ \xa4\xd7\x5f\x7f\x0c\xc0\x7f\x6a\x20\x6a\x11\x85\x87\x13\x1e\x14\ \x8b\x51\x5f\xa2\x6f\x89\x24\x89\xa2\x6e\x0e\x7b\xb5\x0a\x8e\x6b\ \x23\xde\x3a\x45\xd2\xdb\xe7\xf8\x9a\xbe\xff\xf0\xd1\xf9\x51\x3b\ \x4a\xfe\x95\x6b\x37\xa0\xaf\x4f\x99\x37\xde\xd8\xe3\x30\xc3\x22\ \x82\x9d\x99\x79\xbb\xf7\x97\xbf\x5c\x61\x8e\x2e\xd9\xdb\xf0\xf4\ \x2b\x07\x8b\xae\xb9\xf2\x51\xff\xde\x3d\xe7\xa9\xd8\xc0\xb5\x97\ \x7c\x73\x66\x73\xfc\xf2\x2b\x56\xde\xd6\xdb\xf9\xb5\xc1\x8f\x4e\ \x7a\xb2\x46\x95\xc0\xe3\xf1\x8c\x06\x80\x0b\x16\x5f\x44\x9b\x36\ \xac\xe5\x3f\xc9\x02\x48\xa8\x5c\xaf\xcf\x6b\x24\x12\x96\x36\x5c\ \xbe\x78\x7e\xd1\x58\xf8\xfc\x5e\xe5\x75\xc1\x07\x40\xf3\x98\xb1\ \x27\x88\x19\x94\x48\x04\x11\x8f\x07\xc8\xe3\xd1\xae\x59\xb3\x72\ \xfd\xcc\x7e\x62\x56\x09\xc0\x89\x03\xdd\x0c\x58\x88\xc5\x94\x0e\ \x87\x35\x62\x31\x83\x92\xe4\x2a\x78\x3c\x52\x90\x48\x57\x24\x91\ \x55\x52\x71\x97\xb3\x62\xc5\x92\xc5\xd9\x0b\xae\x54\x24\x39\xec\ \x17\x85\x2f\xd6\xbf\x1c\xf2\x29\x9f\x74\xae\xb8\x22\x6a\xdf\x78\ \x63\x18\xb1\x98\x01\x22\x25\x98\x55\xec\xe6\x9b\xfb\x5b\xf7\xed\ \x7d\xaa\xed\xc5\x57\x3e\x14\xf1\x98\x51\xfd\xd4\x6b\x07\x22\xa5\ \xe5\x5f\x67\x69\xc0\xdb\xdf\xf9\xbd\xdc\xe7\x1e\xdb\x97\xe7\xf6\ \x14\x39\x91\x08\x82\xc1\x00\x5c\x86\x91\x05\x00\x7f\xaa\xf2\x00\ \x20\xfc\xfe\x94\x0c\xb7\xc7\x0d\xcb\x4a\x58\xfe\x94\x54\x27\x27\ \x54\x40\x6e\x97\x52\x00\xdc\x00\x69\x9c\x3b\xef\x24\xbb\xdd\x6d\ \xd0\x5a\x42\x6b\x62\xad\x41\x86\xe1\x4a\x01\x0a\xfc\x44\x01\x10\ \x49\x87\x19\x71\xa2\xb0\xe3\xf3\x0d\x38\xa9\xa9\x0e\x79\x3c\x12\ \x80\x24\x40\x82\x48\x0a\x08\x8f\x24\x89\x14\x23\x25\xa1\x7f\xfe\ \xf3\xda\x13\xd7\x5c\x70\x5a\x92\x24\x09\x09\x43\x18\x12\x43\xfd\ \x00\x48\xf2\x7a\xc5\xf0\x35\x01\x92\x40\x12\x04\x09\x9f\x57\x10\ \x41\x1e\x7e\x7a\xcd\xba\x78\x76\xde\x33\x90\x52\x68\x12\x50\xc5\ \xa3\x3f\x88\xe7\xe6\x55\x19\x86\x01\xa5\x54\xfa\x1f\xdb\xe1\xfe\ \x51\x02\xbc\x1e\xaf\x4f\x90\x80\x20\x61\x07\x52\xd3\xd8\xe7\xf7\ \x2b\xa9\x48\x32\x43\x00\xac\x29\x3f\x3f\x86\x50\xe8\x03\x00\x20\ \x22\xc0\x30\xfa\xb9\xa0\xa0\x17\x80\x70\x33\x67\xf9\x92\x49\x4e\ \xa5\x01\x99\x60\xb6\x98\x59\x82\x48\x31\xb3\x02\xb3\xba\xeb\xd0\ \x0f\xa6\x3b\xec\x4c\x36\x84\x91\x28\x0b\x96\xb6\x82\x59\x5d\x3d\ \xe2\xca\x3e\x45\x0a\x52\x28\x3c\x55\xfb\xec\xb7\x31\xd4\xf7\xff\ \x01\x92\xa0\xa1\x92\x29\x59\xee\x78\x6e\xd7\x83\x6d\x65\xe7\xdd\ \xd4\xba\x70\xf9\xa5\x9d\xb7\x7d\xf7\x79\x77\x30\x35\x9e\x8c\x43\ \x20\xfe\xc8\x0e\xf7\x8f\x13\x10\x37\xe3\xda\xb2\x2c\x28\xc3\x50\ \x01\xbf\xdf\xe7\xf3\xba\xdd\x04\x92\x5a\x83\x00\xd2\xcc\xcc\x08\ \x85\x1a\x58\xeb\x64\x02\xcc\xe5\x6a\xc7\x9c\x39\x5d\x4c\x04\x10\ \x91\x02\x82\x5e\x20\x4d\x02\x2e\x10\x19\x20\x52\x00\x14\x11\x29\ \x26\x52\x8d\xd1\xa6\xc9\x52\x28\xa4\xbb\xd2\x77\x7d\x67\xc2\xed\ \x8d\x18\x6a\xcf\xf3\xe6\xbd\xaa\x84\x42\xbf\x15\xbe\xf2\x81\x93\ \x0f\x97\x82\x48\x0d\xff\xed\xe3\x3a\xfe\x1b\x60\x52\xc4\xa4\x78\ \x08\x3b\xbe\xfd\xec\xee\xa3\xdf\x7a\xa8\x26\x3d\xdd\xef\x0e\x04\ \x03\x86\xed\x38\x70\x6c\x3d\x14\x87\x7d\x0a\x02\x22\x91\xb0\x19\ \x8d\x46\xe1\x76\xbb\x95\xcf\xef\x4d\xf1\xb8\x84\x1f\x80\xd2\x8c\ \x8f\x77\x75\x58\xb6\x6c\xef\xc7\xff\xe1\xf5\xf6\x12\x11\xc0\x4c\ \x00\x88\x93\x94\xbb\xdd\x40\x0a\x31\x4b\x06\x04\x03\x32\xa1\x13\ \x0a\x80\xec\xb7\xc2\xe3\x25\x49\xb8\x85\x3b\x3a\x94\x05\x96\x04\ \xc8\x2f\x16\x2e\x7f\x49\x92\xd4\x12\x12\x9b\xda\x37\xdf\x00\x40\ \x0e\xd8\x51\x63\xb8\x0f\x0f\x01\x0c\xc9\x0c\xa9\x87\xc0\x1a\x52\ \x6b\x48\xcd\x10\x92\xe0\xf7\x79\xa5\x37\x18\x08\x7a\x07\x06\x06\ \x61\xd9\x76\x04\x80\xf5\xe9\x96\x41\x76\x22\x9d\x1d\x9d\x09\xb7\ \xdb\x2d\x03\x7e\x4f\xba\xc7\x48\x64\x82\x21\x5b\xa2\x5d\xb2\x35\ \xd6\xe6\x21\xc7\x26\x9a\x32\xa5\x17\x86\xd1\xc7\x00\xa0\xb5\x4a\ \xce\x06\xa2\xe4\x66\x97\x09\xcc\x82\x01\xba\xe7\xe8\x4f\xce\xb9\ \xff\xc4\x03\xd3\x19\x50\x86\x70\x49\x02\x54\x9f\xd5\xbf\x58\x91\ \x44\x40\xa5\xf4\xf2\xb0\x63\x04\xd4\x0d\x25\x5f\x69\x2e\xf2\x16\ \xbe\xa6\x84\x44\xd8\x0a\x5f\xf8\x6e\xcb\xfa\x3c\xbf\xf2\x89\x84\ \xb6\x0c\x06\x94\x06\xd4\xc7\xa5\x4e\x42\x6b\x28\xcd\xc9\xd2\xb1\ \x21\x7c\x6e\x64\xb8\x15\x05\x52\xd3\x82\xc1\xae\xae\x2e\x24\x12\ \x66\xd7\x99\xc4\x01\x7d\xcd\xcd\x2d\x51\xb7\xcb\x0d\xbf\xcf\x9d\ \xe9\xf7\x20\x77\xad\x73\x5f\xf9\x2d\x87\x6f\xfe\xd5\x8f\x4f\xdc\ \xff\x6d\x28\x83\x99\x19\x34\x66\xcc\x46\x10\x01\x25\x25\x7b\x99\ \x99\x38\x69\x01\x82\x89\xc4\xc3\xd5\x4f\x4e\xff\xf2\xde\x9b\x6f\ \x7e\xaf\x63\xeb\x13\x6b\x5a\xde\xfd\xf5\x4d\xfb\x6e\xbb\x86\x87\ \x14\x20\x20\x4d\x91\xc2\xe4\xd4\xd2\x03\x34\xd4\x36\x8c\x37\xe7\ \xbe\xf2\x50\x9a\x2b\xfd\x80\x24\x85\x87\xab\x1e\x79\xec\xb1\xaa\ \x27\xca\xa5\x30\x24\x03\x2a\xe1\x58\x86\x06\x14\x0f\x29\xac\x9d\ \x21\xc5\x1d\x28\xc7\x86\x32\x13\x40\xc0\x87\x5c\xb7\x81\xa0\xdf\ \xe7\x0b\xb6\x77\x74\xc2\xb2\xac\x16\x00\x58\xbc\xf4\x62\xfa\x34\ \x71\x40\x77\x55\x75\x55\xa7\xed\x38\x69\xc1\x80\x37\xcf\x92\x5d\ \xa5\xb5\xb4\xe5\xf6\x80\xe9\x51\xdd\x89\x9e\x9c\x98\x13\x93\xef\ \xb4\x6e\x1a\xdb\x7c\x63\xc9\xa9\x11\xfe\xf9\xdf\xbc\x24\x6f\x59\ \x8d\xd6\x8e\x14\x52\x61\x73\xc7\xf6\x9c\x87\xab\x9f\xf8\x69\xd4\ \x8e\x16\xc5\xb5\x05\x83\x92\x79\x89\xaa\x48\xcd\xed\x0d\x03\x8d\ \xab\x7b\x12\x3d\x2e\x45\x49\xa7\x7c\xef\xa4\xef\xef\x1d\xb4\x63\ \x2e\xaf\xf4\x68\x1e\x0a\x12\x18\xc0\xda\x79\x2b\xbf\xb1\x6c\xdb\ \x25\xaf\x98\xda\x1c\xb3\xaa\xe9\xad\x5f\x55\x76\xbf\xbf\xea\xca\ \xe2\xab\x7e\x33\x3f\x77\x71\x9b\x05\xc6\xb3\x55\x8f\x97\x1b\xda\ \x1f\xbf\x28\xf3\xba\x93\xb6\x0d\x24\x2c\x8b\x12\x96\xa1\x05\xc1\ \x9d\x96\x82\x22\xb7\xa4\x4c\x29\x65\x6a\x4d\x4d\x2d\x00\x1c\x06\ \x80\x0d\xeb\xde\xe6\x4f\x43\x40\x4f\x5d\x5d\x5d\x6b\x67\x77\xcf\ \xd8\xf4\xd4\x40\xc6\x56\xb3\xf2\x8b\x19\xae\x0c\x15\xb6\x22\x30\ \x1d\x1b\x37\x1f\xb8\xe3\xc1\x88\x1d\x29\xd2\xac\xa1\xa1\xd1\x15\ \xef\xbc\xe7\x86\x51\x5f\x3e\xd0\x14\x6d\xf6\x3f\x5a\xfd\xd4\xcf\ \x12\x3a\x51\x20\x85\x32\x15\x98\x97\xe5\x2e\xba\x7b\x7d\xeb\x86\ \xff\x00\x58\xac\x69\x7b\x77\xb2\x0b\x86\xad\x84\x01\x49\x22\xaa\ \x89\x0c\x45\x8a\x40\xc4\x60\x86\x4e\xfa\x11\x30\x11\x2a\xd2\xcb\ \x5f\x39\xd0\xfb\xe1\x9d\x0c\x46\xa7\xd9\x7d\xe9\x93\x55\x4f\xcc\ \x7f\xbd\xf1\xf5\x5d\x83\x76\x34\xd4\x67\x86\xcf\xd2\x9a\x11\x8d\ \x39\xff\xbc\x34\x78\xfd\x11\x76\x5c\xe8\x8c\x76\xd1\xa0\xaf\xb1\ \x28\xc5\x35\x2d\xd7\xad\x8c\xcc\x48\x24\xea\x6b\x3c\x7d\x1a\x86\ \x61\x1c\x3c\x93\x48\xb0\xad\xb6\xb6\xe6\xf8\x91\x23\x47\xcf\x9d\ \x3f\x6f\x4e\x5a\x7a\x47\x53\xfa\xc4\xd4\x71\x83\x75\xed\xe6\x33\ \x83\x66\xcb\xed\x2e\x11\x2d\x22\x12\xf0\x49\x6f\x73\xd4\x89\x16\ \xbc\xdd\xb2\xfe\x5e\x25\xdc\xdf\xdf\xd8\xb1\x65\x85\xc5\x76\x01\ \x91\xc4\x35\x23\x56\x7c\xe7\xe2\x11\x97\x9f\x20\x00\x5b\xda\xb7\ \xc6\x35\x3b\xbe\x83\xbd\x87\xcf\x4f\x35\x82\xad\x4a\x48\x10\xc8\ \x85\xa4\xd9\x93\x1e\xf2\xd2\xc3\x43\x94\xd0\x36\xfd\x64\xca\x8f\ \xd7\x3b\x44\xeb\x6f\xd9\x7b\xcb\x1d\xcd\xf1\x96\x0b\x19\x48\xeb\ \x34\x3b\x2f\x62\x06\x04\x24\x88\x80\xed\x5d\xef\xfc\x07\xc7\x7d\ \xdf\xdd\xd6\xbb\xfa\x8e\xde\x78\xff\xe8\x69\xe9\x53\x74\xa7\x93\ \x71\x30\xc7\x5f\xe8\x3f\x70\xe0\x30\xda\xda\xda\x9b\x53\xd3\x52\ \x0f\x9e\x89\x0f\x18\x18\x1c\x08\x9f\x78\x7f\xef\x3e\xd3\xe3\xf3\ \x51\x91\x4c\xef\xbf\xb6\xf8\x9a\x03\xd7\xf8\x1e\x58\xe5\xb1\xf3\ \xdf\x65\x22\xcc\xcb\x39\xf7\xa1\x67\x67\x3d\xfd\x8d\xa0\x91\x76\ \x1c\x82\xc4\x1b\xcd\x6f\xff\xac\x3f\x11\x2e\x67\x22\x4c\x49\x2d\ \x7b\x7e\x79\xd1\x65\xa7\x4c\x6d\x1b\x9a\x59\x65\xb9\xb3\x0e\x4a\ \xa1\xe0\x95\x5e\x33\x62\x0f\x14\x4b\x52\x08\xa8\xc0\x69\xcd\xac\ \x78\x28\x3e\x18\x2e\x35\x91\x12\x24\xa5\xc9\x8e\xa1\x99\xd5\x23\ \x33\xff\xeb\x91\x8b\xf2\x2f\xfe\x97\x5c\x6f\xfe\xb6\x7c\x6f\xd1\ \x86\x31\x29\xa5\x2f\xce\xcb\x5a\x72\xaf\x9b\x7c\x1d\x00\xf9\xb6\ \xf5\xbf\xf9\xb0\xe5\x58\xa3\x05\x04\x66\x64\x4d\x15\x2d\x66\xed\ \x34\x13\xf6\xc8\xfd\x07\x3e\x40\x2c\x16\xff\x60\xf5\xaa\x37\x3a\ \x3e\xb5\x05\xe4\xe5\x17\x86\x5b\x5b\x9a\x8e\xee\xde\xbd\xfb\x44\ \x43\x43\x53\x45\x49\x66\x21\x79\x52\xf2\xfd\xbe\x12\x4c\x49\x7c\ \xf4\xc0\xc3\x17\xcd\xe0\x5f\x65\xa6\x93\x88\x33\x8b\x8b\x0a\x2e\ \x79\x6e\x55\xf3\xca\x5b\x23\x56\xa4\xd8\xab\xbc\xad\xd3\x32\xa6\ \xfe\xf6\xb6\xb1\xb7\x6e\xb7\x99\x95\x33\x74\x44\x36\xd2\x5f\x7c\ \xac\xdf\xea\x3f\xbb\x2d\xde\x7e\x3e\x83\xa5\x41\x0a\x97\x15\x2e\ \x7f\x9c\x01\x43\x92\x44\x72\xa5\xe6\xe4\x79\x39\x27\xd7\x5a\x22\ \x39\x9c\x43\xc7\xd5\x63\xbe\x7a\xf4\x4a\xfe\xea\xd1\x84\x05\x98\ \x26\x10\x8f\x01\xf5\xfd\x8d\xbb\x1a\x13\x75\xcb\xa1\x49\x69\x47\ \xf7\x5c\x9b\x75\xd7\xcb\x17\x15\x95\x7c\xc1\xa2\xae\x91\xe1\xae\ \xb0\x7b\xdf\xfe\xfd\x70\xb4\xf3\xdb\x33\x49\x88\xc8\x81\x48\x98\ \x01\xb8\x62\xd1\xf8\x88\xc2\xa2\x11\xd3\xe7\x9e\x73\xb6\x3b\x1e\ \xeb\xb7\xd3\x32\x03\xde\x93\x0d\xd6\xe1\xa8\xc9\x94\x97\x2d\x0c\ \xd3\xd1\x62\x54\x60\x6c\xdf\xd2\xc2\x8b\x36\x9a\xda\xac\xb9\x61\ \xec\xd7\x5e\x9a\x9b\x73\x5e\x9d\xa5\x6d\xc1\x24\x05\x0b\x41\x00\ \x44\x73\xf4\xb4\xaf\x76\xa0\x76\x3e\x83\xbd\x00\x3c\x02\x02\xe3\ \x53\x27\x6c\x2f\x4d\x2d\xed\xd6\x44\x82\x01\xa1\x89\x84\x1e\x5a\ \x41\x34\x20\x1c\x90\x70\x08\xc2\x21\x12\x16\x20\xe2\xb6\x96\x66\ \x42\x4b\xc7\x92\x22\x1e\x87\x28\x73\x2d\x3c\x7c\xa0\x7f\xc7\xb8\ \x98\x15\x0f\x8d\xd3\x17\x3c\x78\x53\xd9\xf2\x09\xa5\xa1\x14\x4f\ \xd0\x08\x04\xb6\xbe\xb7\xdd\xf5\xde\xe6\xad\x9d\x83\x83\x83\x5f\ \x6f\x6f\x6d\x4e\x7c\x6a\x02\x86\xcf\x1e\x4c\x33\x96\x96\x48\xd8\ \xe5\xe7\x9e\x77\x6e\xba\xc7\x25\x8d\xb4\xd4\x40\x86\xcb\x2d\xa3\ \x87\x4e\x8a\xea\x40\x0a\x79\x7c\x1e\xa2\x84\x4d\xc2\x61\xd0\x84\ \xd4\xb2\x76\x97\xf2\x69\x0d\x08\x16\x92\x34\x41\x38\x60\x01\x86\ \xcc\xf2\xe4\x0c\xbc\xdf\xb5\x67\xb6\x66\x0e\x48\x92\x10\x24\x31\ \x21\x75\xe2\x8e\x71\xc1\x09\xdd\xc3\xc1\x8d\x03\x48\x0d\x48\x4d\ \x90\xf6\xd0\xb5\x4d\x90\x36\x43\x5a\x0e\xa4\x93\x20\x61\x25\x84\ \x30\xe3\x90\xf1\x18\x64\x3c\x4e\x62\x32\x2e\xdc\x35\x66\xe0\xb2\ \x17\x96\x8c\x9e\x36\xb1\x74\x04\x9d\xef\x33\xc8\x48\x44\xad\xcc\ \x5f\x3c\xf4\x08\xf5\xf5\xf7\x3f\xfc\xfe\x9e\xed\xeb\x96\x5e\x78\ \x09\xd5\x54\x9f\x3c\xa3\x9c\x60\x02\xc0\xb1\x43\x87\x0f\x6d\x59\ \xb5\x6a\x35\x02\xc1\x34\x5f\x22\xd2\xed\x19\x5b\x48\x97\x17\xe6\ \xd2\xc8\x63\xd5\xb0\xfa\xc2\x90\x31\x13\x32\x16\x83\x8a\xc5\x49\ \x9a\x26\x94\x69\x41\x99\x9a\x55\x82\x59\x59\x0c\x65\x11\x54\xa6\ \x37\x64\x05\x5c\x69\xad\x62\x28\xa2\xf5\x1b\x81\xd6\x73\x73\xe6\ \xd7\x39\x80\x72\x00\x65\x7f\xa2\xb4\x01\x65\xd3\x10\x18\x2a\x61\ \x43\x25\x4c\x28\x33\x31\x04\x13\xca\x8c\x43\x99\x31\x18\x7d\x61\ \x5b\xfb\xbd\xce\xc8\x31\x05\x74\x79\x7a\xf2\x2c\x39\x7b\xcd\xda\ \x77\x44\x5d\x7d\x43\x6f\x20\x25\xe5\x19\x00\x58\xf7\xce\x5b\x7c\ \x46\x29\x31\x00\x50\x86\xaa\xea\xef\xed\xda\xb4\x6a\xd5\x5b\xb5\ \x1f\x7c\x70\x10\x42\xc8\x74\x2f\xe2\xf9\x33\x27\xe2\xbb\x60\x4e\ \x39\x56\x4d\x3c\x30\x00\x39\x18\x25\x39\x18\x65\x35\x18\x83\x8a\ \xc6\xa0\x62\x71\xa8\xb8\x09\x95\xb0\xe1\x4a\x30\xb9\x12\x4c\x2e\ \xb7\xf2\x27\x94\x74\x41\x09\x17\x52\x5d\x19\x6d\x3e\x57\x3a\x2c\ \x90\xcb\x02\xb9\x12\x20\x57\x82\xc8\x65\xd1\x50\x9d\xc9\x65\x3a\ \xe4\x32\xe3\x49\xc4\x87\x10\x8b\x92\x2b\x16\x23\x57\x2c\x4a\x46\ \x38\x4c\x04\x47\xa5\x4c\x9b\xa0\xee\x1c\x91\xc5\xb9\x00\xd2\xeb\ \xeb\x1b\x7c\xaf\xbf\xf1\x26\x62\xf1\xd8\xcf\xd7\xac\x7e\xb3\xe1\ \x4c\xd3\xe2\xc3\x53\x00\x5a\x6b\x13\x80\x1d\x09\x47\x02\xd1\x58\ \x62\xe6\xc2\x85\x0b\x04\x3b\x36\x32\xd3\xbd\xe9\x6e\x1f\x8d\x38\ \x52\xcd\x3b\x1c\x87\x94\xc7\xc5\xca\x76\x88\x1c\x0d\xa1\x87\x60\ \x6b\x12\xcc\x48\x82\x20\xaa\xc3\xc7\xf3\xba\xcc\xae\x89\x24\x08\ \x0b\xf2\x96\xbc\x50\x14\x18\xd5\x9b\x9c\xe3\x10\x9a\x20\x1c\x86\ \xb0\x19\xc2\xd6\x10\xb6\x05\x61\x25\x92\x48\x58\x10\x89\x38\x44\ \xc2\x84\x88\xc7\x48\xc4\xa3\x90\x91\x08\xd0\xdd\x8b\xc4\xb4\x52\ \xdc\x31\x69\x04\x4f\xf4\x2a\x1a\x7e\x4f\x89\x8e\x1d\x3d\x56\xfb\ \xfe\x9e\xed\x5f\x06\x60\x7f\x66\x02\x86\xa4\x2b\x91\x88\xcb\x8e\ \x8e\x8e\x54\x12\x72\xfc\x9c\xb3\xe7\x80\x2d\x93\x72\xb2\x3c\x79\ \x7e\x1f\x15\xd5\x34\x62\x7f\xcc\x24\x56\x12\xd2\x71\x88\xec\x21\ \x68\x0d\x62\x4d\xe4\x68\x22\xad\x89\xd2\x5d\xd9\x9d\x5d\x66\x87\ \x9c\x99\x39\x6f\xe5\xdc\x9c\x45\x55\x09\xad\x85\x66\x41\xb6\x4e\ \xf6\xb7\xec\x21\x24\x92\x48\x58\x44\x71\x93\x28\x11\x27\x8a\xc7\ \x89\x62\x51\xa2\xe8\x20\x28\x12\x81\x13\x1d\x04\x57\x8c\xc7\x3f\ \x4f\x19\x85\x19\xa9\x6e\x02\x00\xf1\xfc\x0b\x2f\xd1\xca\x95\x6f\ \x41\x10\x6e\x6a\x6c\xac\x3f\xf2\x59\xce\x06\xe5\x1f\x68\xeb\x1e\ \x18\x88\x38\xbd\x7d\xe1\x89\x1e\x8f\x2f\xeb\xac\x19\xd3\x61\xc7\ \xa3\x08\x65\xba\x0b\xbd\x7e\x4c\xa8\x3d\xcd\xfb\x23\x83\x14\x95\ \x92\x95\xe3\x10\x39\x0e\x27\x77\xca\x3a\x79\xfa\xa9\x35\xe0\x17\ \x69\xf1\x8a\xd4\xd9\x47\x0b\xbd\xa3\xbb\x12\xb6\x43\x70\x64\xf2\ \x00\xd9\x06\x6c\x2b\x09\x2b\x91\x44\x22\x01\x98\xf1\xe4\x92\x67\ \xc6\x81\x78\x8c\x28\x16\x65\xee\xed\xa3\x78\x34\x0a\xdf\xd4\x09\ \xf8\x4e\xd9\x28\xae\xc8\xf0\x26\xc3\xfb\x77\xd7\x6d\xe0\x27\x9f\ \x7a\x86\x72\xb2\x32\x8e\xac\x7b\x77\xcd\x37\x3e\xeb\xe9\xf0\x1f\ \x22\x20\x06\xa0\xab\xa3\xbd\x2d\xd1\xd2\xd6\x31\x31\x25\x25\x90\ \x5a\x36\xb9\x94\x61\x27\x28\x94\xe9\xca\x4a\x4b\xa5\x05\x03\x51\ \x3e\xd5\xd4\x46\x8d\xcc\x70\x69\x4d\xe4\x38\x04\xc7\x21\xb2\xed\ \xe4\x08\x3b\xf6\x50\xdd\x22\xd2\xb6\xc0\x70\xdd\x4a\x10\x25\x4c\ \xa2\x44\x82\xc8\x34\x93\xf5\x78\x8c\xc8\x8c\x13\xc5\x62\x84\x78\ \x94\x68\x70\x00\xdc\xd9\x85\x48\x9a\x1f\x65\xd3\x26\xd2\x3d\x65\ \xc5\xc8\x1f\x1a\x79\xde\xbc\x65\x1b\x1e\x7f\xfc\xbf\x30\x73\xd6\ \x1c\x2a\xcc\xcb\x0a\x5d\x76\xe9\xc5\xe3\xde\x79\x77\xfd\x9b\x9f\ \x37\x01\x00\x10\x01\x38\xda\xd5\xd9\x39\xd8\xd6\xd1\x39\x45\x28\ \xc3\x57\x51\x51\x0e\xc9\x9a\xb3\x53\xa5\x2b\x3d\x8d\xe6\x29\x83\ \x33\xda\x3a\xe9\x78\x6f\x18\x03\x9a\x99\x98\x49\x68\x1b\xa4\x1d\ \xc0\xb2\x19\x8e\x43\xb0\x2d\x86\x6d\x11\x2c\x8b\x61\x25\x92\x65\ \x22\x41\x48\x98\x8c\x84\x49\x88\x9b\x0c\x33\x4e\x88\x47\x99\x07\ \x06\xc8\xea\xea\xe1\x98\x19\x27\x4f\x49\x21\xae\x2d\x1f\x4b\xd7\ \x8e\xcf\x67\x97\x57\x11\x03\xa0\x75\xeb\x37\xd2\xf3\xcf\xbf\x80\ \xe9\xd3\xcb\x51\x5e\x36\x09\xc1\xa0\x9f\x8f\x1e\x3d\x36\x65\xe5\ \x9b\xaf\x8f\x7a\xe0\xc1\x87\x56\x7d\xde\x04\x00\x40\xbb\xd6\x4e\ \x67\x7b\x5b\x6b\xb8\xbe\xa1\x69\x5c\x24\x32\x10\x2c\x2d\x9d\x00\ \xbf\xc7\x83\x80\xdb\xa1\x50\x86\x1c\x9d\x99\xce\x8b\x94\x02\x22\ \xfd\xd4\xd7\xd3\x87\x2e\xc7\x01\x6c\x0b\xca\xb2\x88\x12\x09\xc0\ \x4a\x50\xd2\xc4\x13\x94\x34\xf1\x18\x21\x1e\x07\xe2\x71\x42\x2c\ \x0a\x8a\xc7\x08\x03\x03\x30\x7b\x7a\x28\x0a\xcd\xb9\x85\xd9\xb4\ \x70\xca\x58\x7c\x6b\x72\x31\xc6\x15\xa6\x01\x92\x88\x1d\xc7\xc1\ \x4b\x2f\xbf\x8a\xb7\x56\xfd\x0e\xa1\x9c\x4c\x32\x0c\x83\x02\x29\ \x5e\x94\x8c\x1e\x45\x39\x39\x21\xda\xb7\x7f\x7f\xc5\x15\x97\x5d\ \x36\x71\xd5\x5b\x6f\xbf\xf1\xb9\xbd\x22\xf3\x09\x39\x91\x48\x98\ \x6f\x1c\x39\x7c\x60\x50\x6b\xe7\xd6\xba\xfa\x86\x31\xb7\xde\x7c\ \x23\xca\xa7\x4c\x66\x9f\x02\xc6\x87\xc8\x13\x4a\xc5\x8a\x8e\x3c\ \x7c\xa1\xb5\x9b\x8f\xb5\x76\xd1\xee\xee\x3e\x1c\xb7\x35\xe2\x20\ \xb0\x94\xac\xa5\x24\xa6\xe4\x20\x82\x99\x91\x9c\x32\x2c\xb4\x26\ \x92\x04\x4f\x5a\x80\xa7\x8d\x1f\x45\x67\xe7\x67\xd0\xa4\x50\x3a\ \xfb\xb3\x53\x08\x94\x4c\x34\x51\x5b\x5b\x3b\x3d\xf6\xc4\x53\xd8\ \xbf\x6f\x1f\xa6\x55\x94\xc1\xe3\x75\x73\x4b\x73\x0b\xb4\xe3\x20\ \x1c\x8e\x60\x52\x69\x29\xb7\xb4\xb4\xf0\xb1\xe3\xc7\xbf\xd4\xd9\ \xde\x64\x66\x87\x0a\x3f\xf5\x31\xf9\x9f\x9a\x38\x48\x07\x70\x61\ \x7e\x41\xf1\x55\x93\xcb\xca\x96\x5e\x74\xe1\x52\x71\xe5\x17\x2f\ \xe7\xdc\xdc\xd0\xd0\x3d\x34\xe2\x0e\x21\x1c\x23\xf4\x44\x18\xfd\ \x51\xd4\x46\x06\xe9\x94\x99\x40\x57\xc2\x46\x44\x6b\x24\x92\x49\ \x55\xb8\x0c\x89\x80\xcb\x8d\xac\x14\x0f\x8f\x0e\xfa\xa9\x24\x23\ \xc0\x48\xf5\x01\x29\xc6\xc7\x8f\xc3\xd1\x68\x0c\x6f\xaf\x5e\x4b\ \x6f\xae\x7c\x0b\xb5\xa7\x6a\x07\xd8\xb1\x5e\xbb\xed\xd6\x9b\x2f\ \x9e\x3e\x7d\x7a\xd6\x8e\x1d\x3b\xf9\xe4\xc9\x13\x94\x93\x9d\x8d\ \x89\x13\xc7\x73\x51\x61\x21\xfa\xc3\x61\xaa\xa9\xae\x85\xcf\xef\ \x7d\xf5\xab\xd7\xdf\xb4\xe2\xf3\xb4\x80\x61\xe9\x05\xb0\xb2\xa5\ \xb9\xbe\x3e\x1e\x8f\x9e\x6c\x6d\x6d\x59\xfe\xfe\xde\x7d\xc5\x17\ \x9c\xbf\x00\x4b\x97\x2c\x46\x5e\x5e\x2e\x3c\x12\xec\x49\x01\x72\ \x52\x08\x0e\x50\x62\xda\x28\x31\x2d\xc0\xb4\x19\x5a\x27\xd3\x1f\ \x82\x00\x43\x11\xdc\x0a\xf0\x18\x04\x45\xe0\x4f\x8e\xc1\xc0\xc0\ \x20\xbd\xb7\x79\x0b\xad\x5b\xb7\x11\x47\x8f\x1d\x43\x38\xdc\xf7\ \x7e\x6d\xf5\xc9\x1f\x0e\x0e\x0e\xac\x2f\x2b\x2b\x9b\x1b\x08\x04\ \x36\x8c\x1f\x3f\xce\x6b\xdb\x16\xd7\xd6\xd6\x02\x44\xe8\xe8\xe8\ \xc2\xd4\xa9\x53\xd8\xe5\x56\xdc\xd0\xd8\xf8\xa5\x53\x35\x1f\xc5\ \x66\x9f\xb3\xe0\x07\x1d\xed\xad\x1d\x7f\x4a\x7e\xf0\x4c\xde\xb3\ \xcb\x05\x30\x2b\x2b\x27\xf7\x8a\xfc\xbc\xc2\xb9\xa3\x47\x8f\x2e\ \x9e\x7e\xd6\x34\xcc\x9b\x7b\x0e\xc6\x8d\x1d\xc3\xa1\x50\x0e\x84\ \x10\xbf\x7f\xff\x4f\x26\x81\xf0\xc9\x7a\x6f\x6f\x1f\x4e\x9d\xaa\ \xc7\xae\xdd\xbb\x69\xdf\xbe\x03\xa8\x3d\x75\xca\x09\xf7\xf7\x55\ \xb5\xb6\x36\x3d\xde\xd3\xdd\xf5\xf2\x27\xbf\x23\xd8\xb7\x6f\xdf\ \x4c\xc3\x30\xb6\x4a\x29\xbd\xef\xbd\xf7\x1e\x57\x55\x55\x51\x7e\ \x5e\x2e\xc6\x8d\x1b\xcb\xa3\x8a\x47\xe2\xc8\xd1\x63\x74\xec\xf8\ \x09\xf4\xf7\x87\x61\x9a\xe6\x91\xd6\xd6\xd6\x5f\x6c\xda\xb4\xe9\ \xb9\x3f\xd7\xf7\x02\x45\x00\x66\xe7\xe6\x15\x2c\x09\xa6\x66\xcc\ \x0c\x85\x72\x26\xe6\xe5\xe5\xab\x92\xd1\xc5\x28\x1e\x59\x8c\x82\ \xc2\x7c\x84\x72\x72\x90\x9a\x1a\x84\x52\x0a\x20\x82\xe3\x38\x18\ \x18\x18\x44\x57\x67\x27\x9a\x9a\x5b\xd0\xd0\xd0\x88\x53\xa7\xea\ \xd0\xda\xd6\x8a\x9e\xee\xde\xfe\xe8\x60\xe4\x60\x4f\x4f\xd7\x1b\ \xed\xed\xad\xab\x01\xfc\x5f\xe1\xed\x87\x1f\x7e\x28\xa6\x4e\x9d\ \xaa\xab\xaa\xaa\xce\x75\x1c\x67\x5d\x5d\x5d\x9d\xf7\xe4\xc9\x93\ \x5c\x5d\x5d\x8d\x91\x23\x47\xa0\xa6\xa6\x1a\x27\x4f\x56\xd3\xdc\ \xb9\x73\x79\xd9\xb2\x65\xfa\x83\x0f\x3e\x90\x3b\x77\xee\x44\x7b\ \x7b\xfb\x9d\xdb\xb7\x6f\x7f\xe0\xcf\xf9\xc1\x44\x00\x40\x29\x80\ \xb2\x8c\xac\x9c\xa9\xa9\xc1\xf4\x69\x5e\x9f\x2f\x94\x12\x48\x49\ \x77\xbb\xdc\x1e\x97\xe1\x52\x86\xa1\x04\x09\x21\x6c\xdb\xd6\x09\ \xd3\xd4\x96\x63\xd9\xb1\x68\x7c\xd0\x34\xe3\x3d\xb1\x68\xf4\xe8\ \x40\xa4\x7f\x7f\x67\x67\xfb\x4e\x00\xfb\x87\x5e\xb1\xff\x1f\xa5\ \xb2\xb2\x72\x86\xd7\xeb\xdd\x26\x84\xf0\x6e\xdb\xb6\x8d\xb7\x6f\ \xdf\x4e\xab\x56\xad\x82\xd7\xeb\xe5\x3b\xee\xb8\x83\x2e\xbd\xf4\ \x52\x8e\x44\x22\xa8\xac\xac\xa4\x5d\xbb\x76\xa1\xb7\xb7\xf7\xee\ \xad\x5b\xb7\xde\xf7\x59\x7c\xc0\xff\x24\x11\x00\xef\x03\x78\xbf\ \xa7\xab\xc3\xdf\xd3\xd5\x91\x0d\x20\x37\x25\x10\x1c\x61\x28\x95\ \x03\x12\x39\x86\xcb\x08\x28\x65\x48\xdb\xb2\x07\x1c\xdb\xea\x26\ \x81\xb6\x81\xc1\xe8\xe9\x78\x74\xb0\x09\x40\xeb\x50\xf0\xf5\x27\ \xc9\xa1\x43\x87\x44\x79\x79\xf9\xbe\xea\xea\xea\x25\xcc\xbc\x2e\ \x27\x27\xc7\xa7\xb5\xe6\xe2\xe2\x62\x6a\x68\x68\xc0\xaf\x7f\xfd\ \x6b\x04\x83\x41\xcc\x9c\x39\x13\xd3\xa7\x4f\x67\xd3\x34\xa9\xb2\ \xb2\xf2\x27\xb3\x67\xcf\x8e\x57\x56\x56\x3e\xf0\xe7\xb0\x80\xbf\ \x9a\xd4\xd5\xd5\xcd\x5e\xbb\x76\xed\xb6\xfa\xfa\x7a\x57\x5d\x5d\ \x1d\x4e\x9c\x38\xc1\x55\x55\x55\x94\x9e\x9e\xce\x77\xdd\x75\x17\ \x4d\x99\x32\x85\xb5\xd6\xd8\xbb\x77\x2f\xed\xde\xbd\x1b\x7d\x7d\ \x7d\x77\x57\x56\x56\xde\xf7\xa7\x06\x42\x9f\x9b\x18\x86\x8b\x5c\ \x2e\x17\xd9\xb6\xfd\xb9\xdd\xf3\xd8\xb1\x63\x34\x6e\xdc\xb8\xa6\ \x19\x33\x66\x9c\xef\xf1\x78\x8a\x3d\x1e\x0f\x0b\x21\x60\xdb\x36\ \xb5\xb5\xb5\xe1\xd0\xa1\x43\x54\x54\x54\x84\xdc\xdc\x5c\xe4\xe4\ \xe4\xc0\x71\x1c\xea\xec\xec\x5c\x18\x0c\x06\x07\xdb\xda\xda\x76\ \xff\x45\x09\xd0\xda\xc1\xe7\xa9\x3c\x00\x3c\xf1\xc4\x13\x00\x80\ \x05\x0b\x16\xa4\x32\xf3\x32\xa5\x14\xf9\xfd\x7e\x1a\x7a\x6d\x07\ \xa7\x4f\x9f\xa6\x83\x07\x0f\xa2\xa0\xa0\x80\xb2\xb2\xb2\x90\x9b\ \x9b\x0b\x00\xd4\xdd\xdd\xbd\x38\x3d\x3d\xdd\x69\x6b\x6b\xdb\xfe\ \x17\x23\xe0\xcf\x29\xe7\x9f\x7f\xfe\x11\xc7\x71\x66\x38\x8e\x53\ \x22\xa5\x64\xb7\xdb\x8d\x4f\x5a\xc2\xf1\xe3\xc7\x29\x3f\x3f\x1f\ \x39\x39\x39\xc8\xca\xca\x82\x6d\xdb\xd4\xdd\xdd\xbd\xd0\xef\xf7\ \x0f\x74\x75\x75\xed\xf9\x9b\x27\x60\xcb\x96\x2d\xd6\xb6\x6d\xdb\ \x5e\x9c\x37\x6f\xde\x39\x8e\xe3\x94\x28\xa5\xe0\xf3\xf9\x68\x38\ \x16\x69\x6e\x6e\xa6\xc3\x87\x0f\x23\x37\x37\x97\x32\x32\x32\x90\ \x9d\x9d\x0d\x00\xd4\xd3\xd3\xb3\x38\x25\x25\x25\xf1\x37\x4f\xc0\ \xb0\xcc\x9d\x3b\xf7\x75\x00\xb3\x6c\xdb\x2e\x11\x42\xe0\x93\x3e\ \xa1\xb3\xb3\x13\x27\x4e\x9c\xa0\x50\x28\x84\xac\xac\x2c\xa4\xa5\ \xa5\x41\x4a\x49\xbd\xbd\xbd\x0b\xff\x6e\x08\xd8\xb9\x73\xa7\xbd\ \x73\xe7\xce\x17\x37\x6c\xd8\x70\xf6\xd0\x74\x20\xaf\xd7\xfb\xf1\ \x2a\xd7\xd6\xd6\x46\x27\x4e\x9c\x40\x76\x76\x36\xa5\xa5\xa5\x21\ \x23\x23\x03\x86\x61\x90\xc0\xdf\x91\x10\x11\xa7\xa4\xa4\x5c\x4a\ \x44\x9b\x98\x19\x2e\x97\x0b\xf9\xf9\xf9\x5c\x58\x58\x88\x82\x82\ \x02\x0c\x0c\x0c\xe0\xd5\x57\x5f\xc5\xf1\xe3\xc7\x61\x59\x16\xe5\ \xe7\xe7\xb3\xc4\xdf\x99\x6c\xdb\xb6\xcd\x7a\xfa\xe9\xa7\x5f\x3a\ \x70\xe0\xc0\xd9\xb6\x6d\x7f\x6c\x09\xc3\xab\x43\x47\x47\x07\xd5\ \xd4\xd4\x20\x23\x23\x83\x02\x81\x00\x04\xfe\x0e\xa5\xbc\xbc\x5c\ \x67\x64\x64\x5c\x4a\x44\x1b\x1c\xc7\x81\x61\x18\x08\x85\x42\x5c\ \x50\x50\x80\xdc\xdc\x5c\x0c\x0e\x0e\x62\xf5\xea\xd5\xa8\xae\xae\ \xfe\xdb\x8e\x04\xff\x7f\xf2\xfe\xfb\xef\x8b\xa7\x9e\x7a\xea\x5d\ \xd3\x34\x17\x3b\x8e\x83\x78\x3c\x8e\xe6\xe6\x66\xb4\xb4\xb4\x70\ \x4b\x4b\x0b\x05\x83\x41\x16\x7f\xcf\x04\xcc\x9a\x35\x4b\x67\x66\ \x66\x2e\x57\x4a\xbd\xc3\xcc\x50\x4a\x71\x56\x56\x16\x42\xa1\x10\ \x42\xa1\x10\x62\xb1\x18\xfe\x0f\xc8\x02\xa9\x53\xd8\x3e\xc3\xb8\ \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x05\xd2\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x05\x99\x49\x44\x41\x54\x48\x89\x8d\x95\x5b\x6c\x1c\xd5\ \x19\xc7\x7f\xe7\xcc\xcc\xce\xce\xce\x7a\xbd\x8e\xbd\x6e\x7c\x8b\ \x13\x27\x76\xb0\x21\xe4\x52\x02\x54\x55\x6f\x54\x7d\x42\x6a\x14\ \x54\x01\x0a\xd0\x36\x55\x68\x91\xa8\xaa\xd2\x87\x2a\x6d\x55\x94\ \x52\x5a\x10\x52\x51\x0b\x15\x0f\x41\x45\x40\xd5\x02\x45\xa9\x0a\ \xbc\xf4\xa5\xaa\x54\x4a\x1b\x21\x51\x07\x95\xe0\x4b\x6a\x67\x37\ \xce\x3a\xbe\x7b\x6d\xaf\x77\xe7\x7a\x4e\x1f\xc6\xb1\x63\x8a\xa3\ \x8e\xf4\xd7\x39\x33\xf3\x7d\xff\xdf\x77\x66\x74\xbe\x23\xb4\xd6\ \x5c\xef\xb2\xc4\xbd\x36\xa4\x06\x52\xe9\x4c\x7f\xca\x75\x5a\x11\ \x42\x06\xab\xf5\xd9\xa0\x5e\x1b\x02\xff\x7c\xa8\x5f\xad\x5f\x2f\ \x5f\x6c\x05\x48\x89\x63\x1d\xf9\xce\xae\x13\xfb\xef\x38\x7c\xf4\ \xd6\x5b\xfb\xfa\x77\xed\x2a\xa4\x72\x39\x17\x21\x60\x79\xb9\x46\ \xb1\x38\x1b\xbd\x7b\x76\x74\x74\xf0\xaf\xef\xbd\xb1\x38\x51\x3c\ \x1d\xea\xdf\x17\xff\x6f\x40\x2e\xff\xf0\x83\x5f\x78\xe0\xcb\xa7\ \xee\xfa\xca\xa7\xdb\x7b\x3b\xb3\x58\x02\x54\x04\x57\x43\x85\x00\ \xc3\x84\x50\xc1\xd8\xe4\x2a\x67\xce\xfc\x63\xf6\x2f\x2f\xbf\xf9\ \x78\x50\x99\x7b\xd6\xd3\xaf\xe8\x2d\x01\x69\x71\xaf\xb5\xad\x77\ \xef\xd3\x5f\xfb\xd1\x89\x6f\x7f\xe6\x50\x17\xca\x83\x20\xdc\x08\ \x8e\x62\xd0\x80\x65\x24\x10\x01\xa4\x2c\x90\x29\x78\xfb\x5f\x13\ \xbc\xf8\xe4\x0b\x2f\xce\x8f\x0c\x3d\xe4\xe9\x57\xfd\x8f\x05\x74\ \xf4\x3d\xfa\xab\xe3\x3f\x7d\xe4\x3b\x37\xb4\x37\x51\x5d\x49\x9e\ \x49\x91\x8c\x4a\x43\x77\x2b\xd8\x16\x14\xa7\x13\x98\x10\xc9\xaa\ \x84\x80\x4c\x06\x46\xca\x8b\xfc\xe6\xd4\x33\x2f\x2f\x8c\x0e\x1f\ \xaf\xeb\x57\xd4\x26\x40\xbe\xe9\xe1\xaf\xde\xfd\xf8\xc9\x97\xfa\ \x76\x74\x51\x5d\x52\x08\x29\xd6\xcd\xc3\x18\x3e\xbf\x4f\x70\xc7\ \xfe\xe4\x7e\xa4\x0c\xaf\xbf\xbd\x56\x21\x1a\x0d\x68\x05\x8e\x2b\ \x18\x29\x5d\xe6\xf5\x9f\x3c\xf5\x48\x65\xfe\x99\x5f\x02\x98\x00\ \x8e\x38\x56\xb8\xed\x1b\xf7\xff\xbc\xa5\xb9\x95\xd2\xc5\x79\x90\ \x02\x21\xd6\x84\x20\xd6\x82\xde\xf6\x2c\x20\x01\xe8\x6d\x83\x30\ \xa8\x52\xa9\xaa\xb5\x22\x34\x5a\x6b\xf4\x22\x34\x37\xb5\xb0\xff\ \xc8\x9d\x8f\x3a\xe2\xbe\x37\xea\xfa\x77\x17\x4d\x80\xc6\xce\xae\ \xe3\xdd\x07\xf6\x77\x4c\x5c\x98\x20\x0c\x22\xa4\x21\x91\x32\x91\ \x10\x82\x20\xd4\xbc\x37\xac\xe8\x2a\xe4\x01\x18\x2a\xd6\xb9\x74\ \x79\x1e\x7d\xd5\x78\x4d\x4a\x29\xe4\x82\xa4\xb3\x7f\x6f\xd3\xc8\ \x8e\x9d\xdf\x04\x7e\x20\xd2\xdc\x63\x0d\xdc\x75\xf4\x9f\x3b\x0e\ \x1c\xfa\x64\x65\x62\x12\xc3\x34\x90\x52\x62\x18\xc6\x3a\x40\x08\ \x81\x46\xf0\xa9\x9b\x72\x34\x64\x4c\xfe\xfe\xfe\x12\x35\x3f\x46\ \x0a\x36\x99\x2b\xa5\x88\xa3\x08\x27\x9f\xa3\xf4\xc1\x87\x63\x17\ \xde\x7a\xf3\x80\x69\x1a\x4e\x8f\xdd\xda\x36\x70\x69\xac\x44\xbd\ \xb2\x80\x65\x59\x9b\x00\x52\x4a\x40\x90\xb2\x0c\xde\x19\xac\x02\ \xe0\xfb\x11\x35\x3f\x42\xc0\x26\x73\xa5\x14\x51\x14\x21\x2b\x15\ \xac\x96\xc2\x2e\xd3\xce\xde\x60\x5a\x8d\xd9\xbe\xc8\x4c\x3b\xb3\ \xd3\x93\xc4\xf5\x15\xac\x94\xb5\xc9\x5c\x4a\x49\xdd\x57\xfc\xf0\ \xc1\x83\xdc\x7f\xe7\x1e\x04\xf0\xfe\xe8\x02\x27\x4e\xfd\x8d\x58\ \x69\x04\xd7\x54\x1f\xc7\xc4\x71\x8c\xd2\x9a\xc6\xf6\x4e\x69\xe5\ \xb3\x7b\x4c\xb3\xc1\x6d\xf5\xaa\xb3\x2c\x4f\x0d\x21\xad\x1c\x91\ \xca\x61\x18\x0a\xc3\x90\x18\x52\x20\xa4\xc0\xf3\x62\x5a\x9b\x6c\ \x32\x69\x13\x80\xed\x2d\x69\xe2\x28\xc0\xf3\x23\x84\x60\x0d\xa0\ \x89\x95\x22\x8e\x13\x39\x91\xc6\xc8\x38\x6d\xa6\x30\x4d\x1d\xaf\ \xce\x53\x2d\xbe\x85\x12\x69\xcc\x86\x1e\xcc\x4c\x01\xd3\xce\x63\ \xd9\x59\x0c\x2b\x8d\x17\x68\x7c\x7f\x63\xc7\x05\x81\xa2\x56\xf7\ \xf0\xfd\x08\x50\xa8\x38\x26\x8e\x02\xc2\xa0\x4a\xe4\x55\x88\x6a\ \x33\x38\xae\x8f\x36\x4d\xcc\x28\x8e\x66\x0c\x3b\x87\x99\x29\xe0\ \x2f\xcf\x10\xae\x14\x09\x6b\xd3\x20\xb3\x60\xb9\x08\x33\x0b\xbe\ \xa4\x5e\xbb\x7d\x1d\x10\x47\x01\xb3\x93\xe3\x04\x5e\x1d\x08\xd1\ \x51\x0d\x15\xad\x40\xb8\x0c\x41\x05\x94\x87\xe4\x20\x4a\xeb\x2b\ \x66\x10\xf8\xc3\x86\xed\xae\xa6\xf3\xbb\x5c\xbf\x56\x03\xab\x01\ \xa4\x0d\xc2\x06\x24\x3a\x0e\x20\x50\x68\xb5\xb1\x02\xad\x63\x42\ \xaf\x42\xec\x79\x20\x62\xd0\x7e\xd2\xac\x84\x01\x46\x1a\xcb\x6d\ \xc1\x6e\x6c\x8f\x17\xc2\xa9\x0b\x32\x08\xfd\x8b\x91\x5f\x3b\xdf\ \xd8\x7d\x00\x4c\x17\x64\x1a\x0c\x37\x99\x1b\x2e\x98\xd9\x64\x14\ \xe6\x35\x1d\x4c\x22\x0c\x07\xcc\x4c\xa2\xf5\xb8\x0c\x48\x87\xec\ \xf6\x7e\x54\xcc\x78\xe8\xd7\x87\xa5\x3f\xf3\x5c\x3c\x3b\x3e\xfa\ \x5a\x73\xcf\x3e\xec\xfc\x4e\x20\x05\xd2\x49\x64\x38\x20\x33\x6b\ \xe0\x6b\x00\xc8\xc4\x54\xba\xc9\x7b\x63\x2d\x5e\xa4\x11\x76\x13\ \xdb\x7a\x6f\x61\x65\x6e\xfa\x0f\xf5\x2b\xcf\xae\x4a\x80\xca\xd4\ \xd4\x4b\x1a\xbf\xb4\xfd\xa6\x2f\x26\x9f\x48\xa4\x92\x24\x23\x03\ \xa6\x03\x66\x0a\x43\x1a\x1b\xf6\x52\x20\x4c\x0b\x4c\x7b\xc3\x5c\ \xda\x20\x52\x6c\xeb\x39\x4c\xca\x6d\x98\x5d\x9a\x2a\x9f\xe6\x6a\ \x73\xf1\xc6\x7e\x31\x5f\x3a\xf7\xee\xc9\xb6\x81\x7e\x5a\xf6\xdc\ \x9e\x00\xb0\x10\x46\x2a\xd9\x68\x42\x12\x84\x6a\x1d\xa0\x94\x4e\ \x52\xa5\x4c\x40\xd2\x06\x6d\x92\xdd\xde\x47\xdb\xcd\x87\x99\xfe\ \xcf\x87\x3f\xae\x8f\x3c\x75\xe9\x7f\xdb\xf5\xd1\xe7\x9f\xe8\xda\ \xf7\xb9\x93\x63\x67\x07\x99\x2f\x8d\xa0\xb5\xc2\x4a\xa5\x70\xdd\ \x2c\x03\x7d\x1d\x1c\x1a\x68\x47\x48\x41\xb1\xbc\xc8\xd9\xc1\x12\ \xd5\x95\x65\x3c\xcf\x43\x6b\x4d\x43\x73\x1b\xdd\xb7\x1c\x64\xa1\ \x7c\xfe\x74\xf9\xcc\xd7\xbf\xb5\xfe\xbb\x3e\x7a\xa2\x75\xdc\xf3\ \xc2\x13\x5d\x37\x7e\xf6\xe4\xdc\x85\x2b\xcc\x8c\xfe\x1b\xc7\x12\ \xb4\xb6\x16\x70\x1b\x1a\xb1\x2c\x07\x29\x25\x51\xe4\xe3\xd5\xab\ \xcc\xcf\xcd\x51\x59\x5e\x25\xdb\xbe\x93\xc2\xde\x6e\xa6\x4b\xe7\ \x9e\x9b\x19\x1a\xfe\x6e\x74\xee\x67\xe1\x96\x00\x80\xa6\x23\xbf\ \x3e\xd6\x7d\xf3\x6d\x8f\x65\xad\xe6\xdd\x19\xcf\xa3\xc1\x50\xe4\ \x5d\x17\xd7\x75\x31\xa4\xc4\xf3\x3d\x96\xaa\xab\x2c\xf9\x11\x4b\ \x86\x49\x25\xa8\x5c\x2e\x8f\x0e\x3e\xb6\xf8\xc7\x87\x9e\xff\xa8\ \xd7\x96\x87\xbe\xf1\xa5\x27\x0b\xcd\x3b\x3a\xef\x6b\xef\xde\x7d\ \xac\xbb\xbd\xf3\xc6\xb6\x5c\x2e\xd3\x9a\x73\x30\x04\xcc\xae\xf8\ \x94\x2b\x4b\xf5\xe2\x64\x79\xa4\x3c\x31\xfe\xda\xc2\xc4\xc4\x6f\ \xa3\x3f\x7f\xbf\xfc\x71\x3e\x5b\x02\xd6\x03\x8e\x3c\x6d\x8a\xac\ \xb3\xdb\x72\xdd\x1e\x2b\x6d\x7f\x02\x21\x44\xe8\xf9\xd3\xe1\xea\ \xea\xb8\xae\xd6\xc6\xf4\x9f\xbe\x17\x5e\x2f\xff\xbf\x98\x6a\x9d\ \xc8\xca\xd8\x53\x00\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ \x82\ \x00\x00\x08\x10\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ \xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x00\x48\x00\x00\ \x00\x48\x00\x46\xc9\x6b\x3e\x00\x00\x00\x09\x76\x70\x41\x67\x00\ \x00\x00\x18\x00\x00\x00\x18\x00\x78\x4c\xa5\xa6\x00\x00\x06\x41\ \x49\x44\x41\x54\x48\xc7\x6d\x95\x5b\x6c\x5c\x47\x19\xc7\x7f\x33\ \xe7\xec\x9e\xb3\xbb\xdd\xe3\xcb\x5e\xec\xc4\x5e\xa7\x76\x42\x2f\ \x89\x41\xb9\x92\x92\xb4\x69\x14\x05\x25\xa1\x69\xea\x42\x49\x89\ \x08\x08\x0a\x12\xaa\x10\xe1\x0d\xc2\x0b\x12\xea\x23\xbc\x51\x51\ \x44\x1e\x68\x23\x28\x05\x5e\x80\xe2\xa4\x26\x6e\x50\x1a\x27\x69\ \x1c\x42\x2a\xdc\x2a\x17\x3b\xe9\xc6\x89\xbd\x5e\x5f\xb2\x6b\xef\ \xc5\xbb\x7b\xce\x99\xe1\x61\xd7\x4e\x28\x1d\x69\xe6\x61\xf4\xe9\ \xff\x9b\xf9\x7f\x33\xdf\x27\xb4\xd6\xdc\xcb\xe5\x28\x15\x4b\x68\ \xad\xc9\x4c\x65\x70\xa2\x0e\xae\xeb\x12\x0e\x87\x5b\x6b\xb5\xda\ \x13\x4a\xe9\xcf\x06\x02\x81\xc7\x4c\x53\xb6\x21\x84\x50\xbe\xca\ \xbb\xae\x3b\xea\xf9\xde\x47\xc1\xa0\xfd\x7e\xad\xba\x78\x5b\x21\ \x98\x5f\x58\x20\x99\x48\xa2\x7d\x45\x34\xea\x90\x4a\xad\xc0\xe4\ \xd3\xc7\x13\xc0\xf7\x80\xfd\xed\xed\x6d\x71\xc7\x71\x30\x0c\xe3\ \x7f\x02\x94\x52\x94\x4a\x45\x72\xb9\xfc\x62\xad\xba\x78\x06\xf8\ \x35\xf0\xd7\x4f\x0a\x7d\x12\x10\x01\x7e\x5e\xa9\x56\x5e\x5e\xd3\ \xd3\x43\x38\x12\xc1\xf7\x7c\x5c\xd7\x65\xb1\x56\x03\xa5\xea\x51\ \x12\x4c\x24\x96\x1d\x22\xd5\xe9\x84\xda\xdb\x6b\x7b\xd3\xe9\xf4\ \xde\x79\x18\x04\x5e\x06\xc6\x3e\x0d\xd0\x3a\x3a\x3a\x7a\xc2\x69\ \x72\xb6\xa6\x52\x29\x72\x0b\x05\xee\xe5\xf3\x08\x0d\x5a\x00\x68\ \x84\x96\xf7\xa3\x05\x68\x34\x42\x08\x04\x82\x58\x2c\x86\x61\x98\ \xbb\xaf\xdd\xb8\x71\xbe\xe7\xe1\x9e\x7d\xc0\xe5\x07\x01\x62\xec\ \xe6\xd8\x6f\xab\xb5\xca\xd6\x68\x34\xc5\xc4\xc4\x44\x7d\x53\x83\ \x16\x02\x21\xea\x8a\xc2\x00\x54\xfd\x06\x28\xd0\xba\x0e\xd6\x08\ \x64\x1e\x02\xc1\x00\x89\x58\x2c\x31\x3a\x76\xe3\x2f\x1b\x37\x6c\ \xde\x08\xcc\x08\xad\x35\x3f\xfa\xf1\xd1\x5d\x9b\x36\x6d\x7a\xb7\ \x6b\xd5\x2a\x3c\xd7\xad\xbb\x20\xea\x8b\xd4\x26\x5a\x68\x84\x14\ \x9f\x9a\x2c\xad\x34\x42\x2b\xb4\xd0\x80\x20\x14\x0a\x73\x3b\x9d\ \xe6\xea\xb5\xab\x3f\xfd\xc9\xd1\xa3\xaf\x98\x00\x53\x99\xcc\x97\ \x43\xe1\x10\x85\x42\x01\xdf\x75\xd1\x52\x22\x05\x48\x69\x22\x05\ \x75\x1b\x84\x00\x69\x80\xbe\x6f\x11\xca\x47\x6b\x8d\xd6\x1a\xa5\ \x41\x0b\x45\xa5\x5a\x25\xea\x38\xb8\xae\xdb\x07\xd4\x01\x89\x44\ \xa2\xa5\x54\x2c\xa1\x7c\x85\xeb\xba\x48\x21\x91\xa6\x44\x4a\x89\ \x10\x06\xd2\x14\x48\x6d\x20\x84\xae\x0b\xd7\x9d\xa9\x0b\x0b\x8d\ \xf2\x34\x1a\x1f\xed\x81\x6b\x9a\x78\xbe\x8b\xe3\x38\xce\x72\x0e\ \xb2\xd3\xd9\xa9\xb9\x7b\x73\x38\x4d\x2d\x28\xdf\xc3\x30\x4c\x4c\ \xd3\x40\x4a\x89\x94\x06\xd2\x15\x48\x21\xff\xcf\x26\xad\x34\x4a\ \x2b\x94\xd2\x28\xe5\xa3\xb4\x22\x88\xc5\xf4\xd4\x14\xb3\xb3\xb3\ \xb3\x8d\x07\x07\x52\xc8\x40\xaa\xb3\x8b\x74\xfa\x16\x00\x55\xb7\ \x4a\xb5\x56\xc3\xf5\x3c\x94\xe7\xe2\x79\x1e\x9e\x76\xf1\x5c\x0f\ \xcf\x6f\x4c\xb7\xb1\xe7\x79\x78\x9e\x8b\xe7\xfb\x28\x05\xb3\x33\ \x33\x18\x42\xd0\xdc\xdc\x62\x2c\x03\x9a\x9a\x9a\x92\x2b\x56\x76\ \x20\x81\x42\xb1\x48\x53\xb4\x85\x90\x6d\x63\xdb\x01\x4c\xcb\x22\ \x18\xb4\x08\x06\x42\x04\x2d\x0b\xcb\x0a\x61\x59\x21\x82\x21\x1b\ \x2b\x10\xc2\xb2\x2c\x6c\xdb\x26\xfa\x50\x94\xa0\x69\x30\x7e\xfb\ \x36\x6b\x7b\x7b\x09\x47\x22\xb1\x65\x8b\x4a\xa5\xe2\xdc\xc5\xe1\ \x61\x1e\x7f\x6c\x1d\x77\xc6\x3f\x26\x9b\x9d\xa4\xab\xeb\x61\x2c\ \x3b\x58\x7f\x25\x12\x04\x02\xb9\x94\xec\xa5\x1c\x08\x81\x61\x18\ \x08\x29\xc8\x4c\x4c\x90\xbe\x9d\x66\xf3\xa6\xcd\xfc\xe7\xc3\x0f\ \x99\x9d\x99\xc9\x2f\x03\x2a\xd5\x9a\xf7\xc8\x9a\xd5\x9c\x18\x18\ \xe0\x0b\x9b\xb7\x52\x2c\xe5\xb8\x9b\x1e\x23\x18\x89\x12\x8f\xc5\ \x70\x1c\x07\x3b\x1c\xc6\x30\x4c\x8c\xc6\x5f\xab\xd5\x3c\x8a\xc5\ \x02\x73\x53\x73\xcc\xdd\xcb\x22\x85\xa4\xc9\x69\xe1\xea\xf5\x51\ \x92\x6d\x71\xec\x90\xed\x2f\x03\x9a\x9b\x9b\xdb\x56\x75\x77\xb3\ \xaa\xb3\x83\x33\xe7\xde\xa3\x5a\x71\x59\xfb\xf8\x23\x3c\xba\x36\ \x45\xb9\x58\xe6\xa3\x91\x11\x0c\x53\x12\x89\x44\x30\x84\xa4\x5c\ \x59\xa4\x5c\x5e\x24\x91\x4c\xd2\x16\x4b\xb0\x50\xc8\x33\x34\x74\ \x9e\x70\xe4\x21\x5a\x5b\x1c\x9e\xfa\x4a\x1f\xa7\x06\x07\xef\x5b\ \xa4\x95\x5f\x18\x1a\x3a\xc7\x86\xf5\xeb\xe9\xec\x68\xe7\xcc\xd0\ \x05\xde\x19\xf8\x07\x53\xd9\x69\x9e\xf9\xd2\x33\x7c\xfd\xf0\x0e\ \xee\xe5\xf3\x14\xe6\x17\xf0\x7d\x45\x38\x1c\x26\x99\x8c\x31\x71\ \xf7\x2e\x03\x83\xa7\x39\x37\x34\x44\x73\x4b\x33\x1b\x37\xf4\xf2\ \xb9\x75\xbd\x0c\x9d\xbf\x40\xb9\x54\x2c\x2f\x03\xc6\xc7\xef\x4c\ \x1e\x7c\xf1\x6b\xf4\x9f\x1c\xe0\x8b\xbb\x76\x71\xe8\xe0\x57\xc9\ \x66\xb3\x9c\xbf\xf0\x3e\x6f\xfd\xe9\x4d\xce\x9e\x5d\x89\x65\x85\ \x29\x2e\x96\x31\x05\x04\x6d\x1b\x69\x40\x66\x32\x0b\x28\x9e\xef\ \xdb\xcf\xea\xd5\x9f\x61\x7a\x66\x96\x33\x17\x86\xe9\x58\xd1\xc6\ \xc2\xfc\xfc\xd4\x32\xe0\xca\x95\x7f\x5f\x6f\x69\x69\xa5\xa3\xa3\ \x8d\xbf\xf5\xff\x9d\x4a\xb9\xc2\xbe\x7d\x7b\xf8\xe1\x91\x23\x64\ \x32\x19\x26\x27\x27\xc9\xcf\xe7\x68\xaa\x84\x41\x40\xc0\x0c\xd0\ \xe4\x38\x6c\xdd\xb0\x91\x8e\xae\x14\x93\x99\x2c\xc7\x8f\xff\x0e\ \x69\x06\x88\xb7\x36\x71\xe8\xe0\x0b\x1c\x3b\x76\xec\xda\x32\xa0\ \xb7\xb7\x77\xe4\x57\xaf\xbd\x76\xf7\xc8\xf7\x7f\xd0\xd9\x9e\xfc\ \x80\x53\xa7\x4e\xf3\xcb\x57\x5f\x65\xc7\xce\x9d\xbc\xf0\x7c\x1f\ \x7b\xf6\xec\x25\x37\xbf\xc0\x62\xb9\x00\x4a\x60\x04\x4d\xe2\xb1\ \x38\x33\x33\x59\x06\x06\x06\xe9\x3f\x71\x12\xdb\x0a\xb2\x7b\xf7\ \x4e\x9e\xdc\xf6\x24\x6f\xbe\xf5\x47\x57\xc2\x7b\xf5\x82\xa9\x35\ \xa3\xa3\xa3\x6d\xaf\xbf\xf1\xc6\xb7\x6b\x35\xff\x95\xbe\x03\x7d\ \x66\x24\x6a\x71\xe5\xca\x15\x2e\x5e\xbc\x84\x34\x4d\x52\x1d\x1d\ \x58\xb6\x4d\xa9\x54\xae\x17\xb4\xb0\x8d\x21\x04\x99\x4c\x86\x62\ \xa9\xc4\xa3\x6b\xd6\xb0\x6d\xfb\x76\x4a\xe5\x12\x97\x2f\x7f\x40\ \x3a\x7d\xeb\x0f\xdf\xfc\xc6\xe1\x9f\x6d\xd9\xb2\xe5\xba\x68\x14\ \xab\x96\x42\xa1\xd0\xfd\x9b\x63\xc7\xbe\x3b\x76\x2b\xfd\x1d\x29\ \x8c\xe0\xe1\x43\x2f\xd2\xd9\xd9\xce\x9d\x89\x49\xc6\xc7\xc7\xc9\ \xe5\xf2\x54\xab\x35\x10\x0a\x2b\x68\x13\x8d\x46\xe9\x58\xb1\x92\ \xf6\x95\xed\x28\x4f\xf1\xfa\xf1\xdf\x33\x33\x37\xab\x53\x2b\xdb\ \xdf\x7d\xe9\xa5\x6f\xfd\xa2\xbb\xbb\x67\x44\x08\x31\x29\x94\x52\ \x02\x08\x02\x71\xd7\x75\x57\x0f\x0e\x0e\xee\x7f\xbb\xbf\xff\xd0\ \xe8\x8d\x9b\x1d\x4f\x3f\xbd\x43\x1c\x38\xf0\x2c\xdd\xdd\xdd\x2c\ \x2e\x56\x50\xca\xaf\xb7\x4b\x0d\xd1\x70\x88\xe9\x99\x39\x4e\xff\ \xf3\x34\xfd\x27\xdf\x21\x60\xca\x62\xdf\xb3\xfb\xdf\x3e\xf0\xdc\ \x73\x7f\x8e\x46\xa3\x23\xc0\x14\x50\x16\xaa\xde\x06\x05\x60\x01\ \xad\xc0\xaa\x62\xb1\xb8\xfe\xd2\xa5\xe1\xa7\x86\x2f\xfe\xeb\xf3\ \x55\xaf\xda\x99\x4c\x24\x83\x81\x80\x2d\x8a\xe5\x45\x40\x63\x87\ \x2c\x0c\xd0\xb3\x33\xb3\x9e\xef\x7b\x73\xeb\xd6\xad\x1d\xd9\xbe\ \x7d\xdb\xd9\x44\x22\x39\x0c\xdc\x04\xb2\x40\x19\xf0\x97\x00\x4b\ \x90\x40\xa3\x2f\x27\x80\x4e\x60\x75\x2e\x97\xeb\x99\x9e\x9e\xee\ \x2a\x16\x8b\x09\xd7\x75\xc3\x5a\x6b\x11\x08\x04\x2a\xa1\x50\x28\ \x1f\x8f\xc7\x27\xe2\xf1\xf8\xc7\x86\x61\xdc\x04\xd2\x0d\xe1\x05\ \xa0\xda\xe8\x7d\x3c\x08\x78\x10\x64\x36\x6c\x0b\x37\x80\x11\x20\ \xd4\x38\x80\x00\xbc\x86\x48\xe9\x81\x59\x05\xdc\x25\xe1\xa5\xf1\ \x5f\x0f\xac\xd1\x7f\xa6\xa3\x79\x12\x00\x00\x00\x25\x74\x45\x58\ \x74\x63\x72\x65\x61\x74\x65\x2d\x64\x61\x74\x65\x00\x32\x30\x30\ \x39\x2d\x31\x31\x2d\x32\x38\x54\x31\x37\x3a\x31\x38\x3a\x32\x38\ \x2d\x30\x37\x3a\x30\x30\x31\x91\xb2\x2c\x00\x00\x00\x25\x74\x45\ \x58\x74\x64\x61\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\ \x31\x30\x2d\x30\x31\x2d\x31\x31\x54\x30\x38\x3a\x34\x35\x3a\x31\ \x36\x2d\x30\x37\x3a\x30\x30\x6c\x52\x00\xee\x00\x00\x00\x25\x74\ \x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\ \x30\x31\x30\x2d\x30\x31\x2d\x31\x31\x54\x30\x38\x3a\x34\x35\x3a\ \x31\x36\x2d\x30\x37\x3a\x30\x30\x1d\x0f\xb8\x52\x00\x00\x00\x35\ \x74\x45\x58\x74\x4c\x69\x63\x65\x6e\x73\x65\x00\x68\x74\x74\x70\ \x3a\x2f\x2f\x63\x72\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\ \x6e\x73\x2e\x6f\x72\x67\x2f\x6c\x69\x63\x65\x6e\x73\x65\x73\x2f\ \x4c\x47\x50\x4c\x2f\x32\x2e\x31\x2f\x3b\xc1\xb4\x18\x00\x00\x00\ \x25\x74\x45\x58\x74\x6d\x6f\x64\x69\x66\x79\x2d\x64\x61\x74\x65\ \x00\x32\x30\x30\x39\x2d\x31\x31\x2d\x32\x38\x54\x31\x34\x3a\x33\ \x32\x3a\x31\x34\x2d\x30\x37\x3a\x30\x30\xd5\x8b\xec\x49\x00\x00\ \x00\x16\x74\x45\x58\x74\x53\x6f\x75\x72\x63\x65\x00\x43\x72\x79\ \x73\x74\x61\x6c\x20\x50\x72\x6f\x6a\x65\x63\x74\xeb\xe3\xe4\x8b\ \x00\x00\x00\x27\x74\x45\x58\x74\x53\x6f\x75\x72\x63\x65\x5f\x55\ \x52\x4c\x00\x68\x74\x74\x70\x3a\x2f\x2f\x65\x76\x65\x72\x61\x6c\ \x64\x6f\x2e\x63\x6f\x6d\x2f\x63\x72\x79\x73\x74\x61\x6c\x2f\xa5\ \x91\x93\x5b\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x06\x10\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ \x00\x00\x05\xd7\x49\x44\x41\x54\x48\x89\x95\x95\x7b\x6c\x53\x55\ \x1c\xc7\xbf\xf7\xb6\xdd\xed\xbd\xb7\x5d\xf7\xe8\xb6\x96\x4d\xbb\ \x17\x43\xe6\xd8\x3a\x90\x6d\x56\x07\xc2\x00\x65\x31\x99\x46\x1e\ \x4e\x62\x14\x88\x46\x14\xe3\x73\x1a\xf0\x11\x1f\xf1\x1f\x1f\x51\ \x82\x4a\x88\xa8\x18\x45\x91\x44\x94\x69\x18\x51\xc1\x0d\x07\xc8\ \x6b\xb8\x6e\x0c\x36\xba\x51\xb6\x76\x5b\xb7\x6e\xeb\x7a\xfb\x6e\ \x6f\x7f\xfe\x41\x40\x90\xca\xf4\x97\x9c\xbf\xce\xf9\x7d\xbe\xe7\ \x77\xce\xef\x7c\x0f\x88\x08\xff\x75\x94\x01\x4c\xe5\xdc\xfb\x0c\ \x96\x9a\x75\x45\x0b\xee\x7d\xd1\x44\x44\xb8\xb3\xe1\x7b\xe6\x7a\ \x39\x0c\x11\xe1\x7a\xb1\xd2\x98\x51\x3c\xa7\xfc\xe6\x85\xb3\x66\ \xe6\x56\x79\xb9\xf4\x1c\xa1\xa4\x52\x08\x48\x13\xc3\xda\x1b\x0b\ \x6f\xfd\xfd\xc0\xe1\xcf\x7f\x6b\x3d\xf3\x1e\x67\x2c\x9c\x6c\xd9\ \xfd\x46\x28\x21\xe0\xdf\x94\x1f\x36\x19\xaa\x0e\x6d\x58\xf3\x6b\ \xf4\xe7\x6d\x71\x6a\xfb\x8e\xe8\xc4\xb7\xd4\xbb\xef\x1b\x8a\x07\ \xbd\x74\x29\x26\x25\x1f\xed\xfd\xec\x93\x43\x0f\x55\x54\xd7\x97\ \x70\x5a\x75\x22\x8e\x32\x91\xe8\xe6\x3b\xca\x5e\xde\xba\x71\xd9\ \xeb\x49\x3a\x8e\xc5\xf9\x63\xc0\x99\x18\x20\x13\x64\xc5\x34\x30\ \x0b\xea\x2e\xaf\x4b\xd6\x88\x58\x6a\xd6\x5b\xaa\x57\xcd\xb8\x75\ \x8b\x5e\xf5\x1e\x80\x86\x7f\xb2\xae\x39\xa2\x1d\x77\xcf\xdd\xbc\ \xaa\xf6\xa6\xf5\x18\xe9\x03\x9c\x23\xa0\x18\x10\x55\x89\x08\x33\ \x49\xb0\xe9\xcd\x30\x3e\xf1\x2a\x94\xbc\x06\xa2\x28\x82\xa7\x28\ \xf0\xd2\x22\x80\x97\x81\xec\x12\x7c\xda\x74\x6e\xcb\xda\x3d\x07\ \x1f\xbf\x92\xc7\x02\x40\xdd\x93\xdb\x18\x00\x78\xa7\x22\xff\xb9\ \x55\x8b\x4d\xeb\xe1\xe8\x06\x6c\x17\x10\xf1\x06\xe1\xf2\x01\x7d\ \x4e\x3f\xac\x67\x46\xd0\xde\x69\xa7\xc6\xc6\xbd\xb4\xbf\xf5\x08\ \x8e\xf7\xf4\xc1\xd1\xb4\x13\xd4\x7b\x06\x38\xef\x04\x06\x3a\xb1\ \x76\x71\xfe\xba\x37\x6f\x37\xbf\x70\x4d\x05\xb5\x8f\x7e\x74\x13\ \xd7\xfe\x43\xe9\x53\x4b\x0a\xb7\xcf\x0a\x59\xf9\x74\x67\x0f\x02\ \x71\x01\x83\x61\x01\xfd\xae\x00\xed\xb7\x8d\x74\x9c\x15\x4d\x43\ \x63\xe3\xee\xe3\x61\xbf\x67\x52\x93\x65\x28\x28\xac\x9e\x3f\x6f\ \x45\xcc\x5e\x3c\x93\x5c\xd0\x27\x85\xa0\x54\x32\x40\x61\x1e\x86\ \x99\x6c\xdf\xea\x0f\x9a\xe6\x34\x8d\x7b\x7a\x00\x40\x61\x0d\x97\ \xa4\x8e\x36\xef\x14\xea\x16\x95\xdd\xb7\x62\xe3\x2b\xb7\x0f\x30\ \x46\x38\x9c\x1e\x44\x86\x87\x71\x7a\xc0\x17\xdb\xda\x23\xfd\x60\ \xd5\x15\xed\x93\xc2\xe1\xed\xa1\x31\xe7\x0e\x22\x3a\x1a\x90\xa4\ \x16\xfb\xe9\x8e\x83\xbd\xf6\x61\x98\x34\xbc\x59\x9b\x2c\xb0\x22\ \x85\xc0\x84\x42\xd0\x18\x53\x92\x22\xd0\x0a\xe5\xf5\x6b\x1a\x2f\ \x77\xd1\xd3\x6b\x9e\x78\xe9\x5c\xaf\x5d\xbe\xd4\x1d\xa7\xce\x0d\ \xd0\x87\x0d\x1b\x69\xf9\x0c\x73\x73\x55\xc1\x9c\xd5\x96\x34\x43\ \x76\xa2\x0e\x29\x01\x8c\xf5\x5a\x6e\x6b\xdb\xe2\x02\xf2\xd5\xe7\ \x11\xd5\x1b\x89\x36\x54\x90\xed\xc5\x7b\xdd\xf3\xd4\xea\x2c\x22\ \x02\x7b\x0b\xa7\x11\xb3\x0b\x0a\x2a\xb2\x0c\x99\x2c\x00\xc4\x62\ \x31\x50\x44\xc2\x79\x22\x47\x77\xf7\x9f\xaf\x1f\xb1\x9d\xf8\xfc\ \xd0\xd8\x90\x33\x51\xb7\x75\x10\x0d\x75\x48\xe1\x4d\x7f\x0c\x4c\ \xf6\xf8\xe5\x24\x80\x00\x78\xbd\xc8\x49\xa6\xf4\x5c\x43\x7a\x39\ \x00\xb0\xaa\x8a\x65\x6a\x77\x57\xbb\x95\xe7\x79\x00\x40\x28\x4e\ \x18\xf5\x87\x71\xfe\x70\xeb\x61\x16\x68\x4b\xf8\x78\xae\xbc\x44\ \xa0\xbb\xcb\xed\x3b\x18\xf2\xfa\x20\x87\x82\x80\xd7\x03\x2e\xea\ \x43\x7e\x5e\x6e\x0d\x00\x28\xe5\xd1\x0b\xb2\x89\xf3\x24\x2b\xb7\ \xae\x05\xd4\x99\x90\xd3\x0a\x11\x1f\x27\xf8\x1d\x17\xba\x59\x40\ \x9a\x4a\xc0\x4a\x24\x2f\x37\xe5\xf4\x3a\x16\xad\x46\x86\x4e\x06\ \xef\x75\x00\x6a\x15\x92\x75\x43\x99\x65\x62\x46\x9a\x32\x38\x70\ \x5a\x8e\xe5\x15\x89\xb0\xb7\x03\xfd\x17\xc0\xfa\x81\xf4\x09\x1e\ \xa2\xdb\xc5\xb8\x2e\x16\x3d\x65\xc8\x19\xd3\x14\xd2\x1d\x2b\x10\ \x2f\x2d\x06\x54\x0a\x44\xe5\x38\xdc\x1d\xcf\x06\x58\x3a\x4a\x6c\ \x87\x7f\x44\xea\x1f\x72\x5b\xa1\xe4\x01\x8d\x0e\x2a\x9e\x87\x28\ \x72\xc8\xd3\xaa\x4b\x65\x80\xfb\x2f\x02\x86\xfc\x82\x92\x34\x4e\ \x81\x24\xe6\xe2\x7e\x42\x91\x28\x02\x32\xc3\x31\x14\x57\xb2\x00\ \x60\x1b\x18\x6c\x09\x86\x19\x80\xe3\x90\xc4\xc8\xd0\x08\x2c\x2a\ \xb3\xc4\x85\x22\xcb\xce\x9e\x0a\x5e\x91\xac\xaf\x9c\x5e\xb3\xf4\ \xae\xcc\x2c\x03\x54\xca\x8b\xce\xe3\xf5\x05\xa0\x16\x39\x4d\x5b\ \x70\x62\x94\x05\x00\xfb\xb8\xaf\xcb\x3a\x18\x3c\x09\x51\x00\xab\ \x62\x91\xaa\x8a\x60\x86\x51\xd0\xd4\xe5\xe8\xde\x29\x67\x18\x63\ \x22\xb0\xe5\x86\x99\xd3\xe7\xcf\xb4\x2c\xaf\x9f\x95\xf7\xa5\xf9\ \xf8\xee\x94\xe1\xd6\x66\x84\x25\x2f\x00\xe0\x58\x73\xb3\xed\xf8\ \xcf\x07\x76\x55\x9b\x97\xe8\x2f\x7b\xd1\xf3\xc5\x39\x8f\xbd\x7b\ \x4f\xfe\x16\x78\x46\x00\x8f\x04\x97\x2c\x60\x70\x34\x8a\xfd\xa3\ \xd4\xd6\xe8\x8e\x35\x48\xc3\x83\xbf\x9f\x22\x8a\x02\x80\x25\xb7\ \x74\xb6\x5e\xc5\xcc\x5d\x8a\xfe\x07\x6b\x0a\x75\xb7\x99\xb4\x51\ \xc4\xe2\x32\xba\x4c\xf3\x90\x61\x59\x82\xb7\x36\x7d\xf9\x82\xd5\ \x11\x68\x32\xac\xdc\x18\xb9\x2c\x60\x66\x58\xee\xfd\x65\xb3\x0f\ \x2c\x98\xae\xb4\xc0\xe5\x02\x05\xc2\x18\x0f\x10\xec\xb5\xcf\xa2\ \xd3\x30\x2b\xd6\x77\xe2\x68\xd7\x48\x7f\x7f\xbb\xaa\xb7\x5b\x2e\ \x8a\x4e\x56\x97\x31\x2e\xc3\x8d\xc6\x14\x31\x5d\x1d\x83\x06\x41\ \x40\xe0\x00\x43\x0e\xbe\xea\x4b\xee\xdc\xdc\xea\x78\x4d\x5b\xb6\ \xa0\x9d\x49\xcd\xee\xbd\xca\x4d\x6b\x53\xb5\x73\x3f\x7e\x60\xf6\ \xbe\xdc\x54\x39\x8d\x06\x9d\x60\xb2\x0a\x10\x78\x65\x0f\xc6\x3c\ \x3e\x4c\xfa\x7d\x08\x33\x0a\xc4\xf6\x6c\x47\x56\xeb\x0e\xa4\x88\ \x0a\x68\xd8\x28\x94\x88\x81\x78\x1e\x8c\x61\x1a\xba\xbd\x9a\xc9\ \x67\xbe\x68\xb9\x67\xef\xf8\x64\xf3\x25\xe6\x35\x76\x5d\x97\x91\ \x52\xf3\xf6\x23\xb5\x5f\xcf\xc8\x4f\xc9\x24\x4b\x3d\x98\xe2\xea\ \xab\xe6\x47\x1a\xb7\x43\x7b\x72\x0f\x78\x4e\x09\x62\x15\x20\x41\ \x00\x9b\x9a\x81\x8e\x73\x63\xee\x0d\x5b\x76\xaf\xf9\x69\x74\xfc\ \xc7\xab\x12\x12\x79\xcc\x7c\x5d\x6a\xe5\xae\x86\xf5\xa7\x3c\xee\ \x51\x22\x22\x92\xe5\x18\xc5\xe3\x71\x22\x22\x72\xb4\xfe\x42\xfe\ \xef\x37\x11\xfd\xb2\x8d\xa8\xf5\x1b\xf2\xef\xdd\x46\x3b\x1e\xb9\ \xbf\x79\x9e\xc0\x57\xfd\xaf\x3f\xb9\x3c\xf5\x86\xd2\xa2\x42\xd3\ \xc2\x65\x4f\xae\x5b\x67\xb9\x73\x49\x91\x5a\xc1\x40\x10\x45\x9c\ \x6d\xb3\x22\x17\x6e\x8c\xbb\x5c\xd2\x1f\x2d\x47\x4e\xfc\xd4\xb8\ \xef\xeb\x4e\xbb\xe3\xbb\x0e\xa2\x89\x44\x9c\xeb\x7e\xfa\xe5\x4a\ \x81\x53\xeb\x33\xcd\x05\x55\xb7\xad\x94\x7a\xcf\x76\xa9\x45\xad\ \x2e\x16\xf4\xc7\x23\x4e\x5b\xf7\x98\x47\x1a\xf0\xca\xb2\xad\x93\ \x28\xf8\xaf\x80\xa9\x04\xfe\x16\xe2\x92\x14\x62\x9a\x3e\x1e\x09\ \x85\xdb\x82\x13\x63\x53\x26\x5c\x11\x7f\x01\x11\x27\x49\x84\x4a\ \x59\x7f\x9a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ " qt_resource_name = "\ \x00\x0b\ \x0f\x08\x42\x1e\ \x00\x41\ \x00\x70\x00\x70\x00\x6c\x00\x69\x00\x63\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\ \x00\x06\ \x04\xd0\x3a\xc2\ \x00\x46\ \x00\x69\x00\x6c\x00\x74\x00\x65\x00\x72\ \x00\x07\ \x07\x3b\xe0\xf3\ \x00\x50\ \x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x73\ \x00\x06\ \x04\xa6\x4c\xf7\ \x00\x43\ \x00\x6f\x00\x6e\x00\x66\x00\x69\x00\x67\ \x00\x06\ \x05\x8c\x46\xa5\ \x00\x52\ \x00\x65\x00\x6d\x00\x6f\x00\x74\x00\x65\ \x00\x0b\ \x04\x69\xc7\xe2\ \x00\x53\ \x00\x68\x00\x6f\x00\x77\x00\x20\x00\x46\x00\x6f\x00\x6c\x00\x64\x00\x65\x00\x72\ \x00\x03\ \x00\x00\x59\xbe\ \x00\x52\ \x00\x75\x00\x6e\ \x00\x0e\ \x0d\xf4\x8a\x37\ \x00\x52\ \x00\x65\x00\x73\x00\x74\x00\x6f\x00\x72\x00\x65\x00\x20\x00\x43\x00\x6f\x00\x6e\x00\x66\x00\x69\x00\x67\ \x00\x06\ \x05\x8c\x35\x74\ \x00\x52\ \x00\x65\x00\x6c\x00\x6f\x00\x61\x00\x64\ \x00\x04\ \x00\x04\xbb\x04\ \x00\x45\ \x00\x64\x00\x69\x00\x74\ \x00\x07\ \x09\x8c\x74\x23\ \x00\x53\ \x00\x61\x00\x76\x00\x65\x00\x20\x00\x41\x00\x73\ \x00\x03\ \x00\x00\x54\xc7\ \x00\x4e\ \x00\x65\x00\x77\ \x00\x04\ \x00\x05\x98\xc5\ \x00\x53\ \x00\x61\x00\x76\x00\x65\ \x00\x0b\ \x04\x5b\x5a\x02\ \x00\x45\ \x00\x64\x00\x69\x00\x74\x00\x20\x00\x46\x00\x69\x00\x6c\x00\x74\x00\x65\x00\x72\ \x00\x10\ \x0d\xc3\xd1\x00\ \x00\x4e\ \x00\x65\x00\x77\x00\x20\x00\x46\x00\x69\x00\x6c\x00\x74\x00\x65\x00\x72\x00\x20\x00\x47\x00\x72\x00\x6f\x00\x75\x00\x70\ \x00\x0b\ \x04\x5c\xf5\xa2\ \x00\x43\ \x00\x6f\x00\x70\x00\x79\x00\x20\x00\x46\x00\x69\x00\x6c\x00\x74\x00\x65\x00\x72\ \x00\x0d\ \x05\x48\xe3\x42\ \x00\x52\ \x00\x65\x00\x6d\x00\x6f\x00\x76\x00\x65\x00\x20\x00\x46\x00\x69\x00\x6c\x00\x74\x00\x65\x00\x72\ \x00\x0a\ \x04\xc6\xa3\xe2\ \x00\x4e\ \x00\x65\x00\x77\x00\x20\x00\x46\x00\x69\x00\x6c\x00\x74\x00\x65\x00\x72\ \x00\x04\ \x00\x05\x37\xfe\ \x00\x4d\ \x00\x61\x00\x69\x00\x6e\ \x00\x04\ \x00\x05\x04\xcf\ \x00\x49\ \x00\x6e\x00\x66\x00\x6f\ \x00\x0a\ \x06\xab\xae\x79\ \x00\x52\ \x00\x65\x00\x70\x00\x6f\x00\x73\x00\x69\x00\x74\x00\x6f\x00\x72\x00\x79\ \x00\x04\ \x00\x04\xec\x30\ \x00\x48\ \x00\x65\x00\x6c\x00\x70\ " qt_resource_struct = "\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\ \x00\x00\x00\x1c\x00\x02\x00\x00\x00\x05\x00\x00\x00\x12\ \x00\x00\x00\x2e\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x08\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x04\ \x00\x00\x01\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x78\x00\ \x00\x00\x01\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x16\ \x00\x00\x01\x96\x00\x00\x00\x00\x00\x01\x00\x00\x4a\x35\ \x00\x00\x01\xb2\x00\x00\x00\x00\x00\x01\x00\x00\x6f\xec\ \x00\x00\x00\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x2b\x89\ \x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x11\xde\ \x00\x00\x00\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x23\xb3\ \x00\x00\x00\xf0\x00\x00\x00\x00\x00\x01\x00\x00\x2e\x48\ \x00\x00\x00\x66\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x7e\ \x00\x00\x00\x42\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x00\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x1e\x44\ \x00\x00\x00\x54\x00\x00\x00\x00\x00\x01\x00\x00\x06\x03\ \x00\x00\x00\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x26\x95\ \x00\x00\x00\x8e\x00\x00\x00\x00\x00\x01\x00\x00\x18\x00\ \x00\x00\x00\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x32\x16\ \x00\x00\x01\x40\x00\x00\x00\x00\x00\x01\x00\x00\x3c\xa2\ \x00\x00\x01\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x45\xf9\ \x00\x00\x01\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x41\x0e\ \x00\x00\x01\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x36\x69\ " def qInitResources(): QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() spykeviewer-0.4.1/spykeviewer/ui/filter_dock.py0000644000175000017500000005270112262550403020054 0ustar robrobimport os from PyQt4 import QtGui, QtCore from PyQt4.QtGui import (QDockWidget, QMessageBox, QAbstractItemView, QTreeWidget, QApplication, QStyle, QTreeWidgetItem) from PyQt4.QtCore import Qt, pyqtSignal from ..plugin_framework.filter_manager import FilterManager from checkable_item_delegate import CheckableItemDelegate class FilterDock(QDockWidget): """ Dock with filter tree. It manages filters of different types. They are displayed in a tree view and can be moved using drag and drop (only possible within the same filter type). The dock also takes care of storing and restoring the filters from disk. This dock has two signals: * ``current_filter_changed()``: Emitted when the currently selected item in the tree view changes. * ``filters_changed(str)``: Emitted whenever an action causes the list of filtered items to (potentially) change. """ FilterTreeRoleTop = 0 FilterTreeRoleGroup = 1 FilterTreeRoleFilter = 2 current_filter_changed = pyqtSignal() filters_changed = pyqtSignal(str) def __init__(self, filter_path, type_list, menu=None, title='Filter', parent=None): """ Create a new filter dock. :param str filter_path: Folder in the filesystem where filters are saved and loaded. :param list type_list: A list of (str, str) tuples. Each tuple describes one filter type. The first element is the name of the filter type. It will be displayed and used as parameter in the filters_changed callback. The second element is the filename that will be used to save and load the filters of this type. :param :class:`PyQt4.QtGui.QMenu` menu: A menu that will be displayed as context when the tree view is right-clicked. :param str title: The title of the dock. :param :class:`PyQt4.QtGui.QWidget` parent: The parent of this dock. """ QDockWidget.__init__(self, title, parent) self.setupUi() self.filter_path = filter_path self.menuFilter = menu self.filter_managers = {} self.type_list = type_list self.reload_filters(filter_path) self.filterTreeWidget.dragMoveEvent = self._filter_drag_move self.filterTreeWidget.dropEvent = self._filter_drag_end self.filterTreeWidget.keyReleaseEvent = self._filter_key_released self.filterTreeWidget.mouseReleaseEvent = \ self._filter_mouse_released self.filterTreeWidget.setItemDelegate( CheckableItemDelegate(self.filterTreeWidget)) self.filterTreeWidget.currentItemChanged.connect( self._current_filter_changed) self.filterTreeWidget.customContextMenuRequested.connect( self._context_menu) def reload_filters(self, filter_path=None): """ Reload filters from disk. :param str filter_path: Folder in the filesystem where filters are saved and loaded. If ``None``, previous filter path is used. Default: ``None`` """ if filter_path: self.filter_path = filter_path for t in self.type_list: self.filter_managers[t[0]] = FilterManager( t[1], os.path.join(filter_path, t[1] + '.py')) self.populate_filter_tree() def get_active_filters(self, filter_type): """ Return currently active filters for a filter type. """ return self.filter_managers[filter_type].get_active_filters() # Method injection to handle the actual "drop" of Drag and Drop def _filter_drag_end(self, event): source = self.filterTreeWidget.currentItem() source_name = source.text(0) target = self.filterTreeWidget.itemAt(event.pos()) source_top, source_group = self._get_filter_item_coords(source) parent = target.parent() if parent: if parent.parent(): target_top = parent.parent().text(0) target_group = parent.text(0) else: target_top = parent.text(0) if target.data(1, Qt.UserRole) == \ self.FilterTreeRoleGroup: target_group = target.text(0) else: target_group = None else: target_top = target.text(0) target_group = None # Find drop position target_index = self.filterTreeWidget.indexAt(event.pos()) target_height = self.filterTreeWidget.rowHeight(target_index) pos = event.pos() pos.setY((pos.y() - target_height / 2)) item_above_target = self.filterTreeWidget.itemAt(pos) above_target = item_above_target.text(0) if item_above_target \ else None item = self.filter_managers[source_top].get_item(source_name, source_group) try: self.filter_managers[source_top].remove_item(source_name, source_group) if target_group: self.filter_managers[target_top].add_item(item, source_name, target_group) else: self.filter_managers[target_top].add_item(item, source_name) except ValueError as e: QMessageBox.critical(self, 'Error moving item', str(e)) return self.filter_managers[target_top].move_item(source_name, above_target, target_group) self.populate_filter_tree() self.filters_changed.emit(source_top) # Method injection into the filter tree (to enable custom drag and drop # behavior) def _filter_drag_move(self, event): QAbstractItemView.dragMoveEvent(self.filterTreeWidget, event) source = self.filterTreeWidget.currentItem() target = self.filterTreeWidget.itemAt(event.pos()) if not target: event.ignore() return source_top = source.parent() if source_top.parent(): source_top = source_top.parent() target_top = target if target_top.parent(): target_top = target_top.parent() if target_top.parent(): target_top = target_top.parent() # Drag and Drop is only allowed for the same filter type if source_top != target_top: event.ignore() return # Groups can only be dragged to top level if source.data(1, Qt.UserRole) == self.FilterTreeRoleGroup: if target.data(1, Qt.UserRole) == \ self.FilterTreeRoleGroup: event.ignore() return if target.parent() != target_top and target != target_top: event.ignore() return # This strange hack prevents from dragging to root level if source_top == target: pos = event.pos() pos.setY(pos.y() - 2) higher_target = self.filterTreeWidget.itemAt(pos) if target != higher_target: event.ignore() # Method injection into the filter tree # (to enable custom checkable behavior) def _filter_key_released(self, event): index = self.filterTreeWidget.currentIndex() if index.data(CheckableItemDelegate.CheckTypeRole) and \ event.key() == Qt.Key_Space: self._switch_check_state(index) event.accept() # Hack to repaint the whole current item: self.filterTreeWidget.currentItem().setExpanded(False) elif event.key() == Qt.Key_Delete: self.delete_current_filter() else: QTreeWidget.keyReleaseEvent(self.filterTreeWidget, event) # Method injection into the filter tree # (to enable custom checkable behavior) def _filter_mouse_released(self, event): index = self.filterTreeWidget.indexAt(event.pos()) if index.data(CheckableItemDelegate.CheckTypeRole) and \ event.button() == Qt.LeftButton: style = QApplication.instance().style() radio_button_width = style.pixelMetric( QStyle.PM_ExclusiveIndicatorWidth) spacing = style.pixelMetric(QStyle.PM_RadioButtonLabelSpacing) item = self.filterTreeWidget.itemFromIndex(index) ind = 1 while item.parent(): ind += 1 item = item.parent() indent = ind * self.filterTreeWidget.indentation() if indent < event.x() < indent + radio_button_width + spacing: self._switch_check_state(index) event.accept() # Hack to repaint the whole current item: self.filterTreeWidget.currentItem().setExpanded(False) return QTreeWidget.mouseReleaseEvent(self.filterTreeWidget, event) def _get_filter_item_coords(self, item): parent = item.parent() if parent.parent(): top = parent.parent().text(0) group = parent.text(0) else: top = parent.text(0) group = None return top, group def _switch_check_state(self, index): item = self.filterTreeWidget.itemFromIndex(index) top, group = self._get_filter_item_coords(item) if index.data(CheckableItemDelegate.CheckTypeRole) == \ CheckableItemDelegate.CheckBoxCheckType: item.setData(0, CheckableItemDelegate.CheckedRole, not index.data(CheckableItemDelegate.CheckedRole)) f = self.filter_managers[top].get_item(item.text(0), group) f.active = item.data(0, CheckableItemDelegate.CheckedRole) else: parent = item.parent() if not parent: siblings = (self.filterTreeWidget.topLevelItem(x) for x in xrange(self.filterTreeWidget.topLevelItemCount())) else: siblings = (parent.child(x) for x in xrange(parent.childCount())) for s in siblings: s.setData(0, CheckableItemDelegate.CheckedRole, s == item) f = self.filter_managers[top].get_item(s.text(0), group) f.active = (s == item) self.filters_changed.emit(top) def current_filter_type(self): """ Return the name of the currently selected filter group or filter. If nothing is selected, None is returned. """ item = self.filterTreeWidget.currentItem() top = None if item: while item.parent(): item = item.parent() top = item.text(0) return top def current_filter_group(self): """ Return the name of the currently selected filter group. If a from inside a group is selected, the name of that group is returned. If a group or no item is selected, None is returned. """ item = self.filterTreeWidget.currentItem() group = None if item: parent = item.parent() if parent: if parent.parent(): group = parent.text(0) elif item.data(1, Qt.UserRole) == self.FilterTreeRoleGroup: group = item.text(0) return group def current_name(self): """ Return name of currently selected item. """ item = self.filterTreeWidget.currentItem() return item.text(0) def is_current_group(self): """ Return if the currently selected item is a filter group. """ item = self.filterTreeWidget.currentItem() return item.data(1, Qt.UserRole) == self.FilterTreeRoleGroup def current_item(self): """ Returns the current filter or filter group. """ item = self.filterTreeWidget.currentItem() top = self.current_filter_type() group = None if item: parent = item.parent() if parent: if parent.parent(): group = parent.text(0) return self.filter_managers[top].get_item(item.text(0), group) def group_filters(self, filter_type, group_name): """ Returns a list of all filters for a given filter group. :param str filter_type: Type of the filter group. :param str group_name: Name of the group. :returns: list """ return self.filter_managers[filter_type].get_group_filters(group_name) def filter_group_dict(self): """ Return a dictionary with filter groups for each filter type. """ d = {} for n, m in self.filter_managers.iteritems(): d[n] = m.list_group_names() return d def delete_item(self, filter_type, name, group): """ Removes a filter or a filter group. :param str name: Name of the item to be removed. :param str group: Name of the group to which the item belongs. If this is None, a top level item will be removed. Default: None """ self.filter_managers[filter_type].remove_item(name, group) def delete_current_filter(self): """ Removes the current filter. Checks with the user if he really wants to remove the filter. """ item = self.filterTreeWidget.currentItem() if not item: return if not item.parent(): return if QMessageBox.question(self, 'Please confirm', 'Do you really want to delete "%s"?' % item.text(0), QMessageBox.Yes | QMessageBox.No) == QMessageBox.No: return parent = item.parent() if parent.parent(): top = parent.parent().text(0) group = parent.text(0) else: top = parent.text(0) group = None try: self.filter_managers[top].remove_item(item.text(0), group) except StandardError as e: QMessageBox.critical(self, 'Error removing filter', str(e)) else: self.populate_filter_tree() self.filters_changed.emit(top) def add_filter(self, name, group, filter_type, code, on_exception, combined, overwrite=False): """ Add a new filter. :param str name: Name of the new filter. :param str group: Name of the group that the new filter belongs to. If this is None, the filter will not belong to any group (root level). Default: None :param str filter_type: The type of the new filter :param list code: List of lines of code in the filter function. :param bool on_exception: Should the filter return True on an exception? Default: ``True`` :param bool overwrite: If ``True``, an existing filter with the same name will be overwritten. If ``False`` and a filter with the same name exists, a value error is raised. Default: ``False`` """ self.filter_managers[filter_type].add_filter( name, code, on_exception=on_exception, group_name=group, combined=combined, overwrite=overwrite) self.populate_filter_tree() self.filters_changed.emit(filter_type) def add_filter_group(self, name, filter_type, exclusive, filters=None, overwrite=False): """ Add a new filter group. :param str name: The name of the new filter group. :param str filter_type: The name of the type the filter group belongs to. :param bool exclusive: Determines if the new group is exclusive, i.e. only one of its items can be active at the same time. :param list filters: A list of filter objects that the new filter group will contain. Default: None :param bool overwrite: If ``True``, an existing group with the same name will be overwritten. If ``False`` and a group with the same name exists, a value error is raised. Default : ``False`` """ self.filter_managers[filter_type].add_group( name, exclusive, group_filters=filters, overwrite=overwrite) self.populate_filter_tree() self.filters_changed.emit(filter_type) def save(self): """ Save all filters. """ for m in self.filter_managers.itervalues(): m.save() def populate_filter_tree(self): """ Populates the filter tree widget from the filter data. Called automatically from other methods when necessary. """ self.filterTreeWidget.clear() for name, manager in sorted(self.filter_managers.items()): top = QTreeWidgetItem(self.filterTreeWidget) top.setText(0, name) top.setFlags(Qt.ItemIsEnabled | Qt.ItemIsDropEnabled) top.setData(1, Qt.UserRole, self.FilterTreeRoleTop) top.setTextColor(0, Qt.gray) top.setChildIndicatorPolicy(QTreeWidgetItem.ShowIndicator) self.filterTreeWidget.addTopLevelItem(top) if manager.list_items(): top.setExpanded(True) for i in manager.list_items(): if isinstance(i[1], manager.FilterGroup): group = QTreeWidgetItem(top) group.setText(0, i[0]) group.setData(1, Qt.UserRole, self.FilterTreeRoleGroup) group.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDropEnabled | Qt.ItemIsDragEnabled) group.setChildIndicatorPolicy( QTreeWidgetItem.ShowIndicator) if i[1].list_items(): group.setExpanded(True) top.addChild(group) for f in i[1].list_items(): item = QTreeWidgetItem(group) item.setText(0, f[0]) if f[1].active: item.setData(0, CheckableItemDelegate.CheckedRole, True) else: item.setData(0, CheckableItemDelegate.CheckedRole, False) if i[1].exclusive: item.setData(0, CheckableItemDelegate.CheckTypeRole, CheckableItemDelegate.RadioCheckType) else: item.setData(0, CheckableItemDelegate.CheckTypeRole, CheckableItemDelegate.CheckBoxCheckType) item.setData(1, Qt.UserRole, self.FilterTreeRoleFilter) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled) group.addChild(item) else: item = QTreeWidgetItem(top) item.setText(0, i[0]) if i[1].active: item.setData(0, CheckableItemDelegate.CheckedRole, True) else: item.setData(0, CheckableItemDelegate.CheckedRole, False) item.setData(0, CheckableItemDelegate.CheckTypeRole, CheckableItemDelegate.CheckBoxCheckType) item.setData(1, Qt.UserRole, self.FilterTreeRoleFilter) item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled) top.addChild(item) def current_is_data_item(self): """ Returns if the currently selected item is a filter or a filter group. """ current = self.filterTreeWidget.currentItem() return current is not None and \ current.data(1, Qt.UserRole) != self.FilterTreeRoleTop def _current_filter_changed(self, current): self.current_filter_changed.emit() def _context_menu(self, pos): if self.menuFilter: self.menuFilter.popup(self.filterTreeWidget.mapToGlobal(pos)) def setupUi(self): self.filterTreeWidget = QtGui.QTreeWidget(self) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(3) sizePolicy.setHeightForWidth( self.filterTreeWidget.sizePolicy().hasHeightForWidth()) self.filterTreeWidget.setSizePolicy(sizePolicy) self.filterTreeWidget.setContextMenuPolicy( QtCore.Qt.CustomContextMenu) self.filterTreeWidget.setDragEnabled(True) self.filterTreeWidget.setDragDropMode( QtGui.QAbstractItemView.InternalMove) self.filterTreeWidget.setDefaultDropAction(QtCore.Qt.MoveAction) self.filterTreeWidget.setAlternatingRowColors(False) self.filterTreeWidget.setUniformRowHeights(False) self.filterTreeWidget.setObjectName("filterTreeWidget") self.filterTreeWidget.header().setVisible(False) self.setWidget(self.filterTreeWidget)spykeviewer-0.4.1/spykeviewer/api.py0000644000175000017500000000707312262550403015725 0ustar robrobclass __ConfigOptions: def __init__(self): # Ask about plugin paths if saving a file to a path that is not # a plugin path self.ask_plugin_path = True # Save and reload a modified plugin before starting self.save_plugin_before_starting = True # Load selection on start self.load_selection_on_start = True # Default load mode (0 - Regular, 1 - Lazy, 2 - Cached lazy) self.load_mode = 0 # Default cascading mode (False - Regular, True - Lazy) self.lazy_cascading = False # Use Enter key for code completion in console self.codecomplete_console_enter = True # Use Enter key for code completion in editor self.codecomplete_editor_enter = True # Additional parameters for remote script self.remote_script_parameters = [] # Show duplicate channels (those that belong to multiple # channel groups) multiple times in navigation self.duplicate_channels = False # Select all visible segments in navigation by default self.autoselect_segments = False # Select all visible channel groups in navigation by default self.autoselect_channel_groups = False # Select all visible channels in navigation by default self.autoselect_channels = True # Select all visible units in navigation by default self.autoselect_units = False def __setitem__(self, key, value): self.__dict__[key] = value def __getitem__(self, item): return self.__dict__[item] config = __ConfigOptions() window = None app = None def start_plugin(name, current=None, selections=None): """ Start first plugin with given name and return result of start() method. Raises a SpykeException if not exactly one plugins with this name exist. :param str name: The name of the plugin. Should not include the directory. :param current: A DataProvider to use as current selection. If ``None``, the regular current selection from the GUI is used. :param list selections: A list of DataProvider objects to use as selections. If ``None``, the regular selections from the GUI are used. """ return window.start_plugin(name, current, selections) def start_plugin_remote(name, current=None, selections=None): """ Start first plugin with given name using the remote script. Raises a SpykeException if not exactly one plugins with this name exist. :param str name: The name of the plugin. Should not include the directory. :param current: A DataProvider to use as current selection. If ``None``, the regular current selection from the GUI is used. :param list selections: A list of DataProvider objects to use as selections. If ``None``, the regular selections from the GUI are used. """ window.start_plugin_remote(name, current, selections) def get_plugin(name): """ Get plugin with the given name. Raises a SpykeException if multiple plugins with this name exist. Returns None if no such plugin exists. :param str name: The name of the plugin. Should not include the directory. """ return window.get_plugin(name) def annotation_editor(neo_object): """ Open a graphical annotation editor for a Neo object. :param neo_object: Any Neo object. """ window.edit_annotations(neo_object) def load_files(file_paths): """ Open a list files. :param list file_paths: The files to open as strings with the full file path. """ window.load_files(file_paths)spykeviewer-0.4.1/spykeviewer/plugin_framework/0000755000175000017500000000000012262550403020146 5ustar robrobspykeviewer-0.4.1/spykeviewer/plugin_framework/__init__.py0000644000175000017500000000000012262550403022245 0ustar robrobspykeviewer-0.4.1/spykeviewer/plugin_framework/plugin_manager.py0000644000175000017500000001240712262550403023514 0ustar robrobimport os import sys import inspect import traceback import logging import re from spykeutils.plugin.analysis_plugin import AnalysisPlugin logger = logging.getLogger('spykeviewer') def _compare_nodes(x, y): """ Directory Nodes should come first, then sort alphabetically. """ ret = int(isinstance(y, PluginManager.DirNode)) - \ int(isinstance(x, PluginManager.DirNode)) return ret or (1 - 2 * int(x.name < y.name)) class PluginManager: """ Manages plugins loaded from a directory. """ class Node: def __init__(self, parent, data, path, name): self.parent = parent self.data = data self.name = name self.path = path def childCount(self): return 0 def row(self): if self.parent: return self.parent.children.index(self) return 0 class DirNode(Node): def __init__(self, parent, data, path=''): """ Recursively walk down the tree, loading all legal plugin classes along the way. """ PluginManager.Node.__init__(self, parent, data, path, '') self.children = [] if path: self.addPath(path) def child(self, row): """ Return child at given position. """ return self.children[row] def childCount(self): """ Return number of children. """ return len(self.children) def get_dir_child(self, path): """ Return child node with given directory name. """ for n in self.children: if os.path.split(n.path)[1] == os.path.split(path)[1] and \ isinstance(n, PluginManager.DirNode): return n return None def addPath(self, path): """ Add a new path. """ if not path: return self.name = os.path.split(path)[1] for f in os.listdir(path): # Don't include hidden directories if f.startswith('.'): continue p = os.path.join(path.decode('utf-8'), f).encode('utf-8') if os.path.isdir(p): new_node = self.get_dir_child(p) if new_node: new_node.addPath(p) else: new_node = PluginManager.DirNode(self, None, p) if new_node.childCount(): self.children.append(new_node) else: if not f.endswith('.py'): continue # Found a Python file, execute it and look for plugins exc_globals = {} try: # We turn all encodings to UTF-8, so remove encoding # comments manually f = open(p, 'r') lines = f.readlines() if not lines: continue if re.findall('coding[:=]\s*([-\w.]+)', lines[0]): lines.pop(0) elif re.findall('coding[:=]\s*([-\w.]+)', lines[1]): lines.pop(1) source = ''.join(lines).decode('utf-8') code = compile(source, p, 'exec') sys.path.insert(0, path) exec(code, exc_globals) except Exception: logger.warning('Error during execution of ' + 'potential plugin file ' + p + ':\n' + traceback.format_exc() + '\n') finally: if sys.path[0] == path: sys.path.pop(0) for cl in exc_globals.values(): if not inspect.isclass(cl): continue # Should be a subclass of AnalysisPlugin... if not issubclass(cl, AnalysisPlugin): continue # ...but should not be AnalysisPlugin (can happen # when directly imported) if cl == AnalysisPlugin: continue # Plugin class found, add it to tree try: instance = cl() instance.source_file = p except Exception: etype, evalue, etb = sys.exc_info() evalue = etype('Exception while creating %s: %s' % (cl.__name__, evalue)) raise etype, evalue, etb self.children.append(PluginManager.Node( self, instance, p, instance.get_name())) self.children.sort(cmp=_compare_nodes) def __init__(self): self.root = self.DirNode(None, None) def add_path(self, path): """ Add a new path to the manager. """ self.root.addPath(path)spykeviewer-0.4.1/spykeviewer/plugin_framework/data_provider_viewer.py0000644000175000017500000000243212262550403024725 0ustar robrobfrom spykeutils.plugin.data_provider_neo import NeoDataProvider class NeoViewerProvider(NeoDataProvider): def __init__(self, viewer, name='__current__'): super(NeoViewerProvider, self).__init__(name, viewer.progress) self.viewer = viewer def blocks(self): """ Return a list of selected Block objects. """ return self.viewer.neo_blocks() def segments(self): """ Return a list of selected Segment objects. """ return self.viewer.neo_segments() def recording_channel_groups(self): """ Return a list of selected """ return self.viewer.neo_channel_groups() def recording_channels(self): """ Return a list of selected recording channel indices. """ return self.viewer.neo_channels() def units(self): """ Return a list of selected Unit objects. """ return self.viewer.neo_units() def data_dict(self): """ Return a dictionary with all information to serialize the object. """ data = NeoViewerProvider._get_data_from_viewer(self.viewer) data['name'] = self.name return data def refresh_view(self): """ Refresh associated views of the data. """ self.viewer.refresh_neo_view()spykeviewer-0.4.1/spykeviewer/plugin_framework/filter_manager.py0000644000175000017500000003754412262550403023514 0ustar robrobimport re import codecs from collections import OrderedDict def _move_ordered_dict_item(o_dict, item_key, new_position): """ Move an item in an ordered dictionary to a new position :param OrderedDict o_dict: The dictionary on which the move takes place :param key item_key: The key of the item to move. If the key does not exist in the dictionary, this function will do nothing. :param key new_position: The item to move will be inserted after the item with this key. If this key does not exist in the dictionary, the item will be moved to the first position. """ # Bad performance, use only on small dictionaries # and/or non time-critical places if not o_dict or not item_key in o_dict: return item = o_dict[item_key] items = o_dict.items() in_there = new_position in o_dict o_dict.clear() if not in_there: o_dict[item_key] = item for i in items: if i[0] != item_key: o_dict[i[0]] = i[1] if i[0] == new_position: o_dict[item_key] = item class FilterManager: """ Manage custom filters for object selection. """ class Filter: """ Represents a single filter. """ def __init__(self, code, parent, active=True, combined=False, on_exception=True): """ Creates a new filter. :param str code: List of lines of code in the filter function. :param bool active: Is the filter active? :param bool combined : When True, the filter gets a list of items and returns a filtered list. Otherwise, the filter gets a single item and returns ``True`` or ``False``. :param bool on_exception: Should the filter return ``True`` on an exception? """ self.code = code self.active = active self.combined = combined self.on_exception = on_exception self._parent = parent def function(self): return self._parent._get_filter_function(self) class FilterGroup: """ Represents a filter group. """ def __init__(self, exclusive=False): self.filters = OrderedDict() self.exclusive = exclusive def list_items(self): """ Returns a list of (name, filter) tuples. """ return self.filters.items() def move_filter(self, item, new_pos): """ Move an item to a new position. :param str item: The key of the item to move. If the key does not exist, this method will do nothing. :param str new_pos: The item to move will be inserted after the item with this key. If this key does not exist, the item will be moved to the first position. """ _move_ordered_dict_item(self.filters, item, new_pos) def __init__(self, parameter_list, filename): """ Constructs filter object with a given method parameter list (given as string) and filename. """ self.signature = parameter_list self.filename = filename self.filters = OrderedDict() self.currently_loading = False try: self.load() except IOError: pass def _load_filter_group(self, s, group): # Work regular expression magic to extract method names and code s = s.replace(' ', '\t') nl = '(?:\n|\r|\r\n)' # Different possibilities for newline it = re.finditer('^def filter\\(%s(?Ps?)\\)' ':(?P\s*#.*)?%s\t"""(?P[^"]*)"""' '%s(?P(?:\t.*%s)*)' % (self.signature, nl, nl, nl), s, re.M) for i in it: name = i.group('name') # Remove starting tabs body = [x[1:] for x in re.split(nl, i.group('body'))] if body[-1] == '': body = body[:-1] flag_string = i.group('flags') active = False on_exception = False combined = (i.group('plural') == 's') if flag_string: flags = flag_string.strip()[1:].split(',') for f in flags: f = f.strip() if f == 'ACTIVE': active = True elif f == 'EXCEPTION_TRUE': on_exception = True self.add_filter(name, body, active, combined, on_exception, group) def load(self): """ Clears all filters and reloads them from file. """ self.currently_loading = True f = codecs.open(self.filename, 'r', 'utf-8') s = f.read() # Search for groups and load filters for each group start = 0 end = 0 while end >= 0: group_pos = s.find('#GROUP ', start) if group_pos >= 0: self._load_filter_group(s[start:group_pos], None) lines = s[group_pos:].splitlines() group = lines[0][7:] self.add_group(group, lines[1].strip() == '#EXCLUSIVE') end = s.find('#ENDGROUP', group_pos) if end >= 0: self._load_filter_group(s[group_pos:end], group) else: self._load_filter_group(s[group_pos:], group) start = end else: end = group_pos if start >= 0: self._load_filter_group(s[start:], None) f.close() self.currently_loading = False def _write_filter(self, file, name, flt): plural = '' if flt.combined: plural = 's' file.write('\ndef filter(%s%s):' % (self.signature, plural)) if flt.active or flt.on_exception: file.write(' #') if flt.active: file.write('ACTIVE') if flt.on_exception: file.write(',') if flt.on_exception: file.write('EXCEPTION_TRUE') file.write('\n') file.write('\t"""%s"""\n' % name) for l in flt.code: file.write('\t%s\n' % l) def save(self): """ Saves all filters to file. """ f = codecs.open(self.filename, 'w', 'utf-8') f.write('# Filter file. All functions need to have the same parameter list.\n') f.write('# All code outside of functions (e.g. imports) will be ignored!\n') f.write('# When editing this file manually, use tab indentation or indent by 4 spaces,\n') f.write('# otherwise the filter functions will not be recognized!\n') for n, i in self.filters.iteritems(): if isinstance(i, self.FilterGroup): f.write('\n#GROUP %s\n' % n) if i.exclusive: f.write('#EXCLUSIVE\n') for fn, flt in i.filters.iteritems(): self._write_filter(f, fn, flt) f.write('#ENDGROUP\n') else: self._write_filter(f, n, i) f.close() def add_item(self, item, name, group_name=None, overwrite=False): """ Adds an existing item (Filter or FilterGroup). :param str name: Name of the new filter. :param item: The item to add. :type item: :class:`Filter` or :class:`FilterGroup` :param str group_name: Name of the group that the new filter belongs to. If this is None, the filter will not belong to any groop (root level) Default: None :param bool overwrite: If ``True``, an existing item with the same name will be overwritten. If ``False`` and an item with the same name exists, a value error is raised. Default: ``False`` """ if not group_name: if name in self.filters: if not overwrite: raise ValueError('A filter or filter group named "%s" already exists!' % str(name)) prev = self.filters[name] if isinstance(prev, FilterManager.FilterGroup) \ and isinstance(item, FilterManager.Filter): raise ValueError('A filter group named "%s" already exists!' % str(name)) if isinstance(prev, FilterManager.Filter) \ and isinstance(item, FilterManager.FilterGroup): raise ValueError('A filter named "%s" already exists!' % str(name)) self.filters[name] = item else: if not group_name in self.filters: raise ValueError('No filter group named "%s" exists!' % str(group_name)) g = self.filters[group_name] if not overwrite and name in g.filters: raise ValueError('A filter named "%s" already exists in group "%s"!' % (str(name), str(group_name))) if g.exclusive and not self.currently_loading: if any(f.active for f in g.filters.itervalues()): item.active = False elif all(not f.active for f in g.filters.itervalues()): item.active = True g.filters[name] = item def add_group(self, name, exclusive, group_filters=None, overwrite=False): """ Adds a filter group. :param str name: The name of the new filter group. :param bool exclusive: Determines if the new group is exclusive, i.e. only one of its items can be active at the same time. :param bool overwrite: If ``True``, an existing group with the same name will be overwritten. If ``False`` and a group with the same name exists, a value error is raised. Default: False """ if name in self.filters: prev = self.filters[name] if isinstance(prev, FilterManager.Filter): raise ValueError('A filter with this name already exists!') if not overwrite: raise ValueError('A filter group with this name already exists!') g = self.FilterGroup(exclusive) if group_filters: if exclusive: for f in group_filters.itervalues(): f.active = False group_filters.values()[0].active = True g.filters = group_filters else: g.filters = OrderedDict() self.filters[name] = g def add_filter(self, name, code, active=True, combined=False, on_exception=True, group_name=None, overwrite=False): """ Adds a filter. :param str name: Name of the new filter. :param list code: List of lines of code in the filter function. :param bool active: Is the filter active? Default: ``True`` :param bool on_exception: Should the filter return True on an exception? Default: ``True`` :param str group_name: Name of the group that the new filter belongs to. If this is None, the filter will not belong to any group (root level). Default: None :param bool overwrite: If ``True``, an existing filter with the same name will be overwritten. If ``False`` and a filter with the same name exists, a value error is raised. Default: ``False`` """ self.add_item(self.Filter(code, self, active, combined, on_exception), name, group_name, overwrite) def get_item(self, name, group=None): """ Returns a filter or filter group object. :param str name : Name of the selected filter or filter group. :param str group: Name of the group to which the filter belongs. Only valid for filter objects, not for filter groups. If this is None, a top level item is used. Default: None :returns: :class:`Filter` or :class:`FilterGroup` """ if not group: if not name in self.filters: raise KeyError('No item named "%s" exists!' % str(name)) return self.filters[name] else: if not group in self.filters: raise KeyError('No group named "%s" exists!' % str(group)) g = self.filters[group] if not isinstance(g, self.FilterGroup): raise TypeError('Item "%s" is not a filter group!' % str(group)) if not name in g.filters: raise KeyError('No item named "%s" exists!' % str(name)) return g.filters[name] def get_group_filters(self, group): """ Returns a list of all filters for a given filter group. :param str group: Name of the group. :returns: list """ if not group in self.filters: raise KeyError('No item named "%s" exists!' % str(group)) g = self.filters[group] if not isinstance(g, self.FilterGroup): raise TypeError('Item "%s" is not a filter group!' % str(group)) return g.filters def _get_filter_function(self, filter): local = {} plural = '' if filter.combined: plural = 's' s = 'def fun(%s%s):\n\t' % (self.signature, plural) s += '\n\t'.join(filter.code) exec(s, {}, local) return local['fun'] def list_items(self): """ Returns a list of (name, :class:`Filter` or :class:`FilterGroup`) tuples. """ return self.filters.items() def move_item(self, item, new_pos, group_name=None): """ Move an item to a new position. :param key item: The key of the item to move. If the key does not exist, this method will do nothing. :param key new_pos: The item to move will be inserted after the item with this key. If this key does not exist, the item will be moved to the first position. """ if not group_name: _move_ordered_dict_item(self.filters, item, new_pos) else: self.filters[group_name].move_filter(item, new_pos) def get_active_filters(self): """ Returns a list of tuples with all active filters contained in this manager and their names. """ ret = [] for i_name, i in self.filters.iteritems(): if isinstance(i, self.FilterGroup): for f_name, f in i.filters.iteritems(): if f.active: ret.append((f, f_name)) else: if i.active: ret.append((i, i_name)) return ret def list_group_names(self): """ Returns a list of names of filter groups. """ names = [] for n, i in self.filters.iteritems(): if isinstance(i, self.FilterGroup): names.append(n) return names def remove_item(self, item, group=None): """ Removes an item from the filter tree. :param str item: Name of the item to be removed. :param str group: Name of the group to which the item belongs. If this is None, a top level item will be removed. Default: None """ if not group: if not item in self.filters: raise KeyError('No item named "%s" exists!' % str(item)) self.filters.pop(item) else: if not group in self.filters: raise KeyError('No group named "%s" exists!' % str(group)) g = self.filters[group] if not isinstance(g, self.FilterGroup): raise TypeError('Item "%s" is not a filter group!' % str(group)) if not item in g.filters: raise KeyError('No item named "%s" exists!' % str(item)) g.filters.pop(item) def group_exclusive(self, name): """ Returns if a group is exclusvie. """ if not name in self.filters or not isinstance(self.filters[name], self.FilterGroup): return False return self.filters[name].exclusivespykeviewer-0.4.1/spykeviewer/tests/0000755000175000017500000000000012262550403015735 5ustar robrobspykeviewer-0.4.1/spykeviewer/tests/test_plugin_manager.py0000644000175000017500000000263512262550403022344 0ustar robrobtry: import unittest2 as ut except ImportError: import unittest as ut import sys import os from spykeviewer.plugin_framework.plugin_manager import PluginManager class TestPluginManager(ut.TestCase): def setUp(self): self.manager = PluginManager() if hasattr(sys, 'frozen'): module_path = os.path.dirname(sys.executable) else: file_path = os.path.abspath(os.path.dirname(__file__)) module_path = os.path.dirname(file_path) self.manager.add_path(os.path.join(module_path, 'plugins')) def test_not_empty(self): self.assertGreater(self.manager.root.childCount(), 0, 'Plugin manager with default path is empty') def test_directories_loaded(self): num_dirs = 0 for n in self.manager.root.children: if isinstance(n, PluginManager.DirNode): num_dirs += 1 self.assertGreater(num_dirs, 0, 'No plugin directories loaded') def test_plugins_loaded(self): def find_plugins(dir_node): plugins = 0 for n in dir_node.children: if isinstance(n, PluginManager.DirNode): plugins += find_plugins(n) else: plugins += 1 return plugins self.assertGreater(find_plugins(self.manager.root), 0, 'No plugins loaded') if __name__ == '__main__': ut.main() spykeviewer-0.4.1/spykeviewer/tests/__init__.py0000644000175000017500000000000012262550403020034 0ustar robrobspykeviewer-0.4.1/spykeviewer/tests/test_main_window.py0000644000175000017500000000573512262550403021673 0ustar robrobtry: import unittest2 as ut except ImportError: import unittest as ut import sys import os import platform import locale # Hack to circumvent OS X locale bug if platform.system() == 'Darwin': if os.getenv('LC_CTYPE') == 'UTF-8': os.environ['LC_CTYPE'] = '' else: locale.setlocale(locale.LC_ALL, '') # Use new style API import sip sip.setapi('QString', 2) sip.setapi('QDate', 2) sip.setapi('QDateTime', 2) sip.setapi('QTextStream', 2) sip.setapi('QTime', 2) sip.setapi('QVariant', 2) sip.setapi('QUrl', 2) sip.setapi('QVariant', 2) from PyQt4 import QtGui from PyQt4.QtTest import QTest from PyQt4.QtCore import Qt from spykeviewer.ui.main_window_neo import MainWindowNeo class TestMainWindow(ut.TestCase): @classmethod def setUpClass(cls): cls.app = QtGui.QApplication(sys.argv) cls.win = MainWindowNeo() @classmethod def tearDownClass(cls): cls.win.close() def test_object_selections(self): self.assertNotEqual(self.win.neo_blocks(), None) self.assertNotEqual(self.win.neo_segments(), None) self.assertNotEqual(self.win.neo_channel_groups(), None) self.assertNotEqual(self.win.neo_channels(), None) self.assertNotEqual(self.win.neo_units(), None) def test_plugins_loaded(self): self.assert_( self.win.plugin_model.hasIndex(0, 0), 'Plugin model is empty') def test_filter_tree(self): self.assertEqual( self.win.filterDock.filterTreeWidget.topLevelItemCount(), 5) def test_file_tree(self): self.assert_( self.win.fileTreeView.model().hasIndex(0, 0), 'Filesystem model is empty') def test_console(self): QTest.keyClick(self.win.console, Qt.Key_1) QTest.keyClick(self.win.console, Qt.Key_Plus) QTest.keyClick(self.win.console, Qt.Key_1) lines = self.win.console.get_line_count() self.assertEqual( self.win.console.get_text_line(lines - 1), '>>> 1+1') QTest.keyClick(self.win.console, Qt.Key_Enter) lines = self.win.console.get_line_count() self.assertEqual(self.win.console.get_text_line(lines - 1), '>>> ') def test_history(self): history_lines = self.win.history.get_line_count() QTest.keyClick(self.win.console, Qt.Key_5) QTest.keyClick(self.win.console, Qt.Key_Enter) self.assertEqual( history_lines + 1, self.win.history.get_line_count()) self.assertEqual( self.win.history.get_text_line(history_lines), '5') def test_plugin_editor(self): self.assertEqual( self.win.pluginEditorDock.tabs.currentWidget(), None) self.win.actionNewPlugin.trigger() self.assertNotEqual( self.win.pluginEditorDock.tabs.currentWidget(), None) self.assertEqual( u'\n'.join(self.win.pluginEditorDock.code()), unicode(self.win.pluginEditorDock.template_code + '\n')) if __name__ == '__main__': ut.main()spykeviewer-0.4.1/spykeviewer/splash_rc.py0000644000175000017500000027475412262550403017146 0ustar robrob# -*- coding: utf-8 -*- # Resource object code # # Created: Do. Jun 6 13:05:36 2013 # by: The Resource Compiler for PyQt (Qt v4.8.2) # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore qt_resource_data = "\ \x00\x00\x5a\xbb\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\xde\x00\x00\x00\x5c\x08\x06\x00\x00\x00\x01\x1f\x0b\x64\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xf1\x00\xf1\x00\xf1\xf2\xab\ \x19\xff\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x11\x00\x00\ \x0b\x11\x01\x7f\x64\x5f\x91\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xdd\x06\x06\x0a\x1b\x1e\x96\xf1\x7c\x02\x00\x00\x20\x00\x49\x44\ \x41\x54\x78\xda\xec\xbd\x77\x98\x5d\xd5\x95\xe6\xfd\x5b\xfb\xdc\ \x54\xa5\x0a\xaa\xa4\x0a\x4a\xa5\x8c\x42\x95\x4a\x81\x0c\x92\xc8\ \xd9\x18\x03\xc6\x60\xbb\x3d\x26\x19\xdb\xed\xb1\xbf\xef\x99\x69\ \xc7\xee\xe9\x99\xf9\xda\x3d\x8d\xdb\x9e\xe9\x6e\x63\x43\x7b\x6c\ \x6c\x93\x4c\xce\x48\x20\x82\x22\x92\x90\x48\x42\x19\x94\x53\x29\ \x94\x4a\xaa\x52\xc5\x7b\xef\xd9\xdf\x1f\x27\xed\x7d\xee\x2d\x81\ \x7a\xe6\xe9\xbf\x7c\x79\x44\x49\xb7\xee\x3d\x67\x9f\x1d\xdf\xf5\ \xae\xb5\xde\x25\xff\xe9\x81\xff\xa4\xcb\xcb\xcb\xf9\xf3\xeb\xcf\ \xaf\x3f\xbf\xfe\x7d\x5e\xdb\xb6\x6d\x43\x01\x74\x77\x77\xff\xb9\ \x37\xfe\xfc\xfa\xf3\xeb\xdf\x69\xd1\x01\xde\xc2\xfb\xf3\xe2\xfb\ \xf3\xeb\xcf\xaf\x7f\xbf\x45\x67\x2d\xbc\x3f\x2f\xbe\x3f\xbf\xfe\ \xfc\xfa\xf7\x59\x74\x00\x89\xf8\x07\xba\xbb\xbb\x29\x6f\xf7\x6c\ \x3e\x0d\x48\xf0\x7f\x0d\x22\x9f\x7e\x03\xef\xd3\xf1\x7f\xd9\xef\ \xa2\xfd\x9f\xe2\xbf\x1f\xfe\x3a\xfc\x45\xe1\x77\xc2\xd6\x68\x24\ \x6c\xd5\xa7\xdd\xbf\xd8\x1b\xde\x7b\x5a\x8a\x7f\x7f\xe8\x2f\x0d\ \xfd\xf6\xa9\xae\x30\xe4\x57\xb4\xf1\xfc\x9f\xda\x7f\xa0\xfd\xbf\ \xca\x67\x6d\x8a\xdf\x95\xf6\x73\x06\xfd\x1d\x0c\xe6\x67\xee\x45\ \xbb\xd3\x8a\x0f\xcd\x67\xec\x27\xbb\xf3\x4f\xa3\x4b\x4f\xf9\xb0\ \xde\x75\x62\xbd\x63\xcd\x2b\xf9\x4c\xf7\x2a\x3a\x22\xa7\x9e\x2c\ \x9f\xbe\xe8\xf4\xb6\x82\xf7\x12\xc5\x3e\x28\x4a\xfc\x75\x11\x3d\ \x88\x28\x6f\x9e\x68\xec\xb5\x11\x8d\x43\xb4\x28\x0a\x1f\xc1\x18\ \x30\xff\x9c\x15\xed\xfd\x45\x87\x0b\x30\x38\x80\x75\x78\x2d\xac\ \x7b\xf9\x6d\x42\xc2\xb7\xac\x6b\x1a\x1f\xf5\xfe\x22\xe1\xe4\x8e\ \x3e\x26\xe1\x82\x17\x91\xf0\x79\xc4\xff\xad\x36\xee\x55\x70\x69\ \xf1\xfa\x43\x5b\x4b\x2a\x76\x6f\x89\x2d\x10\x6d\x8e\x57\xec\xa9\ \x04\x7b\x88\x83\xfb\x06\x5f\xd4\x84\x1b\x8c\x77\x6d\x41\xfc\x06\ \x5b\x93\x23\xe8\x1b\x31\x17\x86\x0e\xba\x32\x36\x5f\xfc\x7f\x29\ \x31\x1e\x36\x18\x48\x41\xb4\xdf\x3e\x11\xbf\x0f\xb4\x75\xff\xf0\ \xd9\x34\xe8\xf0\x61\x31\x76\x64\x6d\x5c\x5f\x1b\xd3\xc4\x9e\x13\ \xa2\x40\x87\xe3\xa9\xc3\xae\xd0\xda\xde\x58\xa2\x9b\xf9\xfd\x17\ \x3c\xbf\x44\x53\x26\xf8\x9c\x77\x4b\x31\xe6\x4f\xf4\x78\xe2\x1f\ \x1c\x2a\xd6\xe4\x60\xef\xb3\x37\xc9\xd8\xd8\x06\x1f\xb4\x06\x98\ \x22\x07\x84\xb6\x7e\x04\x9f\xd5\x14\x9d\x2a\xc5\x17\x9e\x12\xaf\ \xc5\xe1\x42\xd7\x12\x2e\x10\x91\xa8\x71\xda\xef\xb1\x10\xaf\x6a\ \xbf\x73\xf0\x3a\x41\x82\x6b\x04\x0f\x27\xa0\x45\x7b\x9d\xa6\x62\ \x83\x61\x4c\x1e\x2d\x82\xd2\xd1\x84\x40\x07\x6b\x32\xda\xa9\xc3\ \x41\x52\x46\x07\x06\x8b\x43\x8c\xa1\xf6\x46\xd9\xbf\x9d\x04\xdb\ \x48\xf8\x79\x6f\x0e\x7a\x93\xce\x9b\x5c\xde\x4f\xb3\xdf\x29\x32\ \xc9\x45\xab\x70\x11\x6b\x1d\x9d\xc1\x5e\xd7\xf9\x5b\x90\x71\x8a\ \x7b\x93\x42\xbc\xad\xc6\x9f\xc4\x12\x3b\x1b\xb5\x0a\x16\xb7\xb1\ \xf9\x99\xdb\x99\x8e\x26\x92\x79\x5a\x6a\xbf\x83\xc4\x5f\x6c\x5a\ \x11\x76\xb8\xd5\x7e\x7f\x22\x88\x48\xec\xb4\xf5\xef\x22\xca\x5e\ \x26\x22\xa8\xf0\xc4\xd5\x28\xe5\xb7\x3b\xd8\x38\xc5\x18\xb3\xb0\ \xb3\x82\xd6\x46\x2d\x0f\xff\x66\x4c\xe2\xa8\x6f\x54\x34\x0f\x54\ \xb0\xc1\x6a\xff\xf7\x12\x4d\x01\x11\x6b\xaf\x0a\x36\x02\x15\x6c\ \x9d\x62\x35\x07\x89\x6f\x62\xca\x1b\x5b\x25\xd1\xaa\x15\x73\x6b\ \x10\x63\x43\xd7\xd1\x53\x68\xd1\xc6\xb8\x1b\x5b\x7f\x38\x57\xa3\ \x35\x82\xd1\xce\xa0\x3f\x14\x80\xfb\x19\x17\x5e\x34\x00\xd1\xd4\ \x50\xf1\x1d\xda\x38\xdb\xec\xcd\xc1\xef\x76\x63\xbd\x98\x10\x49\ \xfc\x7f\x68\xed\x22\xa2\xc2\xdd\xa9\xa7\xb7\x97\x74\x3a\x4d\x45\ \x79\x05\x95\xc3\x87\x33\xbc\xb2\x92\xd2\xd2\x52\x12\xc9\x04\x82\ \x90\xcd\x65\xe9\xeb\xeb\xe3\x78\xe7\x71\x8e\x1d\x3b\x46\x57\x57\ \x17\xfd\xfd\x7d\xa4\x52\x49\x4a\x4a\x4a\xa2\xc1\x94\x68\xe0\xc3\ \xf9\xa9\xc4\xda\xd5\xa2\x36\x69\xe3\x94\x11\x63\x52\xc7\x4e\x4f\ \x63\xe2\x7a\x0b\x42\xac\x23\x47\xcc\xbe\xd1\xe6\x7b\x76\x7f\x98\ \xeb\x2c\x5a\xdc\x62\xf7\xa7\x10\x83\xd2\x12\xad\x11\xb1\x3f\x8f\ \x71\x1a\xc5\x2e\x6e\x2d\xb8\xf0\x5a\x22\xc5\x4f\x40\x63\xa7\x0f\ \xb7\x51\xd1\xd6\x08\x47\xcd\x8d\xda\x19\xa1\xe5\x60\xc3\x95\x68\ \x82\x8a\x31\x43\xb4\xd0\x7e\xa8\x9d\xce\x8e\x63\x56\xa7\xd6\xd7\ \xd7\x53\x53\x53\x13\x9e\x34\x62\x0e\x4e\xec\xc6\x12\xac\x78\xa3\ \xe5\x41\xbf\x9b\xdd\xe3\x6d\xda\x80\x8a\x96\xbd\xb9\x58\xed\xc5\ \x6e\xb7\xd3\xdc\x20\xec\x5e\x2e\x02\xb1\x45\xac\xef\x9a\xfb\x90\ \x35\x3d\x74\x71\xf8\x39\x34\xd4\xd4\x62\xa1\xc4\x70\x27\x0a\xff\ \x1a\xed\x64\xa6\x6d\x26\xc6\x9d\xe2\xb0\x4f\x44\x87\xfb\xa9\x68\ \x45\x7f\x7f\x1f\x89\x54\x9a\x49\x13\x26\x32\x69\xf2\x24\xea\x47\ \x8c\x40\x29\xa1\xbf\xaf\x9f\xbe\xbe\x3e\xfa\xfb\xfa\xc8\x66\xb3\ \x68\xed\x92\x4c\x95\x51\x92\x69\x22\x93\xc9\x50\x52\x5a\x42\xde\ \xd5\x74\x76\x1e\x67\xdb\xb6\x8f\xd9\xb0\x71\x03\x5d\x5d\x27\xa8\ \xab\xad\x89\x75\xaa\x0e\x27\x6e\x68\x05\xc4\xf0\x72\xb8\x40\xc4\ \x7f\x1e\x31\x9e\x47\xa2\x13\x28\xdc\x7a\xe3\xd0\xcb\x7c\x5e\xe3\ \xf4\x34\x91\x88\x8e\xf7\x41\x6c\xa1\xee\xdb\xb7\x97\x7d\xfb\xf6\ \xd3\x71\xac\x83\x63\x1d\x1d\xb8\xae\x4b\x59\x59\x19\x65\x65\x65\ \x94\x97\x97\x33\x7a\xf4\x68\x46\x8e\x6c\xc2\x51\x0e\xc5\x80\x0e\ \xc6\xa2\x31\x4f\x7b\x0c\x04\x80\x69\xd6\x11\xbc\x67\x8c\x69\x01\ \x7c\x16\x0b\x9a\x87\x50\x5f\xb0\xa0\x9f\xf8\xbb\x7e\x04\x3d\x62\ \xf6\x91\xdf\xaf\xeb\xd6\xae\x65\xf5\xea\xd5\xd6\x3c\xbb\xea\xaa\ \xab\x98\x77\xe1\x85\x85\x48\xd9\xd8\x63\xac\x99\xa5\x8b\x6f\x88\ \xca\x00\xc5\x52\x70\xf2\xda\x98\x3f\x6c\x6f\xdc\x8e\x88\x1d\x34\ \xc1\x22\xb6\x6d\x3c\x6d\x9d\xd8\x5a\xdb\xfd\x6c\x76\xb2\x10\xf5\ \xfb\x67\x5f\x78\xa2\x2c\xdb\x5b\xfb\x36\x83\x37\x09\x83\x1d\x5c\ \x1b\x50\xc4\xec\x2e\x1f\x36\xf9\x13\x30\x98\xd0\xfe\x71\x84\xa0\ \xe9\xe9\xe9\xa5\xba\xb6\x8e\xf9\x0b\x2e\x62\xc2\xf8\x71\x64\x07\ \x07\xd8\xb6\x75\x2b\x2b\x96\xbc\xc5\xee\x3d\x7b\x39\x76\xec\x18\ \x9d\x9d\x9d\x1e\x34\x70\xc4\x83\x72\x7e\x3b\x4a\x32\x19\xea\xea\ \xea\x68\x68\x68\x60\xe6\xcc\x99\xcc\x6a\x6b\x61\xfe\xfc\x0b\xd9\ \xb5\x7b\x0f\x2b\x56\xac\x60\xcf\x9e\x3d\xd4\xd6\x0c\x27\xe1\x24\ \xbd\x7b\x87\x98\x4e\x8c\x13\x59\x88\xcc\xd7\xc0\xbe\xb1\x37\x99\ \xf0\xd7\xa1\x3d\x2a\xe1\x24\x0a\x06\x22\xba\x9e\x36\xcd\xd7\x70\ \x67\xd6\x3e\x64\x0a\xbe\xaf\x95\xb7\x38\x82\x3d\xba\xa3\xa3\x83\ \x57\x5e\x79\x85\x8d\x1b\x37\x7e\xaa\x81\x9e\x48\x24\x18\x35\x72\ \x14\x5f\xb8\xf1\x46\xea\xea\xea\xac\x53\xd9\x7c\x14\x25\x2a\x22\ \x13\xfc\x85\x1e\xf5\x7d\xd0\xc0\x60\x62\x48\xf4\xbc\x86\x1d\x6d\ \x4e\x56\x6d\x9c\xc4\xc1\x38\x04\x50\x2d\xe8\x4b\xb1\x1a\x62\xac\ \xbe\x00\xf6\x6b\x55\x94\x99\x13\x3c\xac\x1f\x20\x4c\x15\x9e\x47\ \x52\x40\xc0\x85\x28\x4a\xdb\x8c\x42\xfc\xf4\x0b\xa1\x7d\x04\x92\ \xa3\x4d\x21\xb8\x9e\x18\x70\x31\x32\x12\xc2\xfe\xb2\x61\xbd\xb2\ \x0d\x4f\x15\xd9\xf9\xca\xb4\xe9\x4d\xe8\xaf\x95\xbf\xc1\x2b\xbc\ \xe3\xf7\xb4\x6c\x3c\x62\x47\xb4\x01\xcf\x7c\x93\x58\x59\x67\xa9\ \x2a\x84\xa1\x62\x1e\xe2\x90\xcf\xe5\x48\x24\x53\x5c\xff\xf9\x1b\ \x68\x1e\x3b\x86\x3d\x3b\x77\xf1\xe8\xc3\x0f\xb1\x6a\xf5\x6a\x06\ \x06\x06\x3c\xa8\x59\x59\xc9\xf0\xea\x2a\x46\x34\xd4\xe3\x38\x8e\ \x71\xba\xb8\xe4\xf3\x2e\xd9\x6c\x96\xbe\xfe\x7e\x36\x6e\xde\xcc\ \x9a\xb5\x6b\xd1\xae\x66\x66\x6b\x2b\x97\x5d\x76\x29\x5f\xff\xda\ \x57\xd9\x7f\xe0\x20\x2f\xbd\xbc\x90\xfd\xfb\xf7\x31\x6a\x64\x63\ \x34\xb9\xc2\x56\x4b\x1c\x29\x1a\x2b\x4e\x0a\x98\x40\x61\x88\xbf\ \x88\x0d\x45\x8a\x91\x5e\x52\xf0\xd9\xe8\xaa\x07\x0f\x1e\xe4\x97\ \xbf\xfc\x25\xb9\x5c\xee\x33\x31\x63\xb9\x5c\x8e\x5d\xbb\x77\x71\ \xf2\x64\x37\xf5\xf5\x23\x8a\xb0\x71\x12\x99\xcd\x88\x05\xa3\x0a\ \xac\x04\x93\xa0\x32\x71\xa4\xd8\xd7\x0b\xd7\x2c\x12\xb3\x77\xc5\ \x36\x79\x87\x80\xaf\x26\x74\x2f\x4a\x0a\x8a\xbf\xc9\x17\x00\xe8\ \x08\x5d\x88\xb1\xa9\x6b\x7f\x6e\x86\xd0\x34\x4e\xe0\x15\x3c\x5b\ \x21\xac\x24\xb6\x91\x20\xde\xda\x08\xec\x7d\xbb\xef\x74\x71\xd8\ \x5b\x60\x82\xc5\xa1\xbf\x81\xa6\xb4\x9c\xde\x89\x67\xd1\x3d\x16\ \xa2\x2a\x1c\xb4\x00\xe7\x87\x3b\xac\x2e\x44\x1d\x5d\xdd\x27\x99\ \x3b\xf7\x4c\x2e\xb8\xe0\x3c\xf6\xec\xda\xcd\x3f\xff\xcf\xff\xc9\ \xbb\xef\xbd\x47\x69\x59\x19\x63\xc6\x8c\x21\x9d\xc9\x90\x48\x24\ \x7c\xf6\x4e\x50\x4a\x59\x06\xaf\x16\xd0\xae\x46\x6b\x97\x4a\x17\ \xea\x47\x8c\x20\x97\xcb\x91\xcd\x66\xd9\x77\x60\x3f\x7f\xf7\xf7\ \x7f\xcf\xc4\x09\x13\xb8\xf9\xa6\x9b\xf8\xe6\x3d\x77\xf1\xce\x3b\ \xeb\x78\xf1\xa5\x97\xa9\x28\x1f\x46\x45\x45\x45\x64\x9f\x19\xcc\ \x9c\x77\x61\x15\xc1\x2e\x7f\xab\x13\x1d\xe3\x41\xc5\x24\x0c\xfd\ \x2f\xdb\x88\x34\x06\x5f\xc4\x86\xbb\x31\x58\x93\xcf\xe7\x78\xe2\ \x89\x27\x3e\xf3\xa2\xb3\xc7\xc6\x27\x29\x0c\x58\xaf\x63\x44\x81\ \x05\xfb\x65\x68\x3b\x83\x18\xc8\x94\x90\x59\xf4\x27\x96\xd2\x31\ \xbc\x5c\xc8\xcf\x0a\xc5\xa0\xb9\x2e\x5c\x87\x52\xfc\x59\x94\x65\ \xeb\x1a\x4f\x22\xda\x20\x10\xc5\x9a\xee\x21\x83\x19\x10\x75\x36\ \xff\x1a\x73\x4b\x05\xe6\x53\xc4\x9a\xea\x00\xf6\xab\x88\xf5\x53\ \x01\x59\x18\x83\xd4\xc1\xdc\x30\x69\xac\xe0\x16\xca\x64\xf4\x03\ \x38\x5f\x84\x41\x3f\x2d\x1b\x2f\x34\x74\x8b\x6d\xff\x3a\x76\x4c\ \x07\x03\xe6\xc3\xd1\xb0\x45\x7e\x13\xb2\xd9\x3c\xb7\xde\x7a\x1b\ \xb5\xd5\x55\x3c\xfe\xe8\x63\xbc\xbc\xf0\x15\x6a\x32\x69\xbe\x71\ \xe4\x30\x07\x6a\x6b\x69\x2f\x2f\x27\x91\x4c\x90\x4c\xa6\x10\x51\ \x5e\xc7\xfa\x17\x0d\x76\x0d\x1d\x32\x4f\x1a\xd7\xf5\x20\x47\x2e\ \x97\x25\x9b\xcd\x31\x66\x4c\x86\x91\x23\x9b\x38\x72\xf8\x28\x3f\ \xfd\xfb\xbf\xe7\xcc\x33\xcf\xe4\x1b\x77\xdf\xcd\x7f\xfe\x4f\xff\ \x2f\xbf\x7d\xf0\xf7\xec\xdf\x7f\x80\xd1\xa3\x9b\x8c\xa9\xa2\x6d\ \x56\x55\x54\x04\x87\x83\xf6\x63\x4c\x42\x83\xa5\x17\x13\x7a\x2a\ \x1f\xfa\x84\x06\x3d\x11\xcc\x0e\xe1\x76\xc0\x32\x06\xf6\xa5\xb0\ \x7a\xed\x5a\x0e\x1c\x38\x50\x74\x40\xaa\xaa\xaa\x18\x35\x6a\x14\ \x83\x83\x83\x1c\x3d\x7a\x94\xce\xce\x4e\x5c\xd7\xb5\x17\x9e\x0a\ \xac\x1a\xf3\xb4\x08\xd8\xc5\x88\xe8\xd0\x81\x4b\x48\xa2\x85\xe5\ \x31\xc2\x12\xb9\x59\x7c\x2c\xad\x8c\x09\x17\xd9\x89\x3e\xc9\x16\ \x6c\x4e\x86\xfd\x22\xe6\xc0\x47\xfe\x21\xbf\xfb\xc4\x86\xba\xd1\ \xb9\x5b\xb0\xf0\x95\x52\x16\x29\xa5\x0d\xbb\x3c\xc2\x90\x06\x2d\ \x6e\x9c\xbe\x26\xe0\x0c\x08\x41\x6d\x92\x55\x5a\x17\x45\x31\x21\ \x85\xa1\x25\xe2\x6b\xb4\x8d\xec\xc2\x73\x5f\x94\xe1\x12\x34\x19\ \x5a\x6d\xb1\xcc\x82\xc1\xbc\x5a\x5e\x45\x39\x4d\xa8\x29\x62\x3b\ \xb9\xe3\x66\x5c\xec\xb2\xd1\xc6\x15\xd1\xea\xae\xab\x49\x24\x53\ \x7c\xe9\x4b\x37\x72\xbc\xb3\x83\x1f\xff\xf0\x87\x1c\x3c\x7c\x88\ \xb3\xa6\x4e\xe5\x96\x87\x1e\xa2\xe9\xf0\x61\xf4\x07\x1f\xf2\xd8\ \x8f\x7e\xc4\xc9\x4c\x09\xa9\x54\x8a\x54\x2a\x45\x32\x99\xc4\x71\ \x9c\x90\xde\x77\xf3\x79\x5c\xad\xc9\xe7\xf3\xe4\xf3\x79\x72\xb9\ \x1c\xf9\x7c\x9e\x44\xc2\x21\x93\xd1\xe4\xf3\x2e\xb9\x5c\x9e\x74\ \x3a\x43\x7d\x43\x3d\xbb\x76\xed\xe2\xbb\xdf\xfd\x1e\xdf\xfe\xf6\ \xb7\xf8\x7f\xbe\xfb\x1f\xf9\xfd\x1f\x1e\xe2\x93\x8f\xb7\xd1\xdc\ \x3c\xa6\x88\xff\x4c\x0c\x83\x3c\x06\x29\x63\xec\x54\x38\x48\x12\ \x67\x14\x7d\x17\x81\x35\xc5\x62\x70\xdb\x80\xb4\xfb\xf6\xed\x2b\ \xe8\xf3\xf1\xe3\xc7\xf3\xb5\xaf\x7d\x8d\xb2\xb2\x32\xeb\xfd\x7c\ \x3e\xcf\xb6\x6d\xdb\x58\xb3\x66\x0d\x1b\x37\x6e\x34\x4e\x89\xd8\ \x54\xf6\x37\x8c\x70\x54\x82\x4d\x43\x19\x80\x2b\xce\x40\x62\x33\ \xba\x21\x73\x6b\xb1\x87\x52\x80\x6c\x82\x7f\x6b\x0a\xd9\x59\x31\ \x7c\xce\xca\x64\x1d\x8b\xd9\x78\x12\xef\x1f\x83\x55\x35\x88\x2f\ \x73\x33\x8c\xfb\x88\x45\x8a\x31\xed\x52\x38\x4e\xb1\xc3\x30\xb2\ \x55\x65\x48\xb8\xcd\x10\x0c\xb7\xc5\x9a\x17\xe0\x80\xc8\x05\x73\ \x4a\x9b\x7d\x48\x72\xc5\x3c\x7a\xe3\x3c\xbc\xb6\x0d\x70\xfb\x94\ \x8f\x06\x22\x9d\xc9\xf0\xd5\xaf\x7c\x99\xf7\xdf\x5d\xc7\x7d\xf7\ \xfd\x8a\x8a\xca\x0a\xce\x3c\xfb\x6c\x2e\x7a\xf9\x65\xc6\x1e\x3e\ \x4c\x06\x70\xf3\x79\x2e\xd8\xb4\x89\x8f\x6e\xba\x91\x54\x22\x89\ \x06\x5c\xd7\x0d\x17\x99\xeb\xba\xde\x63\xf8\xbb\xbe\x52\x8a\x84\ \x93\x20\xaf\xf3\xb8\x79\x97\x5c\x2e\x87\x48\x9e\x44\x32\x49\x2a\ \x95\x62\x70\x70\x80\x89\x13\x27\xd2\xd1\xd1\xc1\x3f\xfe\xfc\xe7\ \x7c\xf1\xe6\x3d\xdc\x7d\xd7\xed\x3c\xf4\xf0\x63\xbc\xf7\xee\xbb\ \x4c\x99\x32\x31\x82\x25\xa6\xcf\x48\x1b\xfc\x9e\xf8\x5d\xa8\x63\ \x91\x02\x05\x4e\xfb\x38\x3c\x8a\x4e\xc6\x70\x20\x8c\x8f\x04\x88\ \xf6\xd0\xa1\x43\x05\x7d\x7e\xd5\xd5\x57\x51\x5e\x51\x6e\x38\xb6\ \xbd\xfe\x4d\x26\x12\x4c\x9b\x3e\x9d\x69\xd3\xa7\x73\xb2\xbb\x3b\ \x84\x9a\x96\x05\x10\x9b\x50\x3a\x16\x3a\x13\x7a\xe7\xc4\xf2\xda\ \x19\x3e\xbb\x08\x51\x68\x5d\xd8\x1f\x28\x83\x54\x0a\x70\x83\x15\ \x2c\x20\x3e\xe9\x51\x48\xd1\x7b\xcf\xad\x87\x84\xcd\x8e\x52\x11\ \x61\x22\x9e\x2d\xbb\x64\xc9\x12\xb2\xb9\xac\x81\x60\x85\xd2\x61\ \xa5\x5c\x70\xe1\x05\x21\x39\x15\x98\x1e\x1b\x37\x6e\x64\xdf\xbe\ \x7d\xb4\xb7\xb7\xd3\xde\xde\x8e\xe3\x38\x34\x35\x35\xd1\x34\x72\ \x24\x53\xcf\x98\x4a\x43\x43\xbd\xcd\xff\x9a\xd3\x37\x38\xa9\x8d\ \x60\x01\xd3\x07\x17\x75\xb0\xb6\x98\x4f\x1d\xf7\xbe\x17\xd0\x3d\ \x26\xdb\xc9\x69\x9e\x78\x44\xf4\xba\x18\x81\x0e\xe6\xee\x04\x7e\ \xa7\x99\x03\xe3\xb3\x9d\x1a\xe1\x4b\x5f\xba\x85\x55\x2b\x56\xf0\ \xcb\xfb\x7e\xc9\xd4\x69\xd3\xa8\x1f\x31\x02\x2d\xc2\xf9\x6b\xd6\ \x78\xbb\xf9\xe4\xc9\x38\x13\x26\x50\x31\x7e\x3c\x25\x25\xa5\xe4\ \x73\x39\xb4\xeb\xe2\xba\xae\x3f\x18\x45\xec\x45\xad\x8d\x2e\x8a\ \xe0\x8a\x46\xe3\x38\x0e\xa5\xa5\xa5\x24\x53\x29\x32\x99\x0c\x65\ \x65\x65\x3c\xfd\xec\xb3\x9c\xec\xe9\xe1\xae\xbb\xef\x66\x70\x70\ \x90\xad\x5b\xb7\x30\x61\x7c\xb3\x37\xc1\x54\xe4\xd8\x46\x69\x7f\ \x48\xcd\x13\x4b\x87\x76\xa0\x15\x05\x10\x73\xdb\x89\x85\x65\x4c\ \x9b\x49\x85\x4e\x58\x31\xe0\x5d\x67\x67\x67\x41\x9f\x97\x97\x95\ \x7b\x8c\xa4\x14\x8b\xfb\xf1\x26\x76\x45\x45\x45\x41\xe4\x97\x12\ \x6d\x2d\x1c\x33\x4c\x2a\xdc\x40\x4c\x17\x89\x7f\x12\x8a\x44\x86\ \x6b\xc8\x24\x1a\xf6\x4a\xe8\xd7\x13\x65\x47\xaf\x98\x27\xad\x01\ \xb7\x94\x18\x8c\xb6\x09\xdb\x7c\xa8\x2d\x22\x43\xb0\x2b\x84\x67\ \x84\xd6\x2e\x8f\x3d\xf6\x18\xef\xbd\xf7\x9e\xf5\xa9\x4c\x26\xc3\ \xb7\xbf\xfd\x2d\x1c\xe5\x84\x63\xd0\x71\xf4\x08\x8f\x3d\xf6\x27\ \xb6\x6f\xdf\x5e\x70\xd5\x83\x07\x0f\xf2\xee\xbb\xef\xf2\xca\xcb\ \x2f\x73\xed\xb5\xd7\xb2\x60\xc1\x7c\xff\x39\xb4\xe1\x1b\x8d\x90\ \x9c\xf6\x4f\xf3\xf0\x77\x62\x33\xa6\x1a\x23\x68\xa2\x08\x0c\x0d\ \x8e\xf8\x70\x69\x0a\x31\xd8\x7b\x3a\x7e\xbc\x38\x0f\x27\xc5\x0c\ \xf3\x60\x30\x4c\xc7\xb3\x70\xf2\x64\x0f\x77\xdc\x7e\x3b\x1b\x3e\ \xfc\x80\xfb\x1f\x78\x80\xb6\xd9\xb3\xa9\xa8\xa8\x40\x1c\x87\x96\ \xf5\xeb\x91\xca\x4a\x06\x16\x2c\xa0\x6b\xca\x14\xea\x3e\xfe\x98\ \x7c\x36\x8b\xce\x7b\x8b\xcd\xdc\x39\xb5\x3f\xae\xda\xdc\xd9\xfd\ \xad\x36\xef\xc3\xcd\xd0\xee\x31\x76\xf4\x54\x32\x89\x4e\x38\x40\ \x25\x73\xe6\xcc\xe1\xb5\xc5\x8b\x49\x27\x93\xdc\x71\xfb\x1d\xfc\ \xc3\xcf\x7e\xc1\xbe\xfd\x07\x18\x3d\x6a\xa4\x1d\x3a\x14\x87\xce\ \xc6\x43\xeb\x98\x63\xdd\x5c\x1c\xca\xd8\xd9\xcd\x7e\x30\xf7\x3f\ \x15\x63\x4d\x87\x0f\x1f\x4e\x57\x57\x97\xd5\x9b\x2f\xbd\xf4\x12\ \x5f\xfe\xf2\x97\x29\x2d\x2d\x2d\x46\x61\xd9\x13\x57\x6c\xf6\xac\ \x90\x79\x36\x18\xbc\x18\x13\x87\x14\x12\x90\xf6\x2e\xad\x43\x0a\ \xdd\xee\x13\x29\x0e\xb9\x8a\xcc\x8b\x78\xb4\x8f\x0c\xc1\xec\x29\ \x25\xd6\x66\xf3\xdc\xb3\x2f\x14\x2c\xba\x54\x2a\xc5\x3d\xf7\xdc\ \xc3\x98\x31\x63\xc3\xeb\xbd\xff\xfe\xfb\x3c\xfa\xe8\xa3\x0c\x0e\ \x0e\x9e\x12\xce\xe5\xf3\x79\x9e\x7f\xfe\x79\xb6\x6e\xdd\xca\xdd\ \x77\xdf\x1d\xb1\xe4\x81\xdd\xa0\x0d\x08\xad\x86\x08\x0e\x91\x98\ \x13\x3d\x64\xc6\xa5\x08\x24\x95\x82\x90\x84\xa1\xd6\x5e\x62\xa8\ \x0e\xc1\x72\x1c\x17\xc2\xa5\x82\xf8\x66\x7f\x86\x1e\xed\x38\xc6\ \x8d\x37\xde\xc8\x91\x43\x87\xf8\x97\x7f\xf9\x25\xd3\x5b\x5a\xa8\ \xad\xa9\xf5\x60\x53\x2a\xc5\xb8\xc1\x41\xe4\xba\xeb\xc8\x0d\x1f\ \xce\xf1\xf2\x32\x46\xe4\x72\x38\x83\x83\x06\xfc\xd3\x16\x2b\x26\ \x02\xe2\x46\x93\x3c\xab\xf3\x0c\x0c\x0e\xf8\x08\x48\x85\x6d\x8c\ \x3b\xb4\x95\x24\x28\x2d\x75\x48\x25\x53\xcc\x9a\x35\x8b\xe7\x5f\ \x7a\x99\x11\x0d\x0d\x7c\xf3\x9e\x3b\xf9\xdb\xff\xf6\x77\xf4\xf4\ \xf4\x52\x5e\x3e\xcc\xdf\xac\x02\x9f\xa3\xed\x70\x0e\x1e\x58\x69\ \x9b\x39\xd4\x31\xc6\x33\x0c\x51\x0c\x7e\xe7\x9f\x92\x56\x40\x96\ \x41\x4c\xd4\xd5\xd5\xb1\x67\xcf\x1e\xab\xcf\x37\x6c\xd8\xc0\xdf\ \xfc\xcd\xdf\x30\x79\xf2\x64\x26\x4d\x9a\xc4\xb8\x71\xe3\x18\x33\ \x7a\x34\x4e\x22\x19\x9e\x2c\x61\xa8\x9e\x61\x5b\xee\x96\xbd\xfc\ \xa6\xf4\x5f\x39\xa1\x4e\x58\xd7\xfb\xe7\xae\x7f\xe1\x84\x3a\xce\ \x5b\xc9\xb7\xd8\x9c\xd8\xcc\x31\x75\x8c\x3c\x79\xca\x75\x39\xe3\ \xf2\xcd\xcc\xcc\xb6\x31\x33\x3f\x13\x65\xb4\x33\x80\x58\x5a\x6b\ \x9e\xca\x3c\xc5\xda\xe4\x5a\xfa\xa5\x3f\x9a\x17\x5a\x31\x25\x3f\ \x85\xbb\x7a\xef\x24\x41\x32\x9c\x73\x9b\xd5\x16\x9e\xcd\x3c\x43\ \xbb\x6a\xb7\x26\x5a\x99\x5b\xc6\x2d\x03\xb7\x30\x33\x3b\x73\x48\ \x1b\x2f\x78\xff\x8d\x37\xde\x60\xc9\x92\x25\x05\xbe\xcb\x6f\x7c\ \xe3\x6e\xc6\x8f\x1f\x1f\x7e\xae\xab\xbb\x9b\xc7\x1f\x7f\xbc\xe8\ \xa2\x2b\x29\x29\x21\x9b\xcd\x16\xb0\xc5\x5b\xb6\x6c\x61\xd9\xf2\ \x65\x5c\x7c\xd1\x25\x06\xb4\x8c\x42\x0b\xb5\x15\xd1\xa3\x23\xc2\ \x30\x4e\xea\x6b\xd3\xd1\x1e\x05\x42\x08\x3a\x32\x2f\xc4\x38\xeb\ \x86\xf6\x9f\x0f\x65\xe3\x49\x68\xf4\x86\xce\xeb\x60\x72\x07\x0c\ \x98\x14\x62\xd9\xee\xde\x93\xb4\xb5\xb5\xd1\x58\x3f\x82\xbf\xf9\ \x9b\xbf\x66\xcc\xd8\x31\xd4\xd6\x54\x23\x4a\x48\x24\x93\xd4\x54\ \xd7\x50\x33\x69\x32\x7a\xe7\x0e\xba\x33\x25\x48\x2e\x8f\xce\xe5\ \x3c\xfb\x4d\x47\x46\x39\x6e\xe4\xd8\xd6\xae\x1b\xee\xec\xd9\x6c\ \x96\x6c\x76\xd0\x5b\x70\x82\xe1\x67\x32\x79\x1f\x89\xa2\x44\x80\ \x54\x3a\x45\x4d\x4d\x0d\xad\xad\x2d\xfc\xfe\x0f\x7f\x60\xca\xe4\ \xc9\x7c\xed\xab\x5f\xe1\xd7\xf7\xff\x2b\x67\xce\x6d\xf3\x9e\xc7\ \x3c\x35\x4c\x9f\x5b\x40\xed\x9a\x58\xdd\xd8\xc1\x75\xe0\xeb\x91\ \x18\xf3\x64\xb3\x19\xd1\x8e\xef\x7f\xf7\xec\xb3\xce\xe6\xdd\x77\ \xdf\x2d\xe8\xf7\x6c\x36\xcb\xc6\x8d\x1b\x43\x87\x7a\x26\x93\x61\ \xc6\x8c\x19\xb4\xcd\x9a\xc5\xf4\x69\xd3\x48\x24\x93\xa0\xc5\x87\ \x97\x9e\x93\x78\x71\xe6\xb5\x82\x45\x07\xb0\x36\xb5\x96\x3f\xa5\ \x1f\x23\x2b\x59\xeb\xfd\x4e\xe9\xa4\x53\x75\xf2\x5e\xf2\x7d\x1a\ \xf3\x8d\xdc\xde\x7f\x3b\x0d\xba\xd1\x62\x2b\xf7\x3a\x7b\x59\x9e\ \x5a\x5e\x70\x4d\x57\x5c\x36\x27\x36\xb3\x3d\xb9\x93\xa9\xf9\x29\ \xa1\x1d\xb8\x28\xb3\x90\x76\xa7\xbd\xe0\xf3\x27\xd5\x49\x5e\x4b\ \xbd\xc6\xac\x7c\xdb\x10\xa9\x2d\x82\x88\xe2\x9d\xb5\xef\xf0\xfc\ \xf3\xcf\x5b\xbf\x71\x1c\x87\xbb\xee\xba\x93\x29\x53\xce\xb0\xc6\ \xf7\x85\xe7\x9f\xa7\xaf\xaf\xcf\xfa\x6c\x53\x53\x23\x97\x5d\x76\ \x19\x33\xdb\x66\x31\xd0\xdf\xcf\xb2\x65\xcb\x78\xfd\xf5\xd7\xc9\ \x66\xa3\x67\x5f\xb4\x70\x11\x67\x9f\x75\x36\xe5\x65\x65\x68\x65\ \x9b\x13\x62\x85\xce\x88\xcd\xb9\x04\xc8\xc6\x37\xa9\x0a\x99\xee\ \x28\x44\x4f\xa2\x90\x6d\xc3\xcf\x57\x7c\xe9\xa9\xa1\x23\x57\x02\ \x7f\x9a\xed\x57\x13\x51\x9e\xbb\xc1\xff\xa3\xfc\x87\xf0\xe0\xa9\ \x62\xde\x85\x17\xf0\xf8\x9f\x1e\xe3\x64\x4f\x0f\x13\x27\x4d\x42\ \x94\x22\x95\x4a\x51\x53\x5d\xc3\x98\x9a\x1a\xca\x0e\xb5\xc3\xc0\ \x00\xdb\xdb\x66\xd2\x5f\x5a\x02\xb9\x1c\x2a\x97\x43\xfb\xff\x99\ \x91\xe0\x62\x40\xa8\x9c\xbf\x93\x99\x6d\x13\xbf\x6d\x88\x42\x89\ \xf2\xda\x18\xb4\x53\x49\xf8\xf7\x54\x2a\x4d\x53\x53\x13\x63\xc7\ \x8e\xe5\x9f\xfe\xf9\x9f\x99\x3e\xfd\x0c\x5a\x5b\x5b\xd8\xbe\x63\ \x17\x2a\xb8\x9e\x32\x9e\x39\x78\xc6\xf8\xbd\x94\xfd\x77\x25\xe6\ \x67\x94\xff\xdd\x00\x42\x79\xd7\x51\x12\xf5\x53\x70\xdd\xe9\x33\ \xa6\x33\x6d\xda\xb4\x4f\x65\xbe\xfa\xfb\xfb\x59\xb7\x6e\x1d\xff\ \xfb\x37\xbf\xe1\xde\x7b\xef\xe5\xc0\xfe\xfd\xfe\x78\x28\xdf\xed\ \x22\xb8\xc5\x22\x70\x81\x87\x32\x7f\x2c\x58\x74\x05\xb6\x90\x73\ \x90\x7f\x2c\xfd\x19\xfb\x9d\x7d\x56\x5b\xab\xa9\xa6\xd2\xad\x2c\ \xfa\x9d\x12\x5d\x42\x93\x6e\xf4\xe7\x81\x42\x29\xa1\xd9\x6d\x1e\ \xf2\x1e\x93\xdc\x49\xa1\xad\x5b\x6c\x83\xdf\xbc\x79\x13\x8f\x3c\ \xfc\x70\xc1\xfb\xb7\x7f\xfd\x76\x66\xcc\x68\x09\xe1\xb2\x12\xe1\ \xf0\xe1\xc3\xac\xf1\xf9\x01\xf3\x75\xdb\x6d\x5f\xe6\xac\xb3\xce\ \x26\x9d\x4a\x51\x51\x51\xc1\xb5\xd7\x5e\x4b\x5b\x5b\x5b\x41\x5f\ \xbe\xf1\xc6\x1b\x5e\x9b\x25\xba\xa6\x98\x63\x1d\x8c\xaf\xf5\x7b\ \xff\xa7\x3f\x3f\xbc\x39\x16\x8d\x81\x84\x63\x6d\xbc\x67\xad\x9d\ \xa2\x4b\x0c\xe7\xbc\xeb\xce\xfb\xdb\xf8\x9b\x35\x54\x47\x4e\xda\ \xe0\xe2\x81\x7f\xcf\x0f\x6c\x16\x3f\xea\xc0\x9b\x68\x8a\xfd\x07\ \xda\xb9\xe4\x92\x4b\xe8\xef\xed\xe1\xb1\x3f\x3d\xc6\xcc\xb6\x36\ \x94\x08\xa9\x4c\x9a\xca\x8a\x4a\x9a\x46\x36\x51\xb7\x7d\x3b\x8d\ \x5b\xb7\x30\x90\x4c\xb1\x6d\xce\x1c\x92\xfd\x03\x8c\xdc\xb4\x89\ \xbe\x92\x12\xf6\x4e\x3d\x23\xb4\xef\xcc\x9f\x22\xc2\xe0\xe0\x20\ \xb9\x5c\x16\x94\x0a\x17\x8a\x67\x1b\xd8\x9d\x83\x78\x13\x01\xdf\ \xe6\x33\x3b\x42\x29\x87\x54\x2a\xc9\xde\xbd\x7b\x71\x73\x39\xae\ \xba\xfa\x2a\x5e\x7e\x65\x11\x23\x1b\xeb\x51\x8e\x13\x12\x0e\xc1\ \x73\x05\x30\x28\x98\x8c\x82\xb2\x7e\x47\xb0\xa0\x44\x85\x04\x81\ \x0a\xde\xb7\xda\x24\xd6\x75\x82\x2c\x82\x99\xad\xad\x74\x74\x1c\ \x1b\xd2\x9f\x57\x70\x7a\x9c\x3c\xc9\xaa\x55\xab\x98\x30\x61\x02\ \xb5\xb5\xb5\xe1\x06\x30\x35\x3f\x95\x26\x77\x24\xa3\xf5\x28\xb6\ \x39\xdb\x8a\x2e\x94\x19\xf9\x19\x4c\x75\xa7\x32\x3e\x3f\x9e\xe1\ \x7a\x38\x27\xe4\x04\x39\xf1\xe0\x58\x5e\xf2\x6c\x72\x36\x71\x61\ \x7e\x1e\x09\x49\x20\x02\x69\x95\xe6\xa2\xdc\x02\xfa\xa5\x9f\x5d\ \x6a\x57\x78\xad\x73\x72\x67\xf3\xad\x81\x6f\x31\x9c\x4a\x50\x2a\ \xdc\x18\xa7\xb9\xd3\x68\xc9\xb7\xb0\xc1\xd9\xc0\x80\x0c\x00\x30\ \x4c\x0f\xe3\x87\xfd\x3f\xe4\xac\xfc\xd9\x28\xf1\xa0\xf4\xee\xdd\ \xbb\xad\xb6\x95\x96\x96\xb2\x68\xd1\x22\x0b\x1a\x8a\x08\xff\xe1\ \x3f\x7c\x8d\x39\x67\x9e\x69\xcc\x33\xef\x59\xb7\x6c\xd9\xc2\xfb\ \xef\xbf\x6f\x5d\x63\xec\xd8\xb1\x5c\x77\xdd\x75\xe1\x3c\x10\xf1\ \xc3\xd0\x94\xe2\xdd\x75\x36\xaa\x48\x26\x93\x9c\x73\xee\x39\xc6\ \x58\x7b\x63\xa1\x08\x16\x53\x90\x62\xa4\xc2\x40\x76\x6f\xec\xfd\ \xb1\x54\xde\xdc\x57\x2a\x42\x56\xca\xbf\x06\xe1\xf8\xfb\xf3\x24\ \x98\x33\x0a\xf6\xf6\xec\xfd\x8c\x50\x33\x34\xae\x0d\xc3\xce\xb7\ \xa7\x54\x18\x84\x6e\x47\xb3\x97\x97\x95\x73\xc6\x94\xc9\xfc\xf3\ \xff\xfa\x5f\x8c\x1d\x3b\x96\x74\x3a\x8d\xa8\x04\xa9\x54\x86\xa6\ \xa6\x26\x0f\x12\x6c\xdc\x88\xce\xbb\x1c\x9a\xd0\x8c\x76\x1c\x5c\ \x25\x90\xcf\x53\xbd\x67\x0f\xe5\x1d\xc7\x38\x51\x35\x3c\x74\x64\ \x6a\xed\x2d\xe8\x81\xc1\x41\x72\xf9\x3c\xe2\x24\x10\x5c\x2f\x10\ \x38\x0c\xbf\x34\x99\x46\x1f\x9b\x6b\x8f\xbd\x0a\x8c\x65\xed\x43\ \x09\x11\xcd\xf0\xe1\xd5\x8c\x1f\x3f\x9e\x17\x5e\x7c\x89\x4b\x2f\ \xbb\x8c\x0b\x2e\x38\x9f\x4d\x9b\x36\x32\x65\xf2\x44\x03\x09\xf9\ \xce\xe2\x98\x37\x46\x5b\x91\xe8\x62\x07\xc8\x69\x23\x2d\x85\xc2\ \x3c\xb5\x20\x48\x5b\x8c\xa0\xc6\x4c\x49\x09\x77\xdc\x79\x07\xb3\ \x66\xcf\x62\xe5\x8a\x15\x6c\xde\xbc\xd9\xa6\xe4\x87\x20\x0b\x9e\ \x7c\xf2\x49\x7e\xf2\x93\x9f\xf8\x31\x99\x50\x2e\xe5\x9c\xab\xcf\ \x41\xe7\xe1\xa5\xe4\x4b\xd6\xe7\xaf\xcc\x5d\xc9\x55\xb9\xab\x48\ \x93\x36\x62\x1c\xa1\x3f\x3b\xc0\xa2\xe4\x42\x16\x25\x16\x01\x70\ \x4c\x1d\x63\x65\x72\x05\x97\xe4\x2f\x31\x20\x60\x92\xcf\xe5\x3e\ \xc7\x3b\xce\x3b\xf4\x48\x0f\x00\x9b\x9d\x2d\x64\x54\xda\x9b\x64\ \x68\xb4\xa8\x10\x82\x9f\x50\xc7\x39\x21\x11\xe4\xbd\x3a\x77\x35\ \x8d\x34\xf9\x93\x52\x8a\xda\x78\x71\x22\xc5\x3b\xbd\x6e\xe3\xac\ \xb3\xce\x89\x71\x17\x1e\x7c\x3f\x7c\xf8\x70\x51\x78\xfe\xdb\xdf\ \xfe\xb6\x68\x88\x5d\xfc\x75\xf8\xf0\xe1\x90\x89\x14\x33\x40\x42\ \x11\x7a\xe0\x30\x62\x6b\xc5\x4f\xf9\x0a\x02\x42\x94\xd8\x41\x16\ \x66\xf8\x64\xd0\x5e\x15\x0f\x2e\x2f\x0e\x2a\x3f\x85\xd5\xb4\xa3\ \x5f\x91\x22\x31\x8a\x00\xfb\xf6\xed\xe7\xe2\x4b\x2e\x65\xcf\xae\ \x9d\xec\xd9\xbb\x97\xb6\x59\x6d\x20\x0e\xe9\x54\x0a\x34\x0c\x0c\ \xf4\x53\x52\x5a\x8a\xd3\xdf\x0f\xb9\x1c\xfd\xc3\x86\xa1\x81\x5c\ \x22\x81\x68\x4d\x62\x70\x90\x4c\x4f\x0f\x5d\x55\x55\xe1\x4e\xa3\ \x14\x64\xb3\x39\x72\xd9\xac\x11\x3e\xa6\x3e\xd3\xe9\x10\x9f\xbf\ \xc1\xbf\x1d\x07\xea\xea\xea\xd9\xbd\x6b\x37\xaf\xbe\xba\x88\x4b\ \x2e\x5e\xc0\xf2\xe5\x2b\xa2\xe8\x89\x22\xc9\x32\x45\x82\xc0\x8a\ \x11\x79\x9f\xea\xb8\x95\x21\xe2\x1d\xe7\xce\x99\xc3\xdc\x39\x73\ \xe8\xea\xea\x62\xfd\xfa\xf5\x6c\xdb\xb6\x8d\x2d\x5b\xb6\x70\xe2\ \xc4\x89\xa2\xcf\x76\xe0\xc0\x01\x36\x6f\xde\xcc\x8c\x19\x33\x8a\ \xb9\x8c\xc3\xd7\xc5\xb9\x8b\xb9\x21\x7f\x43\x61\xbc\x2d\x50\x42\ \x86\x1b\xf2\x37\x30\x20\x03\xbc\xe5\xbc\x05\xc0\xfb\xce\xfb\x5c\ \xea\x5e\x6a\x45\x9f\x96\x52\xca\x35\xf9\x6b\x78\x22\xf1\x84\xb7\ \xb8\xe4\x04\x4b\x12\x4b\xb9\x22\x7f\x85\xc5\xda\xe5\xc9\xf3\x4c\ \xe2\xd9\xf0\xfa\xd5\xba\x9a\xf9\xee\x7c\x0f\x7d\x14\x63\x65\x87\ \x78\x9d\x7d\xf6\xd9\xcc\x9b\x37\x8f\x42\xaf\xb7\xf7\xa3\x98\xff\ \xf3\xc0\x81\x03\x9f\x19\x35\x74\x76\x76\x92\xcb\x66\x49\xa5\x52\ \x05\x4c\x7d\x10\xe1\x23\xb1\xf1\xb4\xe3\x03\xa4\x68\xdc\xae\x0c\ \x39\x33\x86\x7e\x66\x55\x9c\xd5\x0c\x6c\x08\x15\x8b\x9d\x54\x16\ \xf6\x0d\xfe\x0c\x0c\xe6\x98\x3c\x79\x22\xcb\xdf\x5a\xc2\xb5\xaf\ \x2f\xe6\x8e\xef\xfd\x3f\x9c\xf3\xea\x6b\x28\x47\xe1\x6a\x68\x3f\ \x74\x88\xfe\xfe\x01\x4a\xbb\xbb\x41\x6b\x3a\x46\x8d\x42\x44\x38\ \xd1\xd0\xc0\xf1\xda\x5a\xd0\x9a\x44\x36\x1b\x51\xdf\x7e\x4c\x65\ \x36\x9b\xc3\x71\x14\x8e\x72\x78\x27\xf3\x01\xdf\xab\xfa\x2f\xbc\ \x9f\xfe\x28\xb2\x9b\x02\xdb\xce\xb4\xa7\x44\x70\x94\xa0\x1c\x15\ \xe2\x79\x27\x68\xb3\x23\x94\x97\x0f\x63\xd4\x98\xd1\x2c\x5e\xfc\ \x3a\xd5\x55\x55\x4c\x98\x38\x81\xdd\xbb\xf7\x16\xe0\x7e\x25\x4e\ \x04\xb3\x03\x7b\x51\xd9\x98\x5f\xa9\x58\xbf\x18\xff\x36\x21\x71\ \x60\x03\x98\xed\x35\x6d\x50\x11\xa1\xb2\xb2\x92\x0b\x2f\xbc\x90\ \x3b\xee\xbc\x93\x7b\x7f\x76\x2f\x3f\xf8\xc1\x0f\x98\x3e\x6d\x7a\ \xd1\x41\x3b\x74\xe8\xb0\x61\x6f\x06\x6d\xb4\x87\x72\x81\x5e\x10\ \xda\x23\xf6\x78\x45\x36\xfa\xfc\xfc\xfc\xc8\xde\x93\x83\xd6\xf3\ \x06\xb6\xfd\x7c\x77\x3e\xd5\xba\x3a\x22\x29\x9c\x45\xf4\x49\x5f\ \x64\xd7\x28\x61\x59\x62\x19\x87\x55\x74\x1a\x5d\x9f\xbf\x9e\xb4\ \x4a\x59\xb6\xef\x67\x79\xad\x5d\xbb\x96\x2d\x5b\xb6\x78\xd7\x56\ \x12\xda\xb1\xc1\x35\x7a\x7a\x7a\xf8\x3f\x7d\x9d\x38\x71\xc2\xb2\ \xcb\x55\x8c\x2f\x88\x6c\x79\x73\x4c\xa3\x71\x8f\xc6\x5b\x15\x99\ \x13\xd1\x5a\x51\x12\x7d\xee\x34\xc8\x15\x42\x5b\x49\xf9\x37\x80\ \xe8\xc6\x84\x03\xae\xe8\xed\xed\x65\xf4\xe8\x51\x90\xcf\x33\xf0\ \xe2\x8b\xcc\xdd\xbf\x1f\x9d\xcc\x30\x6b\xe9\x52\xa6\x1f\x38\x80\ \x4a\x38\xe4\x35\xf4\x6e\xdb\x86\xea\xf5\x3a\xae\xbb\xae\x2e\xdc\ \x10\xb2\xc9\xa4\xe7\x42\x50\x86\x5d\xa6\x21\x97\x1d\xa4\x66\xdf\ \x5e\x32\xbd\xfd\x38\x8e\x62\x59\x66\x35\xa2\x84\x3f\x96\x3e\xcd\ \x40\x22\x4b\xc2\x71\x70\x12\x0e\x4e\x42\xa1\x12\x09\x9c\x84\x83\ \x38\x09\x9c\x44\x02\x49\x24\x50\xca\x41\x39\x0a\xe5\x78\xff\x16\ \x95\xf0\x26\xbd\xe3\xd0\xd0\x30\x92\xc1\x6c\x96\xf5\xeb\x3f\xe0\ \xec\xb3\xcf\xa2\xdd\x9f\xc8\x4a\x94\x17\x0c\x10\xfe\xf4\x5c\xbb\ \x9e\xfd\xe6\xb7\x4f\x29\xc3\x40\x8f\x08\x15\x2f\x7e\x52\x85\xb6\ \x9f\x84\x8b\x90\x68\x80\x94\x4f\x92\x2a\x41\xf9\xd7\x54\x4a\x85\ \x13\x4d\x29\x85\xc2\xb3\x47\x27\x4e\x9c\xc8\xb7\xbe\xf5\x2d\x32\ \x99\x4c\xc1\xf8\x1c\x3d\x7a\xc4\x58\xd8\x12\xfe\xdd\x7c\xa5\x25\ \xe3\x8d\x23\xc6\x04\xb1\x26\x95\xa2\x44\x4a\xc3\xcf\x0f\x30\xe0\ \x5d\x0b\x7f\xb2\xf8\x9b\x44\x4a\xa5\xb9\xde\xbd\x3e\xfc\x5c\xaf\ \xf4\xb2\x38\xb1\x38\xec\x87\x7e\xfa\x79\x51\xbd\x18\xfe\x7e\xa4\ \x1e\xc9\x39\x9c\xeb\x07\x36\x18\x64\x55\x91\xc5\x97\x4c\x26\x6d\ \xd6\xd4\x75\xf9\xf5\xaf\x7f\xcd\xbe\xfd\xfb\xfd\xb9\x47\xd8\xd7\ \x4a\x14\xf5\xf5\xf5\x05\xd7\xa8\xae\xae\x66\xec\xd8\xb1\x9f\xf9\ \x4f\x2a\x99\x0a\xc9\xaf\x60\x6c\x94\x2a\xb2\x51\x2a\x7b\x91\x05\ \xeb\xc0\x5c\xa4\x0a\x22\x52\x4f\x94\xb1\x30\x4d\x42\xed\x74\xb3\ \x13\x0c\x78\x50\x18\xde\x18\xbd\xbf\x7d\xfb\x4e\xbe\xf8\xc5\x2f\ \xf2\xf1\xc7\x1f\x33\xe2\xfd\x0f\x29\x77\xd2\x1c\x1f\x3d\x9a\x46\ \xd1\x9c\x7d\xf8\x10\xc7\x26\x4e\xe0\xf0\x60\x8e\xe1\xdb\xb6\xe2\ \xbe\xff\x21\xb9\xd9\xb3\xbc\xef\xbb\xae\x17\xa9\x9f\xc9\x20\x5a\ \x53\xd2\x7d\xd2\x6b\x6c\xde\x65\xc4\xfa\xf5\x9c\xf1\xe4\x93\x54\ \x1d\x3c\x08\x22\xdc\xf7\xad\x79\xb4\x9f\x7d\x18\x07\x05\x0e\x3c\ \x52\xfa\x14\xdf\xe8\xff\x5a\xd1\x58\xfb\xf2\x23\x47\x48\xf4\xf7\ \x73\xb2\xb6\x16\x57\x29\x16\xfc\xfa\x7e\xca\xdb\x0f\xb1\xfd\xec\ \xb3\x79\xff\xba\xeb\x41\xbb\x0c\x1f\x5e\x49\x5d\xdd\x08\x56\xac\ \x78\x9b\xaf\xfe\xc5\x5f\xf0\x58\x3e\xcf\xe0\x60\xd6\xb3\x4b\x0b\ \x1c\xe5\x9f\x01\x2e\x89\x10\x0f\x79\x8c\xa7\x92\x98\xb0\xe4\xc4\ \x89\x13\x54\x56\x56\x16\xf9\x8c\x7d\x8d\x4c\x49\x86\xa9\x53\xa7\ \x16\x10\x0a\x25\x25\x25\x46\x96\x42\xf1\xd7\x66\xb5\x89\x0b\xf5\ \x85\x45\x52\x92\xa2\xd7\x26\x15\xe5\x01\x56\x50\x61\x04\x4e\xd8\ \x90\xeb\x3c\xce\x63\x91\x5e\xc4\x41\x39\x08\xc0\x62\x59\xcc\xa5\ \x72\x29\x15\x54\xf0\x8a\x7a\x25\xb4\x01\x01\x6e\x72\x6f\x22\x21\ \x4e\x31\xd4\x5d\xf0\xba\xf2\xca\xab\x78\xef\xbd\x77\xd9\xbf\x7f\ \xbf\xc5\x3e\xfe\xd3\x3f\xfd\x13\x3f\xf9\xf1\x8f\xa9\xaa\xae\xb6\ \x10\x5b\x43\x43\x43\xc1\x35\x9a\x9b\x9b\xf9\xf6\xb7\xbf\x7d\xfa\ \x47\x5f\x3c\x1b\x5f\xec\xb4\x2d\x18\x1a\x35\x4a\xd1\x45\xf1\xe9\ \xdf\xfb\x8c\xd9\x09\x41\x38\x91\x11\x2d\x1e\xe6\x31\x45\x0e\xe4\ \xc1\x6c\x96\x51\xa3\x46\xf1\xfa\xab\xaf\x32\xa6\xaf\x9f\xf6\x39\ \x73\x79\xfb\x9e\x7b\xb8\xe5\x85\x67\x28\xcf\x0e\x32\xed\xf0\x61\ \x7a\x46\x8e\xa4\xaa\xfd\x10\xee\xf1\x4e\xba\x0f\x1f\x0e\x43\x8a\ \x44\x6b\x72\x7e\x34\x41\xd3\xc6\x8d\x1c\x1f\x51\xcf\xf4\x45\x0b\ \xa9\x5b\xb5\x0a\x72\x39\xb4\x1f\x28\xbd\xb4\xf4\x7d\x14\x09\xd2\ \x3a\x45\x4e\x5c\x36\x25\x3f\xa1\xbd\xfb\x63\xae\x5e\xb8\x99\xea\ \xdd\xbb\x71\x93\x49\xde\xbf\xfe\x7a\xa6\xbd\xb6\x98\x51\x1f\x7e\ \x40\x22\x97\xa7\xbb\xa6\x9a\xbd\x6d\x6d\xd4\xef\xd8\x81\xd6\x30\ \xe3\x8d\x37\x39\x3e\x72\x34\xbb\xe6\xce\x41\x94\x4b\xc3\xa8\x66\ \x0e\xec\xdb\x4d\x49\x26\x4d\x6d\x6d\x1d\xc7\x8f\x9f\xf0\xe2\xfa\ \x8c\x1c\x19\x53\x0c\xc9\x92\x80\x89\xc5\xa6\x46\xd4\x8e\x19\xcd\ \xa1\x43\xe7\x7c\x18\x52\xe4\x87\x22\x3d\xf0\xc0\x03\x24\x93\x49\ \xae\xbe\xea\x2a\xa6\x4e\x9b\x1a\x65\x33\x18\x71\x79\xa2\x35\x27\ \x4e\x9c\x60\xc3\x86\x0d\x05\xe3\xd3\xd0\xd0\xe0\xe5\xa5\x49\xf4\ \xbd\xf8\xc2\x7a\x5c\x1e\x67\xa2\x4c\xa4\x49\x8f\x8c\xe2\x51\x0d\ \xa6\x68\x1f\xfb\x78\x5c\x1e\x0f\xdf\x9a\xc8\x84\x18\x2c\x8a\x04\ \x90\x14\x0e\x37\xe9\x9b\xf8\x17\xf9\x17\x00\x06\x65\x90\x97\xd5\ \xcb\x5c\xc6\x65\x2c\x66\x71\xf8\x8d\xc9\x7a\x32\x33\x55\x2b\x51\ \xd6\x7f\x94\xba\x53\x6c\x93\x28\x29\xc9\xf0\xdd\xef\x7e\x8f\xff\ \xfe\xdf\xff\x9b\x25\x2d\x79\xfc\xf8\x71\xfe\xd7\x3f\xfd\x13\x3f\ \xfa\xe1\x0f\x29\x29\x2d\x09\xb3\x2c\x9a\x1a\x1b\x0b\xae\xf1\xfe\ \xfb\xef\xd3\xd9\xd9\x49\x75\x75\x4d\x6c\x80\x6c\x21\xa2\x81\xc1\ \x41\x7a\x7a\x4e\x52\x53\x55\x6d\x88\x73\x61\xb0\x2c\x91\x72\x80\ \x2e\xd8\x2a\x75\x4c\x4d\x20\x9e\x12\x16\x84\x4c\x62\x64\x43\x68\ \x33\x71\xff\xb3\xb9\x13\x46\x38\xf5\x36\xb5\x4e\x84\x7f\x43\x08\ \x20\x8a\xbe\xde\x5e\x7a\xfb\x06\x58\x30\xef\x02\x96\x2c\x59\xca\ \xa1\x2b\xae\xa2\x63\xde\x3c\x32\x99\x34\xe9\x29\x13\xa9\xdf\xfe\ \x09\x55\xfb\xf7\x71\xf8\xbc\xf3\x69\x5a\xb9\x9c\x8a\x03\x07\xd8\ \x39\x7b\x36\x07\x26\x4d\x24\x95\x4c\x81\x40\x4f\x6d\x2d\x63\xd6\ \xac\x61\x58\x47\x07\xcd\xeb\xd6\x52\xba\x6f\x1f\x3a\x9b\xe5\xc8\ \xe4\xc9\xac\xbb\xed\x56\x9c\x7c\x9e\x1f\x7f\xee\x24\x4a\x14\xe7\ \xee\x4e\x92\x4c\x95\xd3\x95\x1e\x64\xc6\xf2\x75\xdc\xf2\xf2\x27\ \x94\x1d\x3f\x4e\x59\x47\x07\x93\xde\x7e\x9b\xe1\x87\xda\x3d\x02\ \x4a\x29\x52\x83\x03\xd4\xee\xda\x0d\x4a\x31\x38\xac\x0c\x71\x35\ \xa3\xd7\x7f\xc8\xee\x39\x67\x32\x38\xac\x9c\x92\x4c\x19\x07\x0f\ \x1e\x60\xe6\xcc\x19\x9c\x38\xd1\xc5\xbe\xfd\xfb\x69\xa8\xaf\xf7\ \x7d\x92\x86\xff\x8e\xe0\xb9\x09\x61\x27\x4a\x8a\xd8\xba\x7e\xcc\ \xa1\x92\x48\x53\xc5\xb4\x21\x82\xf4\x11\x81\x15\x3e\x8b\xb9\xf2\ \xed\xb7\xf9\xf0\xc3\x0f\x19\x18\x18\x64\x60\x60\x80\x64\x32\x49\ \x49\x49\x29\x27\xbb\xba\xf9\x68\xc3\x47\x3c\xfb\xec\xb3\xb4\xb7\ \x17\x3a\xa6\xaf\xbb\xee\x5a\xaa\xab\x6a\x8c\x40\x07\xef\x1e\xcf\ \xc9\x73\x11\xab\x27\x39\x96\xb3\x9c\x3e\xe9\xa5\x44\x95\x90\x92\ \x34\x59\xb2\xec\x93\x7d\xbc\x2a\xaf\xf2\xa0\x3c\xc8\xa0\x44\xd1\ \x1f\x5f\xe0\x46\x46\xaa\xc6\xd0\x45\x13\x6d\xe2\x5e\x5f\x34\x48\ \x03\x1f\xc9\x47\x74\xe2\xc5\x99\xee\x96\xdd\xec\x95\xbd\x1c\x96\ \xc8\xb6\xfb\xa6\x7c\x93\x6a\x6a\x7c\xd7\x8b\xf8\x31\xbc\xde\xcf\ \xf5\xeb\xd7\xb3\x73\xe7\x4e\xeb\x39\xa6\x4f\x9f\x41\x5b\xdb\x4c\ \x26\x4d\x9a\xc4\xaa\x55\xab\xac\xf4\xa7\xae\xae\x2e\x76\xee\xdc\ \xc5\x39\x67\x9f\xe3\xc5\x68\x8a\x50\x51\x51\xce\x8a\x15\xcb\x19\ \x18\x18\x28\x60\x36\xa7\xcf\x98\x8e\x93\x48\x78\xac\xa2\x8a\x32\ \x6c\x7a\x7b\x7a\x58\xb8\x70\x21\x0f\xdc\x7f\x3f\x75\xb5\x75\x34\ \x8f\x6b\xb6\xdc\x45\xe2\xbb\x00\x02\x57\x40\x20\x50\x14\xcc\x01\ \xb3\x7f\x83\x98\x54\xcb\xbf\x1b\xfb\x83\x99\x2f\xe9\xcf\x85\x1d\ \xc7\x77\x9c\x46\xc8\xd8\x10\xc1\x7c\x26\x8f\xd3\x79\xfc\x38\xb5\ \xb5\x35\xf4\xf7\xf7\x33\x98\xcd\x31\xbc\xba\x14\x25\x0e\x99\x64\ \x92\xee\xb1\x4d\x0c\x2e\x5b\x46\xb2\xb7\x8f\x51\x9b\x36\x51\x51\ \x37\x02\x29\x29\xa5\x63\xca\x14\x72\xf9\x3c\x3d\xfd\xbd\x0c\x4b\ \x67\xe8\x19\x31\x82\x1d\xe7\x9f\xcf\x84\x15\x2b\xd0\xf9\x3c\x1d\ \x8d\x8d\x7c\x78\xfd\xf5\x1c\x6b\xf6\x9c\xb2\x2f\xb4\xf6\xe3\x88\ \x17\x5e\xf5\xe8\xcf\x8f\x71\xf7\x3d\xfd\xec\x69\x49\x42\x22\x41\ \x57\x63\x23\x9b\x2f\xbb\x94\xc9\x6f\x2d\xa1\xf2\xc0\x01\x8e\x4c\ \x9a\xc4\xc6\x2b\xaf\xe4\xe4\x88\x11\xcc\x7d\xf4\x51\x46\x6c\xde\ \x0c\xc0\xf2\x6f\x7d\x8b\x69\xaf\x2c\x64\xc4\xe6\x2d\x4c\x59\xbe\ \x9c\x77\x6f\xba\x99\x92\x92\x14\x15\xc3\xca\x39\x7a\xf4\x28\x8d\ \x0d\x0d\xbc\xf7\xde\x7b\x91\x90\x11\xc5\xe2\x19\x4f\x21\x82\x54\ \x90\x42\x52\x8c\x69\x2c\x9e\x86\xbd\x6b\xd7\x2e\x76\xed\xda\x65\ \xc5\x26\x9e\x2a\x06\xb1\xb6\xb6\x96\xd1\xa3\xc7\x18\x2a\x64\x14\ \x49\x56\xf6\x27\xa4\x64\x59\xe4\xff\x77\x2a\xd8\x33\x81\x09\xcc\ \x91\x39\xb6\xc8\x4f\xec\x84\x72\x70\xb8\x59\xdf\xcc\x3f\xf0\x0f\ \x9e\x6b\x83\x3c\x9b\xd9\x1c\xfe\x7e\x0e\x73\x98\x24\x93\x86\x44\ \x5f\x32\x14\x97\x20\xc2\xe4\xc9\x93\xb9\xe3\x8e\x3b\x78\xe0\x81\ \x07\x6c\x28\xbc\x79\x13\x0f\xfe\xfe\x41\xee\xbe\xfb\x6e\x04\x28\ \x2d\x1b\xc6\xad\xb7\xde\xc6\xfd\xf7\xdf\x6f\x7d\xee\xad\xb7\xde\ \x62\xd5\xaa\x55\x9e\x14\xc8\xac\x59\x0c\x0e\x0e\x72\xe0\xc0\x01\ \x0e\x1e\x3c\xc8\xe6\xcd\x9b\xa3\xfe\x14\x8c\x53\x5d\x0a\x52\x89\ \xa4\x08\xf4\x97\xf8\x1c\xf8\x34\x04\x4b\x3c\xcb\xe8\x34\xf3\xf1\ \xcc\x44\x08\x53\xbc\x25\x0c\x97\x42\xd3\xd1\xd1\x41\x5b\xdb\x6c\ \xfa\xfa\x7a\x11\xe5\x90\x2e\x2d\x45\x9c\x04\xa9\x4c\x1a\x11\xa1\ \x7d\xea\x54\x46\xaf\x5e\xcd\x98\xd5\xab\x91\x7c\x1e\x35\x79\x12\ \xb9\xda\x5a\x94\xa3\xc8\xe7\x35\x7d\xbe\xdc\xc3\xd6\xcb\x2f\x67\ \xeb\xe5\x97\x93\xcb\xe6\xc8\x66\x07\x3d\x07\xa8\x9f\xaa\xb1\x39\ \xf1\x31\x8e\x38\x8c\xef\x48\x52\xe2\xf6\x30\xb9\x5d\x58\xd2\xea\ \xf0\xe6\x79\xf5\xb4\x5d\xf8\x9f\xd1\xb8\x1c\x6a\x9b\x8d\xb8\x39\ \x06\x86\x95\x85\xf3\x6f\xdd\xd7\xbe\xc6\xd8\x55\xab\x39\x3a\x61\ \x3c\x9d\xcd\xe3\xd9\x72\xf5\x95\xd4\x6d\xfb\x84\xf1\xab\x56\xd1\ \x5d\x5d\x47\xfb\x39\x73\xb8\xe0\xdd\xf7\xe8\x6f\x99\x42\xed\xb8\ \x09\x0c\x0c\x0c\xa0\x44\xe1\x6a\x37\x9c\x80\xda\x0c\x1b\xb2\x7c\ \x3b\x14\x8a\x68\xea\x28\xae\x55\x62\xe2\xbd\x3a\x72\x1a\x7d\x2a\ \xb5\xfe\x69\x81\xbf\x77\xdc\x71\x07\xe9\x74\xda\xca\x9e\x08\xa1\ \xaf\x36\x07\x36\x41\x8e\x4f\xcf\x70\xaf\xa4\x92\xbf\x94\x6f\x87\ \x7e\x41\x33\x3e\x2e\xc8\xc4\x0f\x22\xaa\xa6\xcb\x74\x5a\xdc\x16\ \x3e\xe2\xa3\x78\xe0\x17\x37\xcb\xcd\x76\x3a\x19\x86\x50\xd0\x10\ \x4b\x2f\x3a\x25\xe0\xfc\x0b\xce\xe7\x60\xfb\x41\x5e\x78\xfe\x05\ \xeb\x33\x2b\x57\xae\xa4\xa6\xa6\x96\x9b\x6e\xba\x09\x44\x73\xfe\ \x79\xe7\xb1\x74\xd9\x52\x36\x6f\xda\x5c\x10\x99\xb2\x66\xcd\x9a\ \xa2\x91\x2d\xe6\xfd\x82\x43\x25\x80\xe7\xda\x4c\x68\x35\xb4\x3a\ \xad\x84\x92\x7a\x2b\xb6\x00\x00\x20\x00\x49\x44\x41\x54\x8e\x58\ \xac\x72\x81\x58\x54\x4c\x13\x49\x9f\x5a\xca\x78\x68\x56\x13\x65\ \x30\x5b\x2a\x8a\x12\x11\x5f\x8c\x34\xa0\xa8\x4f\x74\x75\x53\x52\ \x5a\xca\xc0\xc0\x20\xc9\x54\x09\xc9\x64\x0a\xc7\x49\x90\x4e\x26\ \xd1\x08\x27\x1a\x9b\x10\xad\x49\xf5\xf4\x90\x3c\x79\x12\x32\x19\ \xca\xaa\xaa\x48\x25\x53\x38\x8e\xe7\x90\x1f\xc8\x66\xc3\x9c\x31\ \x5c\x17\xe5\x38\x28\x71\x50\x8e\x20\x8e\x62\x40\x0d\x92\x10\x87\ \x4b\x2a\x6f\xe6\x8d\x1f\xfd\x88\xd6\xe9\xdf\x26\x81\xc3\x81\xb2\ \x1e\x7a\x9d\x5e\x12\x2a\x41\xbe\x6c\x18\xb9\xf2\x4a\x8f\x9d\x72\ \x1c\x1c\xc7\x21\x57\x51\xc9\x27\x57\x5e\xc1\xb1\x89\x93\x50\x4a\ \xe8\x9c\x34\x85\x77\xee\xb8\x1d\xed\x24\x99\xb6\x70\x11\x57\xff\ \xed\x7f\x65\x54\x36\x4f\xfe\xe4\x49\x2a\x2a\xca\xc9\xe7\x5d\x2f\ \x8a\xc1\x71\xa2\xb0\xac\x80\xe1\xc3\x67\xbe\x42\x8a\x5b\x45\x61\ \x44\xca\x0f\x13\x0b\xd8\x3b\xbf\x4b\x4d\x78\x1e\xba\x1f\xfc\xef\ \xfd\x5b\xaa\x33\x89\x08\xd7\x7f\xee\x7a\x5a\x66\xcc\xf0\x99\x34\ \x09\x19\xd8\x90\x91\x35\x5e\x7f\xed\xfc\x35\x35\xd4\x9c\xf2\x9a\ \x13\x99\xc8\x7f\x75\xfe\x2b\x75\xce\x88\x88\x36\x0f\x42\xdb\x02\ \x66\x57\xa9\x30\xb2\x43\x89\xf0\x45\xf5\xc5\x82\xeb\xcc\x93\xf9\ \x8c\x72\x46\xd9\xfd\x63\xb0\xc1\x4a\x49\x51\x92\x25\x8a\x04\xf2\ \xfe\xdc\x74\xd3\x4d\x9c\x75\xd6\x59\x05\x9f\x7b\xe1\x85\xe7\x59\ \xb6\x6c\x49\xf8\xac\xff\xf1\x3b\xdf\xe5\xc2\x0b\x2f\x3c\xed\x3e\ \x54\x3e\x3b\x8f\xcf\x44\x7a\xd0\x51\x59\x63\x14\x8c\x53\x00\x97\ \x25\x60\x2c\x0d\x17\x01\x3e\x2b\x1d\xba\x71\x44\x85\x51\x55\x60\ \xb0\xcd\x9c\x26\xab\xa9\xa4\x48\x10\x74\x01\xe6\x14\xb2\x83\x59\ \xd2\x99\x34\x83\x83\x03\xa4\x33\x25\x24\x12\x49\x34\x0e\x2a\x91\ \x40\x80\xee\xfa\x11\xf4\x56\x54\x50\xda\xd1\x81\x76\x5d\xb4\xeb\ \xe2\x38\x0e\x65\xa5\xa5\xf4\x0d\x0c\x78\x69\x3d\x5a\x93\xcd\xe7\ \x70\x9c\x04\xda\x51\xc4\x5d\xd9\xae\xb8\x38\xe2\x90\x56\x19\x7a\ \x47\x8e\xe4\x24\x27\xc3\xbc\x2c\xa5\x1c\x3f\x86\xc2\x3a\x60\xac\ \x5d\xca\xd1\xe0\x8a\x03\x5a\xd3\x3e\x7b\x0e\x1f\xef\xdd\xcf\xf8\ \x37\x96\xe0\xa2\x18\x6c\x6d\xa1\xaf\xae\x8e\x64\x32\x49\x3e\xef\ \xe2\xba\x1a\xc7\x51\x14\x64\x17\x2b\x6c\xab\x5a\x8a\xb8\xd7\x85\ \x21\x92\x67\xa2\xf7\x83\xdd\xf0\x7b\xdf\xfb\x1e\x7b\xf7\xee\xe5\ \xdd\x75\xeb\x58\xf7\xee\xbb\x05\xb6\x4f\xfc\x35\x6b\xd6\x2c\xbe\ \xf4\xa5\x2f\x31\x6a\xd4\x68\xeb\x58\xb3\x40\x92\x00\x79\x23\x46\ \xd2\x99\xc8\x3f\xca\x3f\xf2\xba\xfb\x3a\xab\xf4\x2a\x0e\xea\x83\ \x0c\x32\x48\x25\x95\x4c\x92\x49\x9c\xa7\xce\x0b\xe1\x65\xbc\xe5\ \x31\x7d\x64\x8b\xe2\x1c\xa7\xc7\xd1\xe8\x36\x72\x10\x8f\xe1\x4c\ \x92\xe4\x26\xe7\xc6\x42\xd9\x84\xf8\x14\x1a\x2a\x48\x5a\x99\x10\ \xcf\xe1\x9b\xdf\xfc\x26\x47\x8f\x1e\x65\xc7\x0e\xdb\x2e\xfa\xdd\ \xef\x1e\xa4\xa6\xa6\x96\xd6\xd6\x56\x2a\x2a\xca\xb9\xe7\x9e\x7b\ \xb8\xf0\xc2\x0b\x79\xf8\xe1\x87\xd9\xbb\x77\xef\x90\x51\x3f\xf5\ \xf5\xf5\xcc\x9d\x3b\x97\x33\xcf\x3c\x93\x89\x13\x27\xc6\x74\x7c\ \x24\x96\x0e\x6c\xe7\x21\x17\x2d\x15\x50\xe0\x64\x8f\x3d\xa7\x39\ \x57\x4e\x81\x4c\x4f\x99\x81\x1e\xa4\x88\x60\xa5\x01\x45\xd8\xc6\ \x53\xe6\xf5\x56\x7a\x49\x49\x09\x4a\x39\xde\xc2\xf3\xe3\xf8\xf2\ \xe9\x34\x9d\x63\xc7\x52\xda\xd1\xe1\xc5\x5c\x0e\x1b\xc6\x60\x69\ \x09\x4a\x29\x4a\x33\x69\x06\x07\x73\x64\xdd\x1c\xa2\x05\x57\xbb\ \xde\x82\xf2\x19\x21\x80\xdd\xec\xa3\xdd\x39\x42\x9a\x34\x75\xca\ \x33\xda\x2b\x75\x25\x09\x49\xa0\x05\x5e\x4b\x2c\xe1\x66\x7d\x9d\ \x2d\x2d\x1e\x2e\x3c\xc1\xf5\x43\xb5\x94\xeb\x67\x56\x03\x5b\xae\ \xff\x3c\x47\x26\x9c\x41\xbe\xb2\x94\x81\xc9\x53\x49\xd1\xef\xe3\ \x0e\x6d\xa5\xa9\xd8\x49\x38\xd8\x32\xc5\x86\x51\x15\x66\x47\x68\ \x33\xfb\xdb\xd0\x34\xb1\x74\xd6\x22\x19\xb9\x31\x63\xc6\x30\x66\ \xcc\x18\x6e\xf8\xc2\x8d\xf4\xf5\xf5\x71\xec\x58\x07\x9d\xc7\x3a\ \x39\xd6\x79\x8c\xfe\x81\x01\x6a\xaa\xab\x19\x51\x3f\x82\xba\xba\ \x3a\x4a\xd2\x19\x5b\x40\xc7\x44\xba\x43\xc2\x1a\x21\xad\x32\x5c\ \xe3\x5c\xc3\x35\xfa\xda\x42\xf9\x78\x6d\xa7\x96\x88\xa5\xff\xe9\ \x67\x6c\xc4\x61\x98\xc0\x07\xf9\xf5\xe1\xa2\x03\xb8\xd2\xb9\x92\ \x1a\x55\x6b\xa5\x2e\x05\xe1\x71\xa1\xc2\xb6\xc0\xd7\xbf\xfe\x75\ \x6e\xbf\xfd\xeb\xc6\xfc\x31\xfa\xc5\x60\x92\xd3\xe9\x34\x7f\xf7\ \x77\xff\x5f\x04\xf9\x74\x74\x3d\x33\x5f\x47\x03\x33\x66\xcc\xe0\ \x7f\xfc\x8f\x7f\x20\x9b\x1b\xe4\xe0\x81\x76\x0e\x1c\xd8\x4f\x57\ \x57\x17\xc3\x87\x0f\xa7\xba\xba\x9a\x9a\x9a\x1a\xaa\xaa\xab\x0a\ \xb3\xf3\xfd\x36\x88\xc1\x20\x9b\x50\x73\x88\x94\xdd\x68\x04\x45\ \xc7\xd2\xc9\x02\xf9\xfb\x40\x42\x51\x1b\x72\xf2\xa7\x95\x8f\x87\ \xaf\xbe\x15\xa8\x3d\x88\x9d\x13\xe6\xe3\x64\xd7\xf5\xe4\xf6\x02\ \xd9\x05\x95\x48\xe2\xe6\xb1\x12\x05\x7b\xeb\xea\xbc\xd4\x1e\xad\ \xe9\x2f\x2f\x27\x5b\x5e\x19\xaa\x02\xa7\xd3\x29\x12\x79\x87\xac\ \x7f\xf2\xc5\xf5\x20\xdb\xe5\x08\x8e\x4a\x30\x5d\x4f\xa6\x51\xea\ \xc3\x1e\xb9\x80\x73\x58\xa5\xd6\xb1\x4e\xad\x67\x5e\xfe\x5c\x1a\ \xa9\x37\x85\xd0\x6d\x69\x52\x2d\xe4\x45\xc0\x8d\x32\x75\x8e\x4c\ \x9f\x46\xc2\x11\x86\x97\xa4\x49\x2b\x87\x5c\x3e\x4f\x3e\xe7\x8b\ \x16\x29\x65\x99\x6e\x21\xed\x6c\x48\x89\xc7\x4f\x36\x2f\xae\x34\ \xca\xbc\x0e\x05\x9a\x0c\xdd\x27\x31\x0c\x07\x3b\x91\x52\x53\x3a\ \xac\x94\x61\xc3\x4a\xbd\x40\x04\x1d\x65\x44\x9b\xb1\xa8\xc5\xe4\ \xea\x22\x89\x72\x55\x40\x5b\x07\x91\x2c\x41\xee\x5e\x90\xde\x65\ \xee\x1d\x86\x42\xa4\x95\x1e\x65\xca\xf7\x8b\x91\xf2\xe4\xe2\xf2\ \x44\xfe\x89\xf0\x1e\xc3\x18\xc6\xf5\xce\xf5\x96\x4f\x31\x12\x3b\ \xc2\x12\x90\x0a\x12\xd4\x45\x6b\xb4\x52\x86\x6a\x97\x32\x14\xba\ \xb1\x64\xf4\x4d\xc5\x11\x1d\xb3\xbb\x55\x98\x3b\x08\xa9\x54\x9a\ \xe6\xb1\x63\x68\x6e\x1e\x6b\xe7\x88\x15\x51\xff\x0b\xfb\xd5\x84\ \xe6\x62\x4a\x43\x44\xb2\x0e\xb6\xc4\x61\x4c\x1d\x5a\xc5\x35\x75\ \xc4\xaa\xbf\x10\xe8\x6a\x6a\x39\xcd\x13\x2f\x9c\x1b\x5a\x86\x64\ \xe5\xb4\x76\xe9\xed\xed\x25\x93\xc9\x90\x4c\xa5\x70\x54\x0a\x57\ \xe7\x2c\xa9\x80\xce\x09\x13\x22\x96\xad\xbc\x3c\x92\xd8\xd3\xde\ \x89\x19\x88\x1a\xe5\xf2\x79\x6b\xf1\x08\x8a\xc3\x1c\xc5\x11\x87\ \x52\x4a\x51\x4e\xd4\x51\x0b\x38\x97\x77\xf0\x9c\xca\xcb\x9c\x55\ \xdc\xaa\xbf\x80\x1b\x09\x76\xfb\x93\x44\x87\xe5\x16\x94\x0b\x5a\ \x09\x6e\x20\x53\xe1\x6a\x94\x72\x48\xa7\x93\x94\xa7\x4b\x38\x79\ \xb2\x07\x51\xe2\xb9\x38\x8a\x38\x7d\xad\x8c\xee\x21\xd8\xb9\xa2\ \x99\xd7\xd6\xf7\x8b\xf5\x63\x90\xa1\xae\x8d\x05\x12\x73\xd0\xaa\ \xb8\xe3\x30\xbe\x07\x17\xd7\xad\x8c\x20\x95\xb2\xfd\x78\x31\x81\ \x1e\xb3\x4c\xcc\xd0\xa6\x85\xf7\xc6\xba\xfc\x3a\x76\xea\x08\x16\ \x7f\x3e\xf1\x79\xca\x9d\xf2\xa1\x89\xdb\x98\xdc\x7b\xa1\xe3\x3a\ \x26\x34\x65\xc6\x0a\x9b\x40\xc3\xf0\xb9\x15\xd1\xaa\x2a\x1a\x84\ \x50\xf4\xe7\x29\x1c\xdd\xa1\x96\x0a\x3a\xa6\xbf\x59\xac\x32\x8e\ \x7c\x2a\xab\x69\x09\x20\x7f\xf6\x13\xcf\x2f\x05\xa1\x75\x41\x63\ \xcc\xed\xbf\xa4\x24\xc3\x91\xc3\x47\xc8\x64\x32\x64\xd2\x29\x12\ \xc9\x04\xd9\xbc\x4b\x56\xe7\x18\x44\x93\x24\x41\xae\xac\x8c\xc1\ \xd2\x52\x52\x27\x4f\x7a\xcc\xa6\x48\x98\x41\x16\xf5\x81\x62\x3b\ \x3b\x48\x91\x64\xac\x1e\x1d\x2a\x06\x6f\x64\x1b\x09\x71\xa8\xa4\ \x02\xc7\x90\x59\x6b\xa0\x8e\x79\xfa\x1c\xde\x96\xb5\x7c\xc4\x16\ \x3e\xa7\x7b\x29\x97\xb2\x48\x2a\x42\x04\xe5\x17\xe8\x70\x83\x29\ \xea\xfa\x92\xe3\xfe\x86\x92\x48\xa5\x49\xa7\x12\x54\x0e\xaf\x60\ \xd3\xa6\x2d\x24\x12\xbe\xc1\xad\x6d\xbd\x0d\xa2\x1c\x87\x48\xce\ \x21\x94\x44\xb7\x45\x7e\xc4\x90\xa7\x0b\x77\x7c\x93\x19\xc3\xc0\ \xa5\x71\xa1\x24\x2b\x88\xda\x50\x4b\x36\x4f\x13\xab\x02\x8f\x77\ \xff\xed\xf9\xed\xdc\x3b\xf0\x33\x8e\xe9\x63\xd6\x18\xde\xd2\x77\ \x8b\xe7\x9e\x20\xc5\xd5\x89\xab\xf9\x72\xfa\xcb\xb6\xd9\x60\xd8\ \xc2\x9e\xa0\xab\x0a\xab\x05\x69\xad\xf9\x63\xf6\x0f\xac\xc8\xad\ \xe4\x04\x27\x86\x9c\x64\x8f\xe5\x1e\x63\x69\x7e\x29\x3f\x49\xff\ \x35\xd5\xaa\x8a\x02\x81\x4e\x9b\x24\xb5\xd3\xba\x35\x14\x88\x2d\ \x19\x4f\xa7\x63\x76\xb5\xa5\xc8\x1d\x5e\x4e\x1b\x0c\x65\xfc\x66\ \x26\xa2\xf5\xaf\x61\x96\x07\xd3\x31\xe7\x39\xb1\x54\x94\x80\xa1\ \xd6\x46\xe1\x1d\x31\xe6\x40\x61\x69\x23\x62\xe8\xbc\xc0\x3c\xf8\ \x74\x56\x33\x88\x51\x0c\xf3\xed\xfc\x18\xb6\x90\x92\xf5\x58\xab\ \xb2\xb2\x32\xda\xdb\x0f\x91\x4e\xa5\x29\xc9\xa4\x48\xa6\x4a\xd8\ \x2d\x7b\xf9\x79\xee\xb7\xbc\x28\x5e\x3c\x1f\x22\x1c\x99\x35\x0b\ \x44\xe8\x9c\x3c\x39\x8c\xff\x54\x4a\x21\x8e\xc3\x4e\xd9\xc7\x62\ \x59\xce\xef\xe4\x4f\xfc\xab\x3c\xcc\xdb\x6a\x2d\xa2\x04\xc7\x71\ \x18\x54\x83\x24\x24\xc1\x19\xce\x04\x2f\xee\x52\xbc\x80\x69\x11\ \x87\x1b\xd4\xd5\x4c\x92\x09\x38\x92\xe0\x41\xf5\x38\xfb\xa5\x1d\ \xe5\x28\xef\x04\x55\xe2\xe5\xd8\x39\x41\xa0\xb3\xe3\x33\xb3\x0e\ \xe0\xa0\x51\x64\x4a\x4a\xc8\xa4\x92\x54\x94\x97\x73\xe8\xf0\x11\ \x4a\xd2\x99\x28\xe3\x43\x79\xd9\x11\x18\x81\xb3\x41\xa0\x74\xd8\ \x17\xca\xc8\xcf\x33\x03\xa5\x89\x58\x4e\x33\x98\x56\x59\x4e\xd7\ \x28\xc0\xda\x0a\xc2\x55\x51\x3c\x6c\x70\x7f\x2b\xa7\xcf\x67\xdd\ \x30\x98\xc7\x27\xb2\x4f\x16\x2c\x3a\xcb\x3d\xc1\x20\xcf\xe5\x9e\ \xa3\x8b\xee\x88\xad\x8d\x5f\x47\x29\x2b\xf0\x7b\x1f\xfb\x79\x39\ \xf7\xca\x29\x17\x1d\x80\x8b\xcb\x3e\xbd\x8f\xd7\xf2\xaf\x1a\x31\ \x95\x86\x03\x3a\x64\x44\x0b\x13\xab\x83\x20\x71\xaf\xb3\x88\x92\ \x98\x95\xcf\x3a\x1a\x4c\x72\xd0\x97\x28\x33\x88\x3b\x48\xc2\xf1\ \x99\x45\x23\x41\x15\x89\x33\x91\x51\x12\x72\x94\xfd\x22\xbe\x1f\ \xd1\xc8\xbd\xf4\xd1\x9e\x32\x12\x97\x83\xf9\x8a\x3f\xe7\x31\x72\ \xf9\xc2\x6b\x1b\x6c\x28\xaa\x30\x90\xfa\xdf\xc0\x6a\x16\xd6\x0a\ \x33\x51\x52\x79\x79\x05\xbb\x76\xef\x25\x97\xcf\x53\x36\xac\x84\ \xfe\x94\xf0\xdb\x9e\xc7\x18\x96\x4d\xb3\x87\x7d\x68\x81\x76\x0e\ \xb3\x75\xde\x48\x2a\xe7\xdd\x45\xbd\xae\x0d\x0d\xd9\xe3\xba\x8b\ \x47\xf4\x53\x1c\xa1\x83\x7e\xb2\x24\xc5\x0b\x98\x5d\xc4\x12\xce\ \x55\x73\xc9\x91\x23\xe1\x7a\xcd\x9b\xaa\xa6\xe0\xe2\x5a\x8e\x69\ \x01\xee\xe1\x2f\xf8\x79\xfe\x7e\x3a\xa4\x93\x07\x78\x98\x33\xa5\ \x8d\xf9\x72\x1e\xc3\xa9\xc4\x05\x76\xeb\xbd\x24\x24\x49\x83\x34\ \x78\x03\xec\xba\xe1\x24\x2e\x2b\x2b\xa5\x24\xe3\x90\x4e\xa7\xf9\ \xe4\x93\xed\xd4\x8d\xa8\x45\x44\xe1\x48\x31\x18\x54\x4c\xa5\xd8\ \x1f\xf8\x02\x8b\x5c\x4e\x1d\xe3\x67\xb1\xa4\x46\xbf\x16\xa0\x49\ \xc1\x02\x1b\x71\xfe\xed\x34\x0b\x25\x3a\x7e\x10\x77\x51\x49\x9f\ \xf0\x3e\xbe\x4c\xae\x9c\xde\xc5\x03\x82\xcd\x94\x57\x56\x71\x86\ \xd0\x84\x8f\x9f\x12\xcc\x28\xf2\x29\x71\x95\x56\xca\x8e\x14\x84\ \x77\xc5\x9f\x51\xc7\x99\x60\xe3\x79\x6d\x29\x42\x29\x48\xf1\x11\ \x31\xae\x29\x45\x64\xf9\x45\x2c\x3d\x1c\x89\xc9\xe7\x73\xba\x50\ \x33\x2c\xaa\x67\x4c\x00\x6d\x8a\x36\x0a\x54\x94\x97\x73\xe2\xf8\ \x71\x8e\x74\x1c\xa3\x6a\x78\x05\x6f\x67\x77\x32\x3c\x55\x45\x57\ \xb6\x9b\x81\x7c\x8e\x3f\xca\xe3\x1c\xe6\x28\xae\x76\x71\x71\xb9\ \x45\x3e\xcf\x38\x19\xc3\x20\x59\x1e\xcb\x3d\x43\xa7\x9c\x20\x49\ \x0a\x2d\x8a\x5b\x9d\x2f\xf0\xc7\xfc\x13\x20\x9a\x83\xea\x30\x8e\ \x56\x24\x54\x92\x34\x49\x2f\xc5\x27\xd0\xf1\xd5\x18\x4c\x94\x70\ \x91\x5c\xc0\x73\x7a\x11\x1a\xcd\x7b\x6c\x64\x8b\xde\xc1\x19\x6a\ \x12\xc7\xf4\x09\x3e\xd6\xbb\x71\xb5\xe6\x76\xf9\x32\xa3\x19\x05\ \x92\x20\xab\xb3\xf4\xa7\x72\x94\x95\x66\x18\x56\x9a\xa0\xaf\x7f\ \x80\x3d\x7b\xf7\x72\xd6\xdc\xd9\xe1\x86\x63\x3a\x57\x83\x02\x9a\ \x18\x75\xd8\x2c\x75\x2a\x4b\x3b\x58\x47\x0a\xd8\x21\xec\x34\xb4\ \x39\x88\x12\x78\x35\x71\x8d\x47\xc3\xa6\x36\x64\xf0\x6d\x46\x24\ \xce\xf5\x0b\xb7\x64\x6e\x61\x6f\xef\x5e\x8e\xe8\x23\x45\x07\xb8\ \x4a\xaa\xb8\x2a\x75\x35\x15\xaa\x22\x9a\x4c\x5a\x17\x3e\xa7\x44\ \x95\x62\xc7\xca\x58\xae\x49\x5d\xcb\x6b\x83\xaf\x92\x65\x68\xf9\ \x88\x14\x29\x26\x38\x13\xb8\x3a\x7d\x75\xa4\x57\xa3\x05\xf1\x89\ \x26\x15\xc2\xba\x80\xa9\x31\x98\x4f\x43\x7e\xdd\x7c\xde\x90\x5c\ \x29\xa0\xf2\xe3\x32\x86\x3a\x16\xe4\x41\x28\xc1\xa7\x8d\x1a\x19\ \x56\xbe\x1d\x51\xad\x3b\x2d\x51\x62\xb2\xb6\xc6\xcb\x94\xc6\x37\ \x96\x8e\xe1\x2c\x0f\x48\xb4\x50\x9d\xd4\x48\x0a\xb7\x8a\xaa\x9c\ \x42\x66\x2c\x31\x54\x5a\x10\x81\x4e\x86\x55\xc5\x35\xe8\x4d\xef\ \x46\x55\xd5\x55\x88\xc0\x47\x1f\x6d\x60\xfe\x05\xe7\x50\x71\xe4\ \x00\x33\x2a\xce\xa0\xf2\x48\x15\x9b\x06\xd6\xd1\x51\xd2\x89\xa0\ \xa8\xa1\x8a\x0e\x8e\xf1\x78\xfe\x05\xbe\x9c\xf8\x02\x4b\xdd\xd5\ \x9c\x50\x27\x11\x1c\x6e\x57\xb7\xd1\xe0\x78\x45\x38\x4a\x75\x09\ \x83\x0c\xb2\x49\x3e\xa6\x4a\x2a\x49\x68\x27\xcc\x44\x0f\x3b\x33\ \xb4\x3b\xbd\xa6\x9d\xa9\xda\x98\xcb\x2c\x9e\xcf\x2f\x62\x1d\xeb\ \xe9\x67\x90\xf7\xd9\xe8\xb3\x61\x0e\x22\xf0\x70\xf6\x59\xbe\x22\ \xb7\xf0\x4c\x7e\x11\x3b\xb3\x07\x98\x3d\xac\x95\xd6\xb2\x51\x54\ \x94\x37\xf1\xe1\xfa\x4d\x74\x77\x77\x53\x5f\x5f\x6f\x64\x27\x1b\ \x0c\x97\x48\xd8\xf1\x62\xc9\x7e\x47\xee\x16\x53\xfc\x46\xfc\xc2\ \x9a\x9e\x54\xa7\x84\x82\x48\x81\x0c\x62\x30\x40\x62\xe8\x62\xea\ \xa0\x70\xa2\x69\x1d\x2a\x8b\xbf\xf4\x15\xb1\x54\x54\x9b\xd3\xff\ \x33\x45\x4d\xe1\x37\x15\xbf\xb1\xec\x0d\x6d\x31\x96\x12\x53\xcb\ \x32\x94\xa2\x45\x83\xe1\xf2\x0f\x5d\x0b\x02\x77\x95\xde\xc9\x5d\ \xa5\x77\xda\x64\x9a\xb1\xcd\x84\xda\x99\xda\x2c\xc2\x29\x61\xa6\ \xbe\x4d\x34\x05\x63\x87\xa1\x6c\xad\xac\x40\x73\x54\x6c\xb1\xc5\ \x8a\xcd\x60\x04\x26\x60\x16\x01\x8d\x3f\xa1\x18\xa5\x52\x75\x2c\ \x63\x3c\xb0\xd3\x4c\x3f\x9d\xf6\x4c\x8b\x42\x89\xc7\xc8\x2e\xb4\ \x7d\x94\xb1\xd0\x32\xad\x8d\x76\x48\x81\x3b\xea\xb4\xfd\x78\x85\ \x2c\x90\xb6\xe4\xbb\xd1\x9a\x61\xa5\xc3\x18\x31\xa2\x96\x77\xd6\ \xae\xe3\xca\x2b\x2e\x61\xd4\xd1\xe1\xdc\x5a\x77\x03\xdd\x27\xfa\ \xc8\x0e\xf4\x71\xa4\xf4\x63\xae\x95\xcb\x39\x43\x4d\xe2\xe1\xec\ \x53\xec\x75\xf6\xf3\x90\xfb\x4c\xb8\x78\x2e\x95\xf9\x8c\x54\x8d\ \xe4\xb5\x07\x23\x27\xaa\xf1\x6c\xe5\x13\x4a\x24\x43\x27\x27\x70\ \x48\x50\x2f\x75\x3e\x4e\x36\xfd\x2e\xa6\x9d\xe1\xbd\xff\x79\x75\ \x0d\x2d\xee\x74\xde\xd5\x1f\xe1\x90\xa0\x42\x57\x50\x4f\x3d\x2f\ \x65\x5f\xe7\x98\x74\xf3\x60\xee\x71\x06\x5d\x8d\x42\x71\x66\xdd\ \x2c\x3a\x52\x07\x51\x25\x63\x59\xf7\xee\x7b\x0c\x1f\x3e\x9c\x61\ \xc3\x4a\x86\xc4\x3a\x76\x25\xd2\x42\x28\x62\xfb\x78\x0c\x68\x13\ \x63\x86\x4d\x38\xa2\x83\xe2\x1b\x81\xae\x48\x81\xf3\x36\xee\xc8\ \xf6\x2b\xca\x8a\x46\xc7\x3d\x4b\x12\x73\xcb\xc5\x00\x96\xc4\xe0\ \x64\x9c\xd3\xa4\x00\x1e\x15\xfa\xfa\xec\x5a\x88\xa6\xf4\xbb\xb6\ \xae\xaf\xa0\xb0\x7d\x56\xe7\x19\x4c\x9f\x18\xa7\x88\x49\x2e\x69\ \x29\xea\x41\xb3\x61\xa6\xc9\x17\xda\xf7\xd1\x31\x6f\x76\xb4\x16\ \x94\xe5\x4f\xf5\x60\xb2\xad\x53\x8c\x0e\x6c\xc7\x68\x43\xd1\xb1\ \x0a\xbc\xa1\x16\xb0\x26\xd6\x8e\xa1\x7c\x7f\x9f\x39\x2d\x48\x61\ \xd6\xe1\x36\x7d\x1a\x91\x53\x5d\x51\x5a\x56\x4a\x73\xf3\x58\x56\ \xae\x5a\xcb\xee\xdd\xfb\x18\x37\xbc\x09\xd2\x95\x6c\x1f\x7e\x88\ \x8b\x3a\x2f\x61\x84\x7b\x05\xe9\x94\xf7\x08\x97\x24\x16\xf0\x4a\ \xfe\x75\xda\x39\x4c\xb5\x0c\xe7\x02\xe7\x6c\x5a\xd4\x14\x5c\x4d\ \xb8\xab\x4c\xd0\xcd\x6c\x77\x77\xb1\x89\x8f\x71\x71\x49\x4a\x82\ \xcf\x27\xae\x42\x19\xf9\x5d\x41\xd2\x2c\x11\xe2\x0d\xd3\x6d\x26\ \xa8\xf1\x8c\x93\x71\x68\x57\xc8\xbb\x1a\x57\x60\x7a\xfe\x20\x2b\ \x72\xeb\x70\xb5\x90\xce\x27\xf8\x66\xc5\x3d\x9c\x5b\x37\x01\x9d\ \xee\xe6\xe4\xb1\x93\xac\x5d\xb7\x8e\x96\x19\xd3\x42\x26\x17\x6d\ \x4b\x99\x6b\x0b\x9e\x89\xa5\xe2\x1c\x55\x95\xb5\x85\x71\xcd\x60\ \x03\xcf\x6f\x15\x69\xb1\x44\xf5\x6a\xc5\xd6\x73\xd4\x11\x4b\x67\ \xce\x1e\xb1\x0a\x83\x62\xd5\x57\x37\xab\xd8\x9a\x35\xdd\x22\xef\ \x1c\x96\xa3\xd7\xac\xed\x66\xdb\x5b\xc6\xfb\x66\xd5\x1b\xc1\x2a\ \x4c\xa2\x24\x5e\x16\x5a\x42\xa8\x66\x46\x07\x2b\x1d\xf3\x8f\xc5\ \xd2\x63\x42\x54\x60\x38\x32\x94\x09\xb1\xcd\x1a\xea\x22\xc4\xd4\ \xe1\x31\x91\xab\x5d\xf7\xc1\x76\xd8\x05\xf5\x1c\x4d\xf6\xd2\x0e\ \x6e\xf5\xda\xa0\xcc\xd4\x9e\x82\xb2\x23\x91\xdf\x55\x88\x8a\xd4\ \x98\x9b\xb1\x32\x8b\xf8\x98\xf3\x07\xb1\xc7\xf4\xb3\x05\x49\x8b\ \x31\xb1\x94\x59\xa8\x25\xf4\x4f\x28\x12\xd4\xd6\xd6\x91\x49\x26\ \x79\xf3\xad\xa5\x7c\xe3\xae\xdb\xe9\x38\xde\xc9\xc8\x51\xb5\x9c\ \x38\xde\x43\x57\x8f\xa6\x36\xe5\x4d\xe8\x7a\xd5\xc0\xd7\x9d\x2f\ \xb3\xdd\xdd\xc9\x58\x35\x8a\xa4\x4e\x7a\xa7\x95\x4f\xfd\x23\x9a\ \xfa\xc4\x08\x9c\x5c\x82\x5e\xfa\x11\xc0\xd1\x09\x5c\xe5\xd7\xde\ \x36\xdc\xa9\xa6\xc9\xa3\xb4\x5f\x62\x3a\xb4\x27\xfc\xa0\x5e\x1f\ \xd3\x5c\xa2\x16\x70\x90\x4e\xb6\xe5\x77\xf1\x39\x75\x2d\xb3\x47\ \xb6\xd0\x3c\x2c\x83\x64\x6a\x78\x63\xc9\x5b\x1c\x3f\x7e\xdc\x13\ \x3b\x32\xa0\xa5\x79\xb4\x09\x76\x95\xd1\xf0\x7d\xd1\x96\xe7\xb0\ \x20\x64\x4c\x22\x9d\x7d\x65\x96\x48\xd6\x43\x44\xec\x4b\xac\x26\ \xa9\xc4\xdd\x0d\x14\x14\x87\xd4\x66\x04\x8d\x21\xbd\x6e\x49\xca\ \x0b\x31\xd1\xd6\xa8\x12\x54\x04\x17\x6d\x45\x70\xe3\xab\x61\x14\ \x50\x3c\x82\xdf\xae\x5f\x62\xe7\xa0\xd9\x55\xa6\x8a\xf8\x19\xad\ \xba\xe1\xda\x72\x2b\xc5\xdb\x1b\xc8\x4e\xe9\x82\xd2\xd9\xba\x40\ \x13\xa8\x80\x9c\x32\x6a\x9b\x63\x95\xc6\x96\x30\xaf\x54\x7c\x45\ \x69\xab\xac\xb3\x61\x2b\xe2\x9b\x05\x56\x99\xeb\x98\x8b\xc9\x8e\ \x23\xb3\x65\x29\x4f\xd3\xc6\xf3\x4b\x43\x98\x75\xe3\xec\x7c\xc0\ \x70\x10\x1a\x1a\x1a\x18\x37\x6e\x0c\x2b\x56\x2c\xe7\xda\x6b\xaf\ \xa2\x7c\x58\x86\xca\xe1\x15\x1c\x6d\xa8\xe3\x50\x7b\x07\x3d\x7d\ \x42\x49\x26\x1a\xd4\xf1\x6a\x42\x58\x8e\x58\xac\xd4\x0c\x61\xa4\ \x8c\xa4\xce\xad\xa5\x53\x9f\x88\x9e\x43\x29\x50\x4e\xd1\xe6\x87\ \xe6\xa7\x80\xeb\x39\xf0\x50\x5a\x93\xd7\x91\x86\xbf\x06\x6e\x71\ \x6e\x62\x50\xe5\x29\xaf\xaa\x61\x6c\x53\x05\xa9\xa4\x26\x3f\xe8\ \xf2\xfc\xf3\x2f\xd1\xda\x32\x83\x4c\x26\xe3\xd7\x52\x90\x28\x44\ \x69\x48\xf0\x20\x85\x2e\xe7\x22\x4c\x9e\x18\x25\xcc\x0a\x6b\x0c\ \x17\xc7\x24\x45\x19\x35\xbb\x56\x88\x55\xef\x3c\x5e\xa3\x30\x22\ \xbf\x54\x41\xb5\x0c\x31\x49\x03\x03\xe2\x99\x0b\x41\x17\xb4\x63\ \x28\x16\x52\xc7\x20\xb7\xb6\xb2\x5a\xa2\x70\x93\x21\x30\x57\xbc\ \xde\xb2\x79\x94\x05\xd7\x0a\x0b\x91\x99\x25\xb6\xc4\x0e\xfb\x8a\ \xf7\x5f\x5c\xd9\xdc\x72\xaa\xfb\x11\x32\x86\x13\xcd\x14\x1a\x8e\ \x07\x43\xc4\xb3\x4c\xc4\xa8\x1c\x2b\xc6\xce\xaf\x63\x5e\x7d\x39\ \x75\x41\xc2\x53\xfb\xf1\x3c\xbf\x08\x61\x14\xbc\x04\x7e\x15\x43\ \xc4\x54\x7c\x1f\x47\x2a\x9d\x62\xcc\xd8\xb1\x28\x25\x3c\xf7\xdc\ \x8b\x54\x0e\xaf\x26\xd7\x7b\x82\x29\x93\x1b\x49\x97\x94\xd2\xdd\ \x03\xd9\x9c\x42\x6b\x85\xab\x15\x2e\x0a\x8d\x42\xe3\xa0\x95\x03\ \x8e\x83\xf6\xfd\x39\x69\x27\x43\xad\x53\x87\x92\x04\x22\x09\x6a\ \x55\x2d\x23\x13\x8d\xa1\x4f\x28\xf8\xa3\x8d\xbf\xe3\x28\xb4\x04\ \xd7\x14\x5c\xed\xfd\xcc\xbb\xfe\xfd\xf2\x8a\x5c\x0e\x24\x99\x61\ \xdc\xb8\x46\x86\x97\x78\x39\x6f\x2f\xbf\xb2\x90\x83\xed\xed\xcc\ \x9e\x3d\xd3\xf3\xd9\x38\x4e\x98\x44\x69\xfa\x66\x6c\xb1\xdb\xc8\ \xdf\x15\xfa\x6b\x42\xfd\x44\x15\xfa\xdd\x22\xdf\x5f\xe0\x8f\x32\ \xfd\x3e\x31\x21\xa9\xf0\xfb\xb6\x70\xb0\x32\xae\x1b\x68\xd1\x58\ \xa2\x3b\x66\x22\xae\x1f\x71\x1f\x09\x19\x51\x44\x98\x2a\xc0\xad\ \xca\xd2\x41\x09\xf5\x50\x42\xed\x50\xc3\x2f\xa9\x8c\xe8\xfc\xd0\ \xff\x6a\x24\x7e\x9a\xfd\xa2\x8c\x36\x84\xc2\x40\x51\x76\x83\x32\ \xae\x1b\xfc\x3b\xf2\x87\x06\x5a\x27\x86\x6b\x42\x11\xfa\xe7\x94\ \xe1\xfb\xa5\x40\x7c\xd6\xe8\x2f\x15\xd3\xbb\x31\x05\x93\x90\x58\ \x82\x73\x94\x5d\x50\x20\x78\x64\x09\xd5\x9a\x7a\x35\x5e\x1b\x83\ \xb0\xc9\xc8\x57\x68\x27\x44\x2b\x4b\xc0\xf8\x74\xe4\xfd\xe2\xec\ \x4c\x2c\x37\x49\x42\x66\xcf\xfb\xcc\x98\xd1\x63\x38\x63\xca\x24\ \x96\x2e\x5d\xc6\x79\xe7\x9e\xcd\xcc\xd6\xe9\x64\x52\x30\x75\xda\ \x78\x36\xac\xff\x98\xae\x93\x50\x5e\x16\x15\x75\xd4\x2a\xa8\xb1\ \xae\xfd\x95\xef\x69\xa9\x00\x64\xdc\x52\x12\x78\xb2\x80\xb5\xce\ \x08\x12\x4e\x26\xa4\xea\xe2\xf9\x71\x81\xdc\x7b\x58\xd8\x44\x7b\ \x7f\x5c\xd7\x3b\x01\x5d\x17\x2f\x06\x13\x87\xb1\xe3\x27\x32\xae\ \x21\x85\xa3\x35\x7b\xf7\xee\xe3\xc9\xa7\x9e\x61\xee\x9c\x59\x54\ \x56\x54\x58\x15\xc8\xa2\x02\x16\xda\x60\x47\xec\x90\xb0\x28\x8a\ \xc1\x94\x7a\x8f\xb1\x67\x26\x51\x48\x14\x67\xa8\x8c\x78\xd4\xb0\ \x0b\x45\x2c\xe3\xcd\xac\xd0\x13\x55\xe2\xb1\x21\x2c\xb1\xe0\xeb\ \x1d\x3b\x76\xd0\xde\x7e\xc8\x8a\x2c\x1a\xdb\xdc\xcc\xc8\xa6\x26\ \xcb\x6a\x31\xff\x16\x30\x8d\x51\x55\x21\x13\x6e\x45\xe5\x98\xa3\ \xed\x39\xa8\xa4\x5a\x04\xda\x69\xb3\x56\xa0\x2a\x30\x54\xc5\xb7\ \x7d\xa2\x7a\x1b\xba\xc0\x57\x16\x15\xf8\x0b\x8a\x61\x1a\xb1\xc2\ \x66\xbb\x25\x76\x66\x18\xbf\x37\xed\xad\x82\xda\x7e\x10\xc9\xb7\ \x9b\x91\x58\x22\x05\x2a\xfc\x76\xd9\x60\x31\xca\x78\x4b\xe8\x2a\ \x89\xd0\xb4\x14\x02\x9a\xb0\x8a\xd6\xbf\x85\x5c\x29\x82\xcb\x35\ \x51\xa1\x95\xe0\x23\xc3\xca\x86\x31\x71\xe2\x44\x76\xef\xde\xcb\ \x6f\x7f\xf7\x07\x7e\x76\xef\x4f\xd1\xee\x49\x9a\x1b\x6a\xe9\xee\ \x6d\x66\xfb\xd6\x9d\xa8\x5e\x87\x92\x12\x7f\xf1\xf9\x73\x5b\x10\ \xf2\x9e\x40\xaf\x47\xb2\x08\xd4\xaa\x5a\xb6\xe6\x77\x20\x0a\xe6\ \x26\x67\xf9\xb0\x48\xac\x0a\x3d\x18\x0b\xcd\xd5\xe2\x97\x68\xf6\ \x17\x9c\x2b\xb8\xae\x26\x9f\x17\xb2\x39\xcd\x60\xd6\xa5\x61\x4c\ \x33\x53\x9b\x33\xa4\xfc\xb1\xfa\xcd\x6f\x1f\x64\xa0\xbf\x9f\xf3\ \xce\x3d\x2b\x3a\x31\xd0\x31\x88\x16\x73\xa6\x8a\x01\x2f\xc5\x73\ \x32\x6b\x4d\x01\x2b\x68\xf6\x55\xbc\x44\xf3\x07\xef\xbf\xcf\xc9\ \x93\x27\xed\xb4\x95\x86\x7a\x26\x4f\x9e\x5c\x20\xe6\x21\x71\x3a\ \x12\x4f\x90\x75\xeb\xd6\xad\x05\xe3\x75\xf6\xd9\xe7\xb0\x70\xe1\ \x22\x5e\x7c\xf1\x45\xeb\xfd\x3b\xef\xbc\x93\x9b\x6f\xbe\x99\xb8\ \x11\x6a\x8b\xee\x9a\x4f\x6b\x90\x0d\xd6\xa6\x42\xd1\x67\xb4\xe1\ \xa3\xa2\x50\x64\x44\x0c\xf8\x2d\x31\xc0\x2e\x56\xb4\xbf\xd6\x52\ \xb4\x28\x68\x61\x61\x65\x23\x58\x5a\xc7\xcb\x40\x47\xb6\x62\x70\ \x4d\x31\x2a\xd5\x16\xb5\xb8\xcc\x9b\x14\x09\x6c\x88\xa0\xb7\x8a\ \x28\x28\x29\x9e\x79\xa0\xcc\xf0\xb7\x53\xb0\x9d\xa7\x58\x78\x01\ \xfe\x35\x9d\x9b\x06\xed\xad\xfd\x89\x67\x3c\x77\xf3\xd8\x66\x66\ \xcc\x98\xc6\x8a\x95\xab\x78\xe0\x5f\xff\x37\xdf\xfd\x8f\xdf\x66\ \xf0\x64\x17\x33\x26\x54\x92\xcb\x35\xb3\x6f\xd7\x5e\x34\x90\x49\ \x79\xb2\xd6\x6e\x94\x3f\xe8\x6d\x0e\xfe\x46\x39\x55\xa6\xd1\xa3\ \x06\x98\x98\x68\x66\xa4\x1a\x49\xde\xae\xc8\xe6\x07\x57\xfb\x7f\ \x5c\x8f\x58\xc9\xbb\x82\xce\xfb\x27\x5c\x1e\x72\x39\x21\x97\x75\ \x71\x73\x42\xdd\xc8\x66\x5a\x27\x57\x50\xee\xc5\x3f\xf3\x87\x3f\ \x3e\xc2\xb2\x65\x2b\xb8\xf9\xa6\xcf\x93\xce\xa4\x43\xb2\x41\x9b\ \x13\x50\xc7\x2a\x02\xf9\x9d\x12\xd8\x1c\xe1\xce\x2f\x7e\x8c\x63\ \x90\x3e\xa4\xe3\xce\x57\x9b\x8c\x59\xb9\x72\x65\xc1\xe2\x18\x35\ \x6a\x14\x0f\x3e\xf8\x3b\x6b\xf4\x4d\xe1\x24\x6d\x54\x45\x7d\xfa\ \xe9\xa7\x79\xee\xb9\xe7\x0a\xf2\xcd\xe6\xcd\x9f\x3f\x44\x35\x1e\ \x43\xff\xc3\x87\x09\x41\x19\x61\x1d\x64\x8b\xeb\xa1\x73\xd3\x30\ \x38\xd8\xd0\x5f\x69\x5a\xc0\x62\xd4\xde\x0b\xaa\x4b\x89\xb1\x49\ \x69\x83\x95\x0d\x4a\x40\x1b\x74\xb4\x68\xbb\x0c\x9c\x36\x88\xbb\ \x90\xe8\xd1\xda\xae\x57\x68\xc4\x97\x62\x90\x6e\xa1\x8d\x2b\xb6\ \xfc\x82\xd6\x06\x32\x31\x5c\x04\x11\xc3\xac\xa3\x1a\xf7\xda\x64\ \x37\x7d\x06\x5f\xb4\x21\xfc\x15\xf6\x86\x1f\xaf\x69\x31\x50\x3e\ \xe1\xe6\xa9\x99\xdb\x71\xb7\x9f\x99\xd5\x54\x06\xe3\x2c\xc6\xf1\ \x4e\x41\x90\xae\x18\xf1\xa2\x53\xa7\x4d\xe3\xc4\x89\x13\xac\x58\ \xb1\x82\xfa\xfa\x06\x6e\xff\xfa\x57\xc9\xf6\x74\x33\x73\x52\x25\ \x89\x44\x82\x9d\x9f\xec\xc1\xcd\xe7\x49\x65\x14\xca\x27\x42\x82\ \x45\x87\x47\x6c\x52\x22\xa5\xcc\x73\xce\x47\x80\x5c\xde\x4b\x55\ \x71\x4d\xe0\xa2\xa3\x0c\x22\x13\x52\x7a\x8b\x4e\xc8\xe7\x34\xd9\ \x41\x97\x5c\x2e\x41\xfd\xe8\xd1\xcc\x98\x58\x4a\x95\x2f\x4d\xb9\ \x70\xd1\x6b\x3c\xf4\xf0\x23\xcc\x98\x36\x99\xe9\xd3\xa7\x59\x8c\ \x94\x98\x52\x05\x06\x23\x69\x96\x25\x33\x43\x94\xe2\xcc\x9f\x14\ \x18\xd9\x58\x7e\x1f\x10\xe6\xcf\x9f\x5f\xb0\xf0\xf6\xed\xdb\xc7\ \xae\xdd\x7b\x18\xe7\x6b\xcc\x14\xba\x71\x23\x08\xb6\x72\xe5\xca\ \x82\xb1\x9a\x37\x6f\xde\x90\x21\x5e\x51\xfd\x06\x7b\xe3\x0c\x4b\ \x88\x49\xb4\x39\x98\x8c\x61\xa1\xca\x56\x04\xa9\x2c\xf9\x7a\x1d\ \x83\xc9\x61\x0a\x93\x10\x95\x9c\x33\xd3\xa5\x8c\xa3\x25\x0e\x61\ \x31\x4f\x2c\x43\x2c\xdf\x84\xad\xda\x08\x70\x88\xa7\x67\x99\x01\ \xca\x06\x3e\x36\x8b\xb7\xda\x21\x8f\x12\x0b\x33\x33\xab\x01\x5b\ \x54\x4a\xe8\xa2\x89\xa4\xdd\x6d\xf6\x39\x2a\xfe\x19\x87\xe6\xa7\ \x2b\xe1\x2e\x62\x87\x14\x16\x8b\x9d\x93\x42\x5f\xd3\xf0\xca\x4a\ \xe6\xcc\x9d\x4b\x77\x77\x37\x4f\x3c\xf9\x14\xa5\xa5\xa5\xdc\x7c\ \xe3\xf5\x30\xd0\x43\xeb\x84\x61\x94\x94\x4e\x66\xc7\xc7\x7b\x18\ \xe8\xed\xc1\x49\x39\x38\x8e\xe0\x38\xde\xa9\x17\x66\xd0\x07\xe3\ \x28\x5e\xe8\x91\x6b\xba\xb6\xa2\x12\x7a\xde\x69\x17\x2c\xbc\xe0\ \xb4\xcb\x41\x6e\x30\x8f\xa4\xca\x68\x9e\x30\x86\xa9\x63\x1c\xca\ \x92\xde\x09\xfd\xd6\x5b\x4b\xb9\xff\xfe\x7f\xe5\xfc\x0b\xe6\x91\ \x76\x72\x1c\xdc\xbf\x97\x91\xa3\xc6\xc4\xb9\x3a\xbf\x9f\x54\x68\ \x7f\x06\xc5\x60\x43\x7a\x8d\x21\x10\x57\x3c\xac\x35\x4a\xdb\x0a\ \xdb\x3d\xb3\x6d\x26\x55\x55\x55\x05\x15\x61\x57\xac\x58\xce\xf8\ \x71\xe3\x6c\x2f\x7d\x2c\xc9\x75\xcb\x96\xcd\x1c\x39\x52\x18\x16\ \x36\xdf\x3f\xed\x86\x3c\xf1\x94\x2a\x74\x4c\x4b\xb1\xc0\x48\x31\ \x26\xb3\xb6\x9c\xf6\x96\x1b\xa5\xa0\x90\xb8\x89\xc6\x25\xee\xbe\ \xb3\xd3\x6d\x0a\x20\x6f\xec\x3c\x88\x99\x86\xf1\x30\x82\xc0\x71\ \x8d\x96\x22\x3e\xfe\xe8\xe4\x8b\xd7\xd8\x52\x46\x76\x88\x15\x58\ \x10\x8e\x8d\x32\x9e\x51\x88\xb0\x8d\xb6\xe7\x86\xc4\x93\x87\x25\ \xf2\x91\x4a\xcc\x08\xd5\xa7\xd6\x5c\x19\x52\x65\xcc\xca\xa0\x2d\ \x22\x04\xa3\xe3\x59\xd6\x7e\xdd\xbc\x11\x23\x46\x30\x67\xf6\x6c\ \xb2\xd9\x1c\x0f\x3d\xfc\x30\x83\xd9\x41\xfe\xe2\x2b\xb7\x22\xd9\ \x41\xa6\x36\xa5\x18\x5e\x36\x8e\xad\xdb\x8f\x71\xfc\xe8\x11\xf2\ \xd9\x3c\x89\x24\x9e\x1a\xb4\xe7\x35\xc0\xf5\xef\x1f\xee\x6a\x26\ \xb1\x63\xb8\x09\x02\x7b\x4e\x6b\x4d\x2e\xaf\xc9\x0d\xba\xb8\x38\ \x94\x0e\x1f\xc9\xc4\xf1\xd5\x8c\xad\xd5\x24\xfd\x2d\xf4\xd5\xd7\ \x5e\xe7\xe1\x87\x1f\xe1\xdc\x73\xcf\x64\xda\xd4\x69\xf4\xf7\x75\ \xb3\x66\xcd\x3b\x9c\x75\xd6\x99\x1c\x3c\x78\xc4\x3f\xd1\xb4\xbd\ \x8a\x82\x62\x1b\x41\x2a\x4d\x0c\x7a\x58\xb9\x83\x52\xe0\x6b\xb1\ \xfa\x5f\x29\xaf\x8f\x1c\x2d\x5c\x38\x6f\x1e\x2f\xc4\x6a\xc1\x2d\ \x5f\xb6\x9c\xaf\xfd\xc5\x7f\xb0\x63\x19\x43\x92\xc6\x9b\x70\xcb\ \x57\xac\x28\x18\xa7\xfa\xfa\x7a\x4f\xe6\x5d\x34\x37\xdd\x74\x13\ \x0b\xe6\xcf\x0f\xc9\x2f\x04\x1a\x9b\x1a\xfd\x84\x58\x1d\x86\x9d\ \x15\x58\x4d\x5a\x5b\xd9\x3c\x5e\x3f\xab\xa8\x0b\x0c\x77\x86\x19\ \x22\x46\xcc\xde\xb2\x23\x65\xc2\x5c\x23\xe3\xd4\x16\xdb\x6b\x60\ \x9e\xa4\x46\x7c\x63\x78\x82\x98\x30\xdb\x74\xa3\x19\x27\x53\x74\ \x12\x1a\xbe\xd6\x58\x0d\xf8\xc0\xd6\x52\x44\xd5\xa7\x42\x57\x82\ \x51\x13\x3e\x88\x72\x09\xc2\x03\x95\x91\xe9\x1e\xf5\x45\x14\x4c\ \x12\x7c\x25\x0c\x2a\x21\x22\xe5\xc2\x54\xa2\xd3\xb5\xf1\x3c\x71\ \x9f\xe2\xa1\xf5\x12\xf7\x77\x60\xa7\x61\x89\x16\x26\x4d\x9a\x4c\ \x32\x9d\x46\xad\x58\xc9\xc3\x0f\x3f\xca\xd1\x23\x47\xb9\xe3\xf6\ \xbf\xa0\xb6\xba\x9a\xa6\x72\xcd\xf0\x96\x6a\xf6\x1c\xa9\x64\xef\ \xde\xa3\xf4\x74\x75\x93\xef\x1f\xc4\x49\xf8\xf5\x0e\x24\x20\x60\ \xc4\x76\xda\x07\x8b\xcf\x15\x9f\x54\x01\x37\xef\xe2\xe6\x5d\xf2\ \xa4\xc9\x94\x95\xd3\xd8\x54\xc7\xd8\x7a\xa1\xba\xc4\x5b\x9c\xf9\ \x7c\x9e\xc7\xfe\xf4\x24\x8b\x5f\x5b\x48\xc3\x88\x5a\xb2\x83\x03\ \xf4\x9c\x3c\xce\x84\xf1\xe3\x18\x56\x3a\x8c\xa5\x4b\x97\x52\x55\ \x55\x43\x5d\x7d\x83\x0f\x1f\x74\x61\xb6\xa5\x88\x15\xf6\x67\xc3\ \xa8\x22\xea\xc3\xb6\x39\x1a\x7d\xce\xff\xc7\x45\x0b\x16\x14\x2c\ \xbc\x1d\x3b\x76\x70\xf0\xe0\x01\x46\x36\x8d\xb4\x9c\xde\x26\x61\ \xb0\x7c\xd9\xb2\x82\x51\x5a\xb0\x60\x41\x28\x49\x38\x7a\xf4\x28\ \x46\x8f\x1e\x3d\x84\xaf\x50\x0c\xd6\x91\x58\x1d\x73\x29\x7e\x08\ \x1a\x06\x9a\xe9\x54\x2f\x96\x29\x10\x40\x3c\xa5\xc4\xaa\x6f\x68\ \x3b\xca\xa3\x45\xac\xe2\x8d\x8c\xb5\xcb\x52\x30\x37\x67\x7e\x54\ \x3b\xd2\xf4\x88\xdb\x2c\x6b\x78\x70\xc5\x82\x0f\x2c\xd8\x6a\xc4\ \xa9\x5a\xd7\x92\x18\x91\x6d\x07\x3c\x04\x90\x5d\x99\xcc\xb7\x14\ \x2b\x5c\xa2\x87\xac\x99\xf0\xa9\x27\xde\xa9\xe3\xce\xe2\xe4\xa9\ \x5d\xf8\x5e\x10\xc6\x35\x8f\x43\x89\x90\xce\xa4\x59\xfc\xfa\x62\ \x76\xee\xda\xcd\xb7\xee\xb9\x8b\xd6\x96\xe9\x94\x38\x9a\x33\x1a\ \x1d\x1a\xaa\xea\x69\xef\xac\xe5\xd0\xe1\x1e\xba\x4e\x74\x91\x1d\ \xe8\xf5\xfc\x03\x41\xc9\x2b\x23\x60\x39\xd8\xc5\x5c\x2d\x21\x3c\ \x50\xc9\x72\x4a\x2b\x2b\xa8\xaf\x1d\x46\x43\x8d\xa2\xae\x2c\x3a\ \xe2\x0f\x1d\x3a\xc4\x2f\x7f\xf5\x00\xeb\xd6\xae\x65\x76\x5b\x0b\ \x99\x92\x34\x07\xf6\x1f\xc0\xcd\xe7\xe9\xea\xea\x66\xda\xb4\x69\ \x1c\x38\x70\x80\xb5\x6b\xdf\xe1\xee\xbb\xef\xe2\xc0\xc1\xc3\xa1\ \x04\x42\xfc\x88\x17\x33\x72\x82\xc8\x44\x21\xa6\x28\x4d\x41\xec\ \x60\xa1\x17\xba\xad\xad\xad\x28\xdc\x5c\xb6\x7c\x19\xb7\xdd\x7a\ \x5b\x01\x13\x8a\x08\xdb\xb7\x7f\x62\xc9\x9c\x07\xaf\x8b\x2e\xba\ \x28\x9c\xa4\xab\x56\xad\x61\xcb\x16\x5b\xf2\xee\xcc\x33\xcf\x0c\ \xab\x0a\x19\x85\x72\xa3\x84\x52\xed\xb2\x72\xe5\x4a\xb6\x6d\xdb\ \xc6\xce\x5d\x3b\xd9\xb5\x73\x17\x89\x44\x82\x89\x13\x27\x32\x61\ \xc2\x04\xce\x39\xe7\x1c\x9a\x7d\xdb\x53\x61\xcb\xdc\xa1\xe1\xd1\ \x47\x1f\xb5\xc4\x65\x93\x89\x04\x5f\xf9\xea\x57\x2d\xbb\x1f\xe0\ \xe9\x67\x9e\xb6\x6a\xbe\xcf\x9d\x3b\x97\xd6\x96\x16\x23\x06\x12\ \x76\xed\xd8\xc9\x5b\xb1\x52\xcc\x33\x66\xcc\xe0\xac\x33\xcf\x8a\ \xce\xd2\x90\x74\x56\x76\xdb\x77\xee\x64\xd7\xae\xa1\xdb\x1e\x87\ \x22\xc1\xf3\xaf\x5e\xb5\x9a\xcd\x43\xf4\xd9\xc9\x9e\x1e\xde\x59\ \xb3\x86\x77\xdf\x7d\x97\x0f\x3e\xf8\x00\xd7\x75\xf9\xd5\xaf\x7e\ \x45\x55\x55\x55\x81\x13\xdf\x36\x37\x0c\x79\xc4\xd3\x8e\xd5\x34\ \x0a\xc2\x13\xc6\x2f\x1a\xcc\x90\x0e\x90\x70\xdc\x4c\x30\x54\x3c\ \x34\x8c\x1b\xd7\x4c\x6d\x4d\x0d\xc3\x87\x57\xf2\xfe\x7b\x1f\xf1\ \x57\x3f\xf8\x31\xd7\x5c\x7d\x25\x37\xdf\xf4\x05\x1a\x1a\xea\x19\ \x9e\x11\x86\x37\x0a\xcd\x23\xca\xe9\xea\xab\xe0\x58\xb7\xe6\x78\ \x57\x1f\xbd\x27\x07\xc8\xe5\xb2\xe4\xf3\x79\x74\x60\xe4\x89\x42\ \x29\x07\x27\x95\xa0\xa4\x24\x4d\x65\x45\x29\xd5\xe5\x9a\xca\x52\ \x28\x4b\x46\xe9\x1d\xbd\xbd\x7d\xbc\xf8\xd2\x2b\x3c\xf3\xec\xf3\ \xec\xdd\xb7\x97\x59\xad\xd3\x99\x3c\x65\x12\x6d\x6d\xb3\x58\xbe\ \x7c\x05\x5b\xb7\x6e\x46\x44\xa8\xae\xae\x62\xc6\x8c\x19\x8c\x19\ \x3b\x86\x57\x17\xbd\xc6\x88\xfa\x11\x34\x34\x8e\x32\x6c\x57\x65\ \xc4\x2b\x06\x76\x8f\xb2\x38\x4b\x4b\x63\x33\x7e\xe8\xc5\x17\xa2\ \xdf\x37\x8e\x24\x98\xbf\x60\x3e\xcf\x3d\x6b\xb3\x93\xcb\x96\x2e\ \xe3\x2b\xb7\x7d\x25\x1e\x69\x85\xd6\xb0\x7c\x79\x61\x59\xe4\x86\ \x86\x06\xa6\x4d\x9f\x16\x0e\xd3\x9a\x35\xab\x79\xf6\xd9\x67\xad\ \xcf\x94\x94\x94\xd0\xda\xda\x62\xc4\xb9\xe8\x30\x82\x65\xff\xc1\ \x83\xfc\x8f\xbf\xff\x29\x1f\x7c\xf0\x61\xc1\xb5\x03\x85\xaf\xdf\ \xfc\xe6\x37\x7c\xe3\x1b\xdf\xe0\x96\x2f\xde\x62\x9c\x2a\x51\xd4\ \xca\xea\xd5\xab\xf9\xf0\x43\xfb\xfb\x97\x5d\x76\x19\x0d\x8d\x8d\ \x21\xbc\x1e\x1c\x18\xe0\xbe\xfb\xee\xf3\x14\xe5\xfc\x57\x7b\x7b\ \x3b\xad\xad\x33\xa3\x1a\x7b\xc0\x9b\x6f\x2d\xe1\x0f\x7f\xf8\xbd\ \x75\xad\x1f\xff\xe8\xc7\x46\x80\x40\x04\x65\x0f\x1c\x3c\xc8\xdf\ \xff\xf4\xa7\x05\xf7\x2e\xda\xf6\x5b\xbe\x68\x41\x08\x09\x63\x7d\ \x35\xab\x8b\xf4\x59\x69\x69\x09\xe3\xc7\x8f\xe3\x3b\x7f\xf9\x97\ \x05\x4a\x67\xb9\x7c\x2e\x22\x51\xd0\x96\x7c\x7b\x98\xb2\x16\xf3\ \xe3\x9e\x9e\xa0\xad\x2a\x0e\x47\x34\x76\xfd\xe7\x78\xca\x86\x55\ \xce\xd1\x7f\xd0\x8a\xca\x0a\x16\xcc\x5f\x40\x53\x63\x13\xef\xbc\ \xf3\x2e\xcf\x3c\xfb\x1c\x6b\xde\x59\xcb\xa5\x97\x5c\xc4\x95\x57\ \x5c\x4e\x63\x63\x03\x69\xa5\xa9\x1b\xa6\xa9\x1b\x06\x6e\x63\x29\ \x03\xb9\x52\x06\xb2\x30\x90\xd3\xb8\xae\xef\x5b\x12\x48\x26\x84\ \x74\x02\x32\x49\x2f\x8f\xdc\x24\x5d\x7a\x7a\x7a\x78\xe3\xcd\xb7\ \x58\xb4\x68\x31\x1b\x36\x6e\xa4\xba\xaa\x92\x2f\xdd\x7c\x03\x73\ \xe6\xce\x41\x89\xa2\xac\xac\x8c\x29\x53\x26\x93\xcb\x65\xd9\xbe\ \x7d\x3b\x88\x70\xf8\xf0\x51\xda\x66\xb5\x92\x4a\x27\xd8\xb8\x69\ \x23\x53\xa7\x4e\x65\xc7\xce\xdd\x54\x56\x54\x92\x48\x26\x28\x20\ \xa8\xcc\x8e\x34\x6a\x5f\xc7\x28\xb9\xd0\x91\xae\x0b\x78\x4a\xaf\ \xe3\x2e\xbe\xe8\xe2\x82\x85\xb7\x79\xf3\x66\x0e\x1f\x39\xec\x55\ \xc4\x31\x5d\x83\xa2\x59\xba\x74\xe9\x10\xa7\x9d\xe2\x54\x49\x28\ \x81\x8c\xbc\x60\x43\xbe\x37\xdf\x7a\x8b\x9f\xfe\xf4\xa7\xf4\xf7\ \xf7\x9f\x12\x0e\xe5\x72\x39\xee\xbb\xef\x3e\xd6\xae\x5d\xcb\xbd\ \xf7\xde\x4b\xc2\x49\x44\xe1\xfc\xca\x3b\xbd\xe3\x93\x7f\xd3\xe6\ \xcd\x34\x8d\x1c\x19\xf6\xdd\xd6\x2d\x5b\xac\x45\x07\xb0\x71\xe3\ \x46\x1f\x55\x45\xad\xde\xb8\x69\x63\xc1\xfd\x5b\x67\xb6\x86\x4e\ \xe8\x80\x4d\x7d\xf3\xad\x37\x4f\xbb\xed\xff\x70\xef\x3f\x90\x4c\ \x24\x7c\x3b\xd7\x50\x3e\x2d\x42\x48\xe5\x72\x79\x7e\xf4\xa3\x1f\ \x17\x2c\xba\xc0\x2e\x8c\x18\x7f\x89\x57\x8e\xb4\xc2\xe8\xe4\x53\ \x34\x6d\x4f\x21\xef\x67\xef\xba\x76\x3d\xd4\x58\xa0\x6b\xcc\xcf\ \x12\x87\xa5\x25\xa5\x25\xcc\x6c\x9b\xc9\xa8\x51\xa3\xd8\xb8\x71\ \x13\xeb\xde\x7b\x8f\x87\xfe\xf8\x08\x2f\xbc\xf0\x32\x73\xe6\xce\ \xe6\xc2\x0b\xce\x67\xd2\xc4\x09\xd4\xd7\x8f\x40\x29\x45\x89\x03\ \xa5\x09\x29\x88\xf6\x0e\xe9\x5e\x9f\x26\xec\xec\x3c\xce\x8e\x1d\ \xbb\x78\x7b\xd5\x2a\xd6\xae\x7d\x97\x1d\x3b\x77\x52\x92\x49\x71\ \xe1\x05\x67\x33\xef\xc2\x0b\xa9\xa8\xa8\x08\x37\x81\x23\x47\x8f\ \x30\x62\xc4\x08\x9a\x9a\x9a\x50\x4a\xb1\x6d\xdb\x36\x1c\xa5\x38\ \xb0\xff\x20\x6d\x33\xdb\x48\x24\x52\xfc\xfe\x0f\x7f\xe4\xc4\x89\ \x2e\x86\x0d\x1b\xc6\xa4\x49\x93\x98\x3d\x6b\x76\xd8\x01\x5a\x4c\ \x96\x4b\xc5\x88\x0a\x43\x3f\xd8\xc0\x1d\xca\x50\x61\x36\x10\x08\ \xb3\x66\xcd\x2a\x0e\x37\x97\x2d\xe3\x96\x2f\x7e\xd1\xd0\x1b\x81\ \xfd\xfb\xf6\x17\x9d\x04\x97\x5c\x72\x49\x98\xf5\x3d\x64\xa1\x9a\ \x40\x39\xd9\x20\x21\x8f\x1d\xef\xe4\xde\x7b\xef\x2d\x3a\x71\xcb\ \xca\xca\x18\x1c\x1c\x2c\x50\xb3\x7e\xe7\x9d\x77\x78\xea\xa9\xa7\ \xb8\xf5\xb6\xdb\x42\xf4\xa3\x81\x99\x33\x67\x16\x5c\x63\xe3\xc6\ \x8d\x5c\x76\xd9\x65\xe1\x26\xb3\x31\xa6\xf8\x0c\xb0\x77\xef\x5e\ \xba\xba\xba\xc2\x8a\x49\x5a\xbb\x6c\xda\x68\x2f\xbc\xda\xda\x5a\ \x46\xf9\xaa\x6b\xc1\xdc\xea\xec\x3c\xfe\x6f\x6a\xfb\xd3\x4f\x3d\ \xcd\xad\xb7\xdd\x6a\xf9\x59\x8b\x64\x7f\x01\xf0\xc8\x23\x8f\x0c\ \x5d\x87\x4f\x11\x96\x66\x46\xb4\xa5\xf5\x62\x25\x6b\x49\x11\xeb\ \xe3\xb3\x46\xae\x84\x69\x30\xa6\xd9\x6b\x86\xb5\x63\x44\x28\x87\ \x0e\x45\x09\x85\x8a\x24\xbe\xea\xb5\xa6\xae\xb6\x8e\xf9\xf3\xe7\ \x73\xc6\xd4\x33\xd8\xb8\x61\x03\x9b\xb7\x6c\xe5\xad\x37\x97\xf0\ \xfa\xeb\x6f\x50\x5f\xdf\xc0\x84\xf1\xcd\x34\x8f\x6d\x66\xe4\xa8\ \x26\xea\x47\x8c\xa0\xb2\xb2\x82\x44\x22\x01\x22\xe4\xf3\x79\x4e\ \x9e\xec\xe1\xe8\x91\x23\xec\xdb\x7f\x80\xdd\xbb\xf7\xb0\x63\xc7\ \x4e\x0e\xb6\x1f\xa4\xb7\xa7\x8f\xba\xda\x2a\x2e\x9e\x7f\x3e\xb3\ \xe6\xcc\xa6\xb1\xb1\x31\x0a\x88\x35\x4e\xdf\x5c\x2e\x47\x3a\x9d\ \x66\xf2\xe4\xc9\x68\xad\xf9\xf8\xe3\x8f\x49\xa6\x52\x2c\x7e\xfd\ \x75\xb6\x6e\xfd\x98\x0b\x2e\xb8\x80\xaf\x7d\xed\x06\xde\x7b\xef\ \x3d\x96\x2e\x5d\xca\xc9\x93\x27\x99\x37\x6f\xbe\x15\xb6\x15\x68\ \x45\x06\x92\x79\x91\xff\x48\x85\xcc\xae\x4d\x44\x68\xdf\xe1\x1b\ \xe5\xb2\x24\x24\xc1\x45\x17\x5d\xc4\x33\xcf\x3c\x63\xf5\xfb\x92\ \x25\x4b\xf8\xd2\x2d\xb7\x18\x79\x6a\xc2\x92\x25\x4b\x4f\x09\x33\ \xb5\x36\x0b\x65\x14\x5a\xe6\x2a\x34\x98\xbd\xd5\xff\xab\xfb\x7e\ \x55\x10\x3d\x33\x7e\xc2\x04\xbe\xfa\x95\xaf\xb0\x60\xc1\x02\x7a\ \xfb\xfa\x78\xfa\xa9\xa7\x78\xe4\x91\x47\x2c\xfb\xed\xc1\x07\x1f\ \xe4\xea\xab\xae\xa2\xaa\xaa\x3a\xdc\x41\x5a\x5a\x5a\x51\x4a\x59\ \xc5\x46\x36\x6e\xdc\x68\xf9\x0e\x37\x6e\xdc\x50\x74\xe2\x6d\xda\ \xb4\x91\xf3\xce\xbb\x00\x11\xcd\xf6\x4f\x76\xd3\xdb\xdb\x6b\xfd\ \x7e\xe6\xcc\x99\xbe\xc9\xa3\xc3\x8a\x4c\xbf\xfa\xd5\x7d\x43\xb6\ \xfd\xa2\x05\x17\xd1\xd3\xdb\xc3\x33\xcf\x3c\xc3\x43\x0f\x3d\x64\ \x2d\x40\xaf\xed\x57\x33\xbc\xaa\x2a\x3a\x3e\xa4\xf8\x71\x14\x2c\ \x3a\xc7\xf1\x6a\x14\x8e\x1b\x37\x8e\x8e\x8e\x0e\xff\x64\xf7\xdd\ \x33\xda\x8c\x5e\x31\x58\x53\xb1\x83\xaf\xd5\x29\xc2\xed\x4f\xa1\ \xb9\x62\x62\x7a\x65\x69\x4b\x06\xf5\xd0\xe3\x32\x6d\xb6\x16\x63\ \x14\xaf\x66\x4e\x7e\x41\xd3\x58\xdf\x40\x63\x43\x03\xe7\xfb\xb7\ \x3b\x24\x00\x00\x1a\x30\x49\x44\x41\x54\x9e\x7b\x2e\x3b\x77\xee\ \x64\xfb\xf6\xed\xec\xdb\x7f\x80\x75\xeb\xde\x65\xe5\xdb\xab\xfc\ \x9d\xda\x21\xe1\x78\x7f\x50\x8a\x7c\x3e\x47\x76\x30\x4b\x5e\xe7\ \x71\xf3\x2e\x89\x44\x82\x11\xb5\x35\xb4\x4c\x3b\x83\x49\x93\x27\ \x32\x75\xea\x54\xbb\x88\xa3\x14\xe8\x21\x93\xcb\xe7\xe9\xea\xea\ \xa2\xa9\xa9\x89\xd1\xa3\x47\x93\x4c\x26\x59\xb6\x6c\x19\xcf\x3d\ \xf7\x1c\x25\x25\x25\x5c\x72\xc9\x25\x94\x97\x97\x33\x67\xce\x1c\ \xb2\xd9\x2c\x2b\x57\xae\x24\x9f\xcf\x73\xc9\x25\x17\x47\x81\x4e\ \xa6\x1f\x49\xd9\xe1\x4d\xb6\x93\xda\x76\x06\x9b\x99\xd5\x88\x77\ \x62\xc5\x17\xde\xfa\xf5\xeb\x39\xd6\xd9\x49\x4d\x4d\x4d\xd8\xff\ \x4b\x96\x2e\x29\x18\x9f\x8b\x2f\xbe\x38\x92\x6c\x17\x3d\xa4\x1d\ \xe1\xc9\xbc\x47\x2a\x97\xbb\xf7\xec\xe6\x95\x57\x5e\x29\xf8\xdc\ \x8f\x7e\xf0\x43\x66\xb4\x78\x24\x4c\xa6\xa4\x84\xbb\xee\xbe\x9b\ \xfd\xfb\xf7\xf3\xea\xab\xaf\x5a\x13\xf2\x91\x47\x1f\xe5\x2f\xbf\ \xf3\x9d\x30\x0a\xb2\xbc\xcc\x43\x06\x66\x18\xdb\xb6\x6d\xdb\xc8\ \x66\x73\xa4\xd2\x29\x04\x8a\x96\x19\x03\xd8\xb0\x61\x23\xe7\x9f\ \x7f\x21\x22\xc2\x86\x22\x8b\x73\xd6\xac\x59\xfe\x66\xe7\xb5\x7e\ \xf7\x9e\x3d\xc5\xdb\xfe\xc3\x1f\xf8\x04\x92\x90\x29\xc9\x70\xd7\ \x5d\x77\xb1\x6f\xdf\xbe\x22\x6d\x7f\x84\xef\x7c\xe7\x3b\x58\xc4\ \xf5\x10\xaf\xba\xba\x3a\x7e\xf6\xb3\x9f\x71\xc6\x19\x53\xc2\xfb\ \x77\x77\x77\x93\x4e\xa5\x23\x3d\x22\x23\xc6\xd3\x4a\x99\x8a\x05\ \x06\x9c\x66\xac\xa6\x58\x47\x7c\xe4\x17\x8c\x02\x66\x8a\xc9\x3d\ \x8a\x2e\xe6\x3d\xa6\x30\xd2\xce\xf7\x87\x95\x95\x97\xd1\xd2\xd2\ \x4a\x4b\x4b\x2b\x7d\x7d\xbd\x74\x76\x1e\xa7\xa3\xe3\x28\x1d\xc7\ \x3a\xe8\x3a\xd1\xc5\xf1\xe3\x27\x18\xc8\x0e\x82\x16\x52\xa9\x14\ \x65\xc3\x4a\xa9\xa9\xae\xa6\xaa\xa6\x8a\xda\x9a\x5a\x6a\x6a\x6a\ \xc9\x64\xd2\xa7\xc8\xb3\xb1\x69\x62\xe5\x1b\xbd\x79\x37\x4f\x49\ \x49\x09\x23\x46\x8c\xc0\x75\x5d\x9a\x9b\x9b\xd9\xbd\x7b\x37\x0f\ \x3e\xf8\x20\x15\x15\x15\x9c\x75\xd6\x59\xcc\x99\x33\x87\x81\x81\ \x01\x56\xaf\x5e\x8d\x52\x8a\x8b\x2f\xbe\x18\x53\x72\x2f\x14\x84\ \xd5\x91\xf3\x58\x9b\xdb\x91\xd2\xf1\x38\x61\x8b\xfd\x9a\x3d\x7b\ \x36\xd5\xd5\xd5\x1c\x3b\x76\xcc\xb0\x55\x35\xcb\x96\x2d\xe3\x0b\ \x5f\xf8\x02\xe0\xd5\xfc\xde\xb4\x69\x53\xc1\xd3\x5d\x76\xf9\xe5\ \xe1\x18\x05\x31\xa3\x45\x1d\xe8\xfe\x26\x1a\xdc\xf7\xe3\x8f\xb7\ \x15\x7c\x66\xda\xb4\x69\xb4\xcc\x6c\xb1\x61\x98\x08\x97\x5c\x72\ \xa9\x35\x79\x01\xb6\x6e\xdd\x16\x56\x52\x0d\x48\xa5\x99\x33\x67\ \x5a\x0b\x2f\x97\xcb\xf1\xf1\x27\xdb\x98\x31\xa3\x85\xf6\xf6\x83\ \x74\x74\x74\x44\x36\x5b\x6b\x2b\xeb\xd7\xaf\xf7\x17\xde\x06\x94\ \xe3\xa1\xa4\x62\x8b\xb3\xad\x6d\x96\x95\x4b\xb7\x6d\xa8\xb6\xb7\ \xb4\x5a\xf3\x4f\x03\x97\x16\x6d\xfb\xd6\x28\x4b\x23\x0c\x04\x2f\ \xbe\x2c\xfe\xf6\xbf\xfc\x17\xa6\x4e\x9d\x6a\xbd\x57\x51\x51\x19\ \x37\xf6\x43\x45\xe9\x18\xb0\x2a\x48\x5b\x3b\xcd\x90\x31\x23\xeb\ \xdc\x88\x56\xf7\x22\x3a\x94\x91\x02\x2c\xb1\x9c\xc4\x68\x32\x12\ \xcf\xfb\xd2\x86\xa0\x8c\x8e\x1c\xad\x1a\x28\x2d\x2d\x65\x58\x69\ \x29\x23\x47\x8d\xb4\xe0\x6d\x14\xcb\xab\xed\x6c\xe2\x98\x06\x44\ \xb8\x09\x85\x29\x84\x06\x14\xf4\xa1\x45\xb0\x79\xb8\x79\x97\x9e\ \xde\x5e\x8e\x1c\x39\x42\x73\x73\x33\x5a\x6b\x12\x89\x04\xdb\xb6\ \x6d\xe3\xa7\x3f\xfd\x29\xdf\xff\xfe\xf7\x69\x6d\x6d\x65\xce\x9c\ \x39\xe4\xf3\x79\x96\x2e\x5d\x4a\x2e\x97\xe3\xca\x2b\xae\xf0\x7d\ \x3b\xa6\xb0\x8f\x9f\x95\xac\x6c\xa7\x2c\x46\xac\xab\x69\xfb\x05\ \x7e\x23\x49\x28\x2e\xbe\xe8\x62\x9e\x7a\xfa\x29\xab\xef\xdf\x7c\ \xf3\x4d\x6e\xbc\xe9\x46\x44\x0b\x4b\x8b\x9c\x76\x8d\x8d\x8d\x4c\ \x9f\x3e\xdd\x90\xd8\xf7\x54\xac\x65\x08\xa5\xdd\x00\x1a\x29\xd1\ \xec\xde\xbd\xa7\xe0\x23\x03\xfd\x03\xfc\xe4\xc7\x3f\x09\x75\x54\ \x83\xde\x1c\xcc\x16\x56\x2d\xda\xb3\x77\x4f\xe8\x37\x0c\xdc\x58\ \xb3\x67\xcd\xe2\x89\x27\x9e\x28\x38\xcd\x5a\x5a\x67\xb2\x61\xc3\ \x46\x83\x2d\x2c\xe5\xf3\xd7\x5f\x1f\x2e\xbc\x8d\x1b\x37\xa2\xfd\ \x22\x35\x1f\x7d\xf4\x51\x81\xbd\x36\x69\xe2\x84\x90\xc8\x40\xc3\ \x9e\xa1\xda\xfe\x93\x1f\x47\x8e\x6d\x3f\x5e\x72\x70\xb0\x50\xa0\ \x69\xef\x9e\xbd\x61\xdb\xc5\x0c\x83\x8a\xbd\x26\x4f\x9e\xcc\x59\ \x67\x9d\x15\x15\xd5\x0c\x16\x69\xa8\x3c\x60\x9b\x50\x9a\x58\x98\ \x9d\xd6\x46\x12\x39\xa7\x79\xe2\x85\xde\x7e\x3b\x8e\xd1\x96\x1e\ \x2f\x94\x3a\x8b\xa7\xcf\x68\xd3\xd1\x1e\x52\xad\x12\x93\xd0\x96\ \x50\x79\xcb\x8a\xd9\xb3\xe0\x22\x16\x83\xc7\x10\xbb\xbc\xf8\x79\ \x21\x12\x67\x99\xc4\x48\xe9\xf0\xef\xe2\xe6\xf3\xe4\xf3\x79\xca\ \xcb\xcb\x19\x3b\x76\x2c\xf9\x7c\x9e\x5c\x2e\xc7\xce\x9d\x3b\xf9\ \xf9\xcf\x7f\xce\x77\xbe\xf3\x1d\x66\xcd\x9a\x45\x5b\x5b\x1b\xfd\ \xfd\xfd\x2c\x5d\xba\x14\xa5\x14\x57\x5c\x71\x85\x91\x4d\x12\xc4\ \x37\x16\xa9\x60\x21\x56\x8e\x49\x14\x28\x2c\x11\x1b\x76\xd9\xe5\ \x97\x15\x2c\xbc\xf7\xde\x7b\x8f\xee\xae\x6e\x2a\x2b\x2b\x79\xf3\ \xcd\xb7\x0a\xc6\xe6\xd2\x4b\x2f\x0d\x15\x02\xc4\x8a\x4b\x94\x53\ \xc6\x6a\x82\xb0\x67\x4f\xe1\xe4\xdd\xbe\x63\x3b\xdb\x77\x6c\xe7\ \xb3\xbc\x0e\x1f\x3a\xc4\xe0\xc0\x60\x04\xe9\xc5\x3b\x99\x0a\x61\ \xe4\x06\x94\xd8\x27\xd9\xb4\x69\xd3\x98\x35\x3b\xfa\x6c\x5f\x5f\ \x1f\x3b\xb6\xef\xa4\xa1\xb1\x81\xdd\xbb\x77\x17\xd8\x77\x4e\x22\ \x61\x1d\x25\xff\xa7\x6d\x3f\x74\xf8\x10\x03\x03\x83\x94\x04\x81\ \xf1\x43\xb0\x9a\x53\xa6\x4c\xf1\x73\x20\xe3\xd1\xaa\xc4\x32\xfa\ \x23\xd1\x2a\xfb\x33\x71\x71\x5c\x3d\x14\x4f\x33\x54\x70\x6d\x20\ \xec\xe9\xf8\xff\x76\xec\xe4\x4a\x65\x24\x21\x1a\x85\xd9\xcd\x44\ \x49\xc7\x10\x75\x0d\x13\x06\x95\x20\xfe\xb5\xec\x24\x42\xfb\xda\ \x4a\x39\xa1\xb8\xab\xa3\x8a\x14\x7e\x57\x76\x25\x4e\x65\x24\x9f\ \x4a\xec\x9a\x96\xf8\xa8\xf1\x9d\xc6\xc6\x46\x5c\xd7\xa5\xb4\xb4\ \x94\x71\xe3\xc6\x31\x79\xf2\x64\xc6\x8f\x1f\xcf\xe1\xc3\x87\xf9\ \xc5\x2f\x7e\xc1\x9a\x35\x6b\xc8\x66\xb3\xcc\x9a\x35\x8b\x39\x73\ \xe6\xb0\x78\xf1\x62\x5e\x7e\xf9\x65\x23\x81\xd4\x2f\x27\x56\x34\ \x39\xd3\x89\x92\x45\x83\x36\x39\xca\xef\x13\xaf\x1d\x73\x7c\xb8\ \x69\xbe\xf2\xf9\x3c\xcb\x96\x2d\xa3\xb3\xb3\x93\x0f\x3e\xf8\xa0\ \x38\xcc\x0c\x13\x47\x0d\xd1\x5c\x29\x5e\x7f\xdb\xec\x2b\xd3\x89\ \xfd\x6f\x7d\x1d\x3d\xda\x11\x25\x97\x8a\x50\x37\x62\x04\xa3\x46\ \x8d\xb2\x17\xde\x47\x1f\x21\x22\xd6\x49\xd6\xda\xda\xca\x98\x31\ \x63\x19\x3e\x7c\x78\xf8\xde\x47\x1b\x3e\x62\xe3\x86\xe2\xf6\x5d\ \xd4\x9f\xde\x3c\xfc\xbf\xd1\xf6\x63\x47\x8f\x86\x73\x2f\x18\xab\ \x62\x88\xc2\x14\xc0\x0d\x13\x96\x1d\xbb\x0a\xb0\x39\xcf\x94\x95\ \x44\x6b\x8a\x0f\x7b\x63\x7e\x5a\x36\x9e\x29\x97\xad\xac\xe4\x32\ \xc3\x7f\x21\x3a\x8c\xe0\x0f\x0a\x7a\x44\x02\x2f\xb6\x44\x41\xa4\ \x06\x12\xab\xa2\x23\x91\xcc\x9a\x18\xf9\xfb\xda\xf0\x0a\x4a\xa8\ \xe5\xe1\xcb\xdb\x59\xea\x6d\x36\x24\xf6\xa0\xb2\xb6\xed\x3c\x23\ \xb6\xd2\x84\x05\xe3\x9a\x9b\x69\x3f\x74\x88\x83\x07\x0e\x90\x4e\ \xa7\x19\x3d\x7a\x74\x58\x88\x65\xf7\xee\xdd\xfc\xfa\xd7\xbf\xe6\ \xae\xbb\xee\xa2\xa5\xa5\x85\x96\x96\x16\xfa\xfa\xfa\x58\xbc\x78\ \x31\x8e\xa3\xb8\xe6\x9a\x6b\x0a\x35\x57\x4c\x7a\x39\xd4\xed\xc0\ \x48\x6d\x88\x7c\x92\x00\x8e\x72\xb8\xe4\xd2\x4b\x79\x32\x06\xd5\ \xde\x78\xe3\x0d\xaf\x96\x44\x6c\xb7\x6c\x6c\x6c\xa4\x65\xc6\x74\ \xa3\x66\xba\x8a\x12\x34\x8b\x5a\xba\x41\x11\x16\x4f\xb7\x66\xf4\ \xe8\xd1\xac\x5a\xb5\xaa\x80\x21\xad\xaa\xaa\xfa\xcc\x93\x37\x93\ \x49\x45\xf6\xa5\xff\xde\xec\xd9\xb3\xd9\xb7\x6f\x5f\xf8\x99\x83\ \xed\xed\x1c\x6c\x3f\xc8\x96\x2d\x5b\xc2\xf7\x5a\x5a\x5a\x51\x22\ \xb4\xb6\xb6\xb2\xcc\x0f\x7f\x5b\xff\xd1\x47\x1c\x3d\x5a\x18\xf8\ \x3d\x7b\xf6\x9c\x30\x63\x3e\xe0\x07\xff\x6f\xb4\x3d\x95\x4e\x47\ \xf1\x95\x43\x64\x0d\x94\x96\x96\xfa\x1b\x99\x9f\x0e\x14\x64\xbc\ \x86\x1b\x99\x21\x6a\xa4\xb0\x0b\x9b\xd8\xb2\xb3\x56\xe0\xf8\x69\ \xd8\x78\x26\x62\x92\x21\xfc\x1e\x51\xae\x59\x14\x50\x2c\x26\xb0\ \xf2\xec\x41\x1d\x73\x2e\x9a\x47\xb3\x15\x1f\x67\x40\x52\x4b\x28\ \x32\x12\x99\x34\x73\x9c\xa2\x28\x82\x38\xbb\x67\xff\x0c\x33\x99\ \x4d\xdb\x11\x48\x24\x93\x5c\x78\xc1\x05\x2c\x5d\xba\x94\xfd\xfb\ \xf7\x53\x5a\x5a\xca\x98\x31\x63\xc8\xe7\xf3\x38\x8e\xc3\x8e\x1d\ \x3b\xb8\xef\xbe\xfb\xb8\xf3\xce\x3b\x99\x3a\x75\x2a\x2d\x2d\x2d\ \xe4\xf3\x79\x5e\x7a\xe9\x65\x72\xb9\x3c\x9f\xff\xfc\xe7\x0b\x22\ \x77\xac\xa7\x94\x42\x1d\x95\x78\x4c\xe7\x15\x97\x5f\x5e\xb0\xf0\ \x56\xaf\x5e\x4d\x77\x77\x77\xc1\xb8\x5c\x7e\xf9\xe5\xbe\xbc\xb9\ \xc9\xa6\x9a\x59\xdc\x45\xb2\x13\x24\x4a\x6d\x19\x37\x6e\x5c\x51\ \x82\xe2\x17\xbf\xf8\x39\x85\xd2\xb1\x9f\xf2\x32\x82\x2a\x66\xcd\ \x9e\xcd\x0b\x2f\xd8\x95\x5c\x9f\x7e\xea\x69\x72\xb9\x9c\x01\x1f\ \x5b\x11\xa5\xac\x85\xf7\xd1\xfa\xf5\x1c\x8d\x65\x5c\xa4\x52\x29\ \x66\xb4\xcc\x08\xab\x1d\x05\x1b\xda\xb8\xe6\xa1\xda\xfe\x8b\xa2\ \xed\x1e\xea\x19\x8a\x89\x34\xc5\x1f\x2b\x70\xee\x47\x2c\x7d\xb1\ \x39\x5f\xa4\x14\xb6\xe5\x76\x93\x02\x51\xdd\x4f\x87\x9a\xca\x38\ \x3e\x55\xa1\x16\x85\xc4\xb4\x3f\x44\x1c\xff\x7d\x27\xa6\xc3\x6f\ \x1f\xd3\x61\x7d\x00\x55\xfc\x5a\x01\x1c\x0b\xef\x67\x6a\x7f\x58\ \x30\xd1\x89\xb4\x30\xa4\x88\xf6\x46\xac\x4e\x81\x63\x69\x81\x98\ \xb5\x02\xbc\x7b\x5c\x38\x6f\x5e\x08\x3b\x53\xa9\x14\x23\x47\x8e\ \xa4\xb9\xb9\x99\xd1\xa3\x47\xd3\xd5\xd5\xc5\xef\x7e\xf7\x3b\x3e\ \xfc\xf0\x43\x5c\xd7\x65\xca\x94\x29\xb4\xb5\xb5\xb1\x70\xe1\xc2\ \x58\x9b\x62\xf5\x01\x94\x58\xd5\x4e\xcd\x7a\x01\x66\x7f\xcc\x99\ \x33\xc7\x73\x1f\xc4\xa2\x2e\x8a\x85\x43\x5d\x7e\xc5\xe5\xfe\xb3\ \x48\x21\xe4\x2f\x7e\xe4\x59\xda\x28\xcd\x45\x26\xef\x92\x25\x4b\ \x38\x74\xe8\xb0\xa1\xab\x22\x06\x84\x8d\x9e\xa7\x7f\xa0\x9f\xc3\ \x87\x0f\x1b\x35\x01\xa2\xcf\xce\x9d\x33\xa7\xe0\xba\x4f\x3d\x15\ \xd9\xae\xa3\x46\x8d\xa2\xa6\xa6\x16\x11\x61\x66\x5b\x5b\x44\xd6\ \xec\xd9\x53\xf0\x9c\x33\xa6\x4f\x27\x9d\x4a\x59\x26\x81\x52\x42\ \xf3\xb8\xe2\x6d\x6f\x6f\x6f\xb7\xda\x1e\xf5\x4d\x34\x3f\x82\xb6\ \x2b\xa3\x3e\x45\xa0\x19\x54\xcc\xf3\x19\xcc\x5b\x27\xa6\x21\x63\ \xc2\xf6\x48\x33\xc7\x36\x31\x54\x4c\xa3\x46\xd4\x69\x14\x2d\xf1\ \xd8\x46\x43\x9c\x07\xbb\x60\x47\x20\xbe\x83\xb1\x30\x14\x12\x96\ \x25\x0e\xaa\x7c\x86\xa5\x78\xc5\x28\x3e\xe1\x95\xf5\xb0\x0a\x68\ \x28\xb3\xec\x73\xb8\x53\x1b\x36\x8c\x32\x84\x77\x82\x62\x21\x86\ \x4d\x19\x16\xfa\x90\xa0\xcc\x2e\x86\x28\x93\xf8\x99\xee\x91\x48\ \x91\x40\x68\x23\x29\x84\xa4\xe3\x41\xbe\x91\x23\x47\xa2\xb5\x26\ \x93\xc9\x84\x8b\x6f\xcc\x98\x31\x74\x76\x76\xf2\xfb\xdf\xff\x9e\ \x0f\x3e\xf8\x80\x6c\x36\xcb\xc4\x89\x13\x3d\x07\xaf\x8a\x36\x18\ \x15\xdb\xa4\x54\xd0\x0e\x31\x4b\x31\xfb\x7d\x44\xd4\xb7\x09\xc7\ \xe1\xb2\xcb\x2e\xfb\x54\x98\xd4\xd4\xd4\x44\xeb\x8c\x96\x28\x7a\ \x22\xe8\x0b\xbc\x8c\xfe\xa1\x26\x91\x18\x6d\x6b\x9b\x35\xb3\x60\ \x91\xbb\xae\xcb\x6f\x7f\xfb\x5b\x72\xb9\xac\x5f\xf8\x43\x59\xa2\ \x4e\xdd\xdd\x5d\xdc\x7f\xff\x03\x5c\x79\xc5\x95\xbc\xbd\xf2\x6d\ \x6b\x92\x05\xc2\x49\x63\x9b\x9b\xa9\xa9\xb6\xaf\x6b\x9e\xd8\xad\ \xad\x33\xfd\xbe\x50\xb4\x98\xa7\x19\x14\x44\xa1\xcc\x9e\x33\x27\ \x2c\x5c\x22\x61\xc9\x64\x35\x64\xdb\x7f\xf7\xbb\xdf\x91\xcd\x66\ \x8d\x05\x10\xd9\xd4\x5d\x5d\x5d\x3c\xf0\x80\xdf\xf6\xb7\x57\x46\ \xe5\x92\x83\x39\x34\x04\xbf\x51\x58\xa2\xd9\x38\x28\xb0\x0b\xbe\ \x28\x89\x16\x6b\x50\xea\x39\x6c\xbf\x2f\x18\x76\x7a\x36\x9e\xd9\ \x90\x98\x0c\xb8\x14\xad\x45\x26\x43\xc6\xad\x61\x42\x23\x6d\xfd\ \xd3\xfe\x7b\x20\x16\x64\x22\xb2\xb8\x72\xb3\x8d\xed\x0c\x86\xc9\ \x84\x5e\x91\xdc\x9d\x32\x3c\xfb\xa6\x93\xdb\x16\xd7\xf1\xbe\x75\ \xe9\xa5\x9e\xff\x67\xd7\xae\x5d\xa4\x52\x29\x9a\x9a\x9a\x42\xb6\ \xf3\xc0\x81\x03\x3c\xfe\xf8\xe3\xdc\x70\xc3\x0d\x4c\x9c\x38\xd1\ \x0b\x3d\xb3\x3a\x35\xca\xcd\x36\x63\x34\x45\x0a\xa2\x35\x0b\x34\ \x38\xaf\xb8\xe2\x0a\xfe\xf4\xa7\x3f\x9d\x72\xe1\x5d\x71\xc5\x15\ \x06\xdb\x66\x06\x5f\x33\x24\x30\x94\x98\x50\x52\x79\x59\x39\x7f\ \xf5\x57\x7f\xc5\xf7\xbf\xff\x7d\xeb\x73\x4f\x3c\xf1\x04\x2f\xbd\ \xf4\x12\xf3\xe7\xcf\x67\xc1\xfc\x05\xf4\x0f\xf4\xb3\x63\xc7\x0e\ \x76\xee\xdc\xc9\xda\xb5\x6b\xe9\xeb\xeb\x0b\x1b\xac\xcc\x08\x01\ \xc3\xac\x98\x3d\x67\x36\x8b\x17\x2f\x2e\xda\x8e\xb6\xb6\x99\xfe\ \xc9\x01\x65\xa5\x65\x05\x4e\x77\xf3\x35\x77\xee\x5c\xcb\xd4\x09\ \x9e\xae\xac\xac\x8c\xbf\xfa\xcf\x7f\xc5\xf7\x7f\x30\x44\xdb\xe7\ \xcd\x67\xc1\x45\x0b\xe8\xef\x1f\xa2\xed\x46\x3d\xf2\xa1\xca\x65\ \x47\xcf\xa8\x62\xd3\x56\x62\x3f\x4d\x47\xb9\x69\x52\x68\x43\x63\ \x54\x4e\x79\x9f\xa1\x8b\x96\x58\x1e\x40\xb1\x4b\x09\xc7\x1c\x87\ \xa6\xad\x17\xf9\xdd\x8c\x84\x9e\xb0\x54\x2d\xb1\xe4\x60\xb1\xbe\ \x43\x11\xad\x46\x29\x82\xdd\xc3\xeb\x89\x91\x2c\x8a\x11\xd8\x6d\ \x26\xcf\x9a\x31\xa7\x81\xda\x15\xb6\xa4\x4f\xd0\x93\xa9\x54\x8a\ \x6b\xae\xbd\x86\x17\x9f\x7f\x91\xed\x3b\xb6\x87\x27\x9f\xeb\xba\ \x88\x08\xfb\xf6\xed\xe3\xc9\x27\x9f\xe4\x73\x9f\xfb\x1c\x63\xc7\ \x8e\x8d\xe4\xdb\x8d\x48\x1d\x8b\x3e\x0a\x7d\x9f\x43\xb9\x53\xbd\ \xef\xcf\x9d\x7b\x26\xb5\xb5\xb5\x1c\x3d\x7a\x74\xc8\x85\x77\xe5\ \x15\x57\x14\xba\x4f\x24\x2a\x2e\x73\x6a\xcd\x95\x48\xb8\xe8\xba\ \x6b\xaf\xe3\x99\x67\x9e\x61\xcd\x9a\x35\xd6\x67\x7b\x7b\x7b\x59\ \xb8\x70\x21\x0b\x17\x2e\x3c\x85\x59\x67\x5f\xcf\x4c\x5f\x9a\x3d\ \xfb\x14\x0b\x6f\xe6\x4c\xcb\x19\xde\xd6\xd6\x56\x74\xe1\x89\x08\ \xb3\x66\xcd\x8e\xf4\x39\xcd\xc5\x80\x70\xdd\x75\xd7\xf1\xcc\xb3\ \x43\xb4\x7d\xd1\x42\x16\x2e\xfa\xf4\xb6\x5b\x71\x96\x22\x43\x32\ \xfa\x1a\x5d\x2c\x24\x83\x22\x22\xa8\x61\x1e\xaa\x9d\x0a\x2c\xa7\ \x8c\xd7\x2c\xae\xab\x49\x0c\x1e\x2a\xc2\x7a\x6e\x91\x66\x62\xcc\ \x26\x50\x81\x76\x61\x00\x43\x23\x98\xf5\xff\xb7\x77\xf5\x3c\x72\ \x1d\x47\xb0\x6b\x28\x7e\x00\xa4\x0c\x5b\x80\x79\x07\x10\x20\x08\ \x30\xf0\x5d\x24\xcb\x04\x73\x27\x16\x44\xd8\x8e\xe8\xc0\x8a\x14\ \x10\xf6\x2f\xd0\x2f\x10\x1c\x28\x93\x52\x67\xca\x18\x29\x52\xa4\ \xdf\x21\x33\xa2\x65\x39\x12\xa0\xc0\x67\x80\xc0\x05\xa4\x75\x68\ \x07\xfb\x66\xba\xaa\xa7\xe7\x78\x27\x08\x8a\x76\x23\xf2\x6e\x77\ \xef\x7d\xcc\xbc\xa9\xa9\xae\xae\xea\x79\x69\x8d\x72\xe1\xac\x7b\ \x14\xb2\x77\x67\x0b\x68\xd4\xe1\x9b\xb5\xc0\xcd\xe1\xcb\x88\x2d\ \xb7\x2c\xf6\x22\x46\xdf\x03\x6b\x7d\x97\xac\x10\x0f\x94\xa5\x36\ \x72\xff\x6c\xf8\x39\xee\x10\xf6\x15\xfb\xfd\x1f\xff\x60\xf7\xee\ \xdd\xb3\xb3\xb3\x33\xbb\x7a\xf5\xaa\x1d\x1c\x1c\xd8\x9d\x3b\x77\ \xec\xf0\xf0\xd0\x4e\x4f\x4f\xed\x8b\x2f\xbe\xb0\xe7\xcf\x9f\x53\ \x2e\x1a\xef\xf3\xda\x5c\x6e\x69\x26\xfb\xdb\x36\xae\xc5\xee\x0e\ \xbc\xf1\xc6\x15\x7b\xf7\x77\xef\x9e\x0f\x33\xdf\x7e\x3b\x7c\x28\ \x3b\x6c\x86\x09\xb5\x5d\x8b\xa4\xfb\x35\x0d\xaf\xcd\x4f\x3f\xf9\ \x64\x10\x43\x97\x79\xf5\xec\xc1\xb1\x8f\xb2\xf0\x37\x7d\xf8\xf0\ \x61\xf9\x99\xeb\xd7\xaf\xdb\xd1\xf1\x51\xec\x7b\x1a\xec\xd7\xef\ \xbc\x53\xbe\xf7\xe8\xe8\xc8\x7e\xf6\xe6\x9b\x74\xdd\xf8\x5c\x77\ \xd0\xed\x93\x4f\x7f\xe8\xb1\xcf\x19\x85\xa8\x95\xe5\x94\x87\x18\ \x5b\x09\x23\xd8\xd9\xe8\xd8\xfa\xbd\xdf\xf9\xd0\x82\xc6\xb2\x45\ \xbe\xe1\xc5\xc9\x95\x46\x64\x0a\x1b\xb1\x26\x22\x81\x6a\x54\x0d\ \xb1\x2f\x8c\xf0\x46\x4b\xfb\xb2\x64\xb4\x2a\x86\xa8\x36\xd5\xd9\ \xc4\x8c\x34\x11\x17\x8d\xf7\x97\xad\x4d\x84\x0d\x3f\x18\x84\xe0\ \x40\x3c\x58\xa6\x50\xc9\xed\xef\x5d\xbb\x7a\xd5\x1e\x3f\x7e\x6c\ \xf7\xef\xdf\x1f\x84\x0b\x4f\xbe\x17\x2f\x5e\xd8\x97\x5f\x7e\x29\ \x4f\xd1\x96\x42\x17\x1b\x05\x55\xf2\xa6\x9b\x89\x16\xa3\xfa\xe2\ \x7b\x8f\xde\x5b\xaf\x76\x8f\x1e\x8d\x01\xc1\xc7\xc9\xa1\x8f\xe7\ \x3d\xe9\x9b\x98\xf1\xc2\x7e\xfe\xd6\x5b\xf6\xf1\xc7\x1f\xdb\x67\ \x9f\x7d\xb6\x2b\x18\x9f\xf3\xf9\xbb\x77\xef\xda\x93\x27\x4f\xec\ \xe9\xd3\xa7\xf6\xf8\xf1\xe3\x11\x18\xc9\x04\x0b\x00\x3b\x3e\x3e\ \xb2\x9b\x37\x6f\x96\xcc\xe3\xb5\x6b\xd7\xc7\x1e\x1b\x80\xfd\x66\ \x31\xf1\x1e\x3c\x78\xb0\xdb\x83\xcb\x43\xbe\xc9\x80\x7e\xeb\x17\ \x3f\xf4\xd8\xff\x44\x7b\xf0\x6e\xc0\x5b\x8b\x0d\xa7\x87\x28\x05\ \x90\x8e\x71\x6b\x4a\xd4\x35\xe2\x3c\x1a\x1b\xe9\xae\x8c\xa8\x3e\ \xfc\xfb\x87\x13\x06\xfa\xcb\x6f\xff\x5a\x01\x3c\x81\x88\xf1\x9f\ \x70\xa9\x62\x7f\x17\x59\x7a\xa1\x19\x71\xea\xb7\xdd\x3d\x2a\xd4\ \x93\x11\xa0\xc8\xdb\x72\xc9\xb7\x62\xb3\xd8\xcb\x0f\xd3\xe6\x31\ \xf2\xd1\xe8\x1b\xbc\x56\x78\x8e\x7f\xff\xef\xfb\xef\xed\xf3\xcf\ \x3f\xb7\x67\xcf\x9e\xd9\xd9\xd9\x99\x9d\x9e\x9e\xda\x77\xdf\x7d\ \x67\xdf\x7e\xfb\xad\x9d\x9c\x9c\xd8\x3f\xbe\xfa\x6a\x4a\x1e\x1e\ \x7f\xd6\xf5\xaa\x85\xf5\x1b\xc1\x5f\xb7\x3a\xf9\xa7\x0a\x14\x49\ \xbe\x37\x96\xba\xd4\x43\x25\x11\xb2\x3a\x14\x9a\x41\x24\x8d\x2d\ \xdc\xec\xe5\xab\x57\xf6\xcd\x37\xff\xb6\xaf\xbf\xfe\xa7\x9d\xfc\ \xf7\xc4\x6e\xff\xf2\xb6\x1d\x1c\x1c\xd8\xe1\xe1\xa1\x1d\x1c\x1e\ \x88\x8f\x8c\x6b\xe8\x5c\xd2\xe2\x7a\xaa\x69\x86\x7f\xca\xf0\x33\ \x81\x42\x6f\xee\x56\x4f\xd6\x42\x72\x9e\x45\x03\x96\x01\x66\x2f\ \x5f\xbe\xda\x09\xed\xff\xf5\xb5\x9d\xfc\xe7\xc4\x6e\xdf\xa6\x63\ \x3f\x38\xd4\xef\x9a\x74\xbc\x91\x40\x13\x41\x23\x7c\x59\x29\x90\ \x45\xfa\xbb\x72\xcc\x76\x1a\x00\x23\xc2\x79\xf7\x9e\x8f\x9e\x7e\ \x74\xd1\x3d\x9e\x91\xb9\xc5\xae\x1a\x07\x73\xd1\x3e\xf6\x3d\x96\ \xa1\x49\xee\xd8\xf8\xb9\xf5\x0c\x34\x92\x49\x21\x55\xd2\xc0\x62\ \x55\x68\x54\x52\x2f\x3e\xa6\x2c\x6c\x96\x5c\x85\xc3\xb4\x27\x75\ \xb8\x5e\x54\xe7\xd0\xc4\xe1\x42\xec\x24\x04\x37\x1a\xac\x91\x79\ \x7d\xf5\xda\x35\x7b\xff\xcf\xef\x53\xbb\x87\x99\xda\x29\xba\x16\ \x4b\x69\xd0\x7b\x0b\x1b\xbc\xde\xcf\xd8\xe0\xe4\xe3\xe1\xa4\x8a\ \x53\xd3\xde\x4e\xfe\xb8\x19\xe5\xb3\x85\x58\x61\xec\x66\x9b\x8b\ \x95\x83\xb5\xc8\x2e\x18\x42\x77\xf6\xb8\xec\x77\x93\x7d\x1c\x00\ \xbb\x71\xfd\x86\x1d\x1d\xff\x6a\x07\x09\x53\xf8\x15\x77\x7f\x23\ \xd9\xff\x8d\xac\xc0\xf4\x8c\x66\x11\x39\x79\x56\x8f\xc1\x88\xec\ \x43\x81\x18\xfc\x3c\x01\x9b\x17\xe5\x4f\x57\xcb\xc3\x1b\x37\x6e\ \xd8\xd1\xf1\x91\x1d\x1f\x1f\x19\xa7\x20\xb1\xe5\x9e\x0f\xa7\xb1\ \xee\xbf\xd9\x46\x7d\x38\x74\xf4\x88\x9c\xf5\xec\xbf\xc3\x6e\xd3\ \xbd\xdc\xbc\x7d\xd6\xe1\x9b\x07\x4b\xe5\x9e\xbd\xac\xd3\x5f\xc4\ \xfa\x01\x12\x18\xd1\x57\xb8\xe8\xe4\xad\x18\x4a\x14\x9f\x4f\x0e\ \xd9\xa6\x6e\x4f\x31\x55\x88\x2d\x03\x33\x8f\x55\x9b\xc5\x1c\x2e\ \xa1\x57\xc7\xd4\x46\x5b\xda\x27\x34\x3c\xd1\x73\x51\xd4\x84\xb4\ \x2b\xd8\x48\x9b\x0b\xa9\x0b\xbd\x1e\xb2\x8d\x17\xd2\x45\xcb\xc7\ \xc1\xbd\xfc\x62\x98\x6a\xe9\x7c\x91\xde\x63\x29\xd5\x69\x66\x99\ \x51\x9d\x90\x15\xa6\x4d\xd3\x6f\xf3\x43\x2f\xff\x9d\xb8\x57\x64\ \xa8\x9e\xdc\xb8\x79\x6c\x38\xe5\xe5\x99\x24\x8e\xa0\x72\xad\xb6\ \xec\xae\x3d\x51\x7b\x69\x82\x62\x62\xc6\x55\xd4\x80\x9a\x91\x87\ \x3a\x6d\xca\x58\x26\x25\x46\xfe\x4e\x2b\xae\x9a\xe1\xb2\xf6\x7e\ \x80\x08\xbd\x04\x2e\x80\xf3\x43\x5d\x0c\x6b\x98\xb6\xec\x4f\x72\ \x61\x36\x73\x96\x1c\x3d\x01\x1d\x29\x83\x8e\x26\x3b\x27\xb2\x72\ \x16\x5b\x87\x8f\x02\x51\xa8\xed\x43\xd8\x44\x8e\x74\x72\x2f\xd9\ \x45\xcb\xcc\xad\x40\x68\xb5\xc2\x5b\xf0\xad\xf1\x9b\x4c\x69\xb5\ \x14\xfb\xc3\x93\xd4\x93\x35\x5e\x86\x6c\x50\x04\x0d\xb5\x80\x22\ \xbc\x96\x2c\xe0\x55\x1c\x44\x50\x57\x8f\x79\x58\x17\x12\xac\x8a\ \x58\xe9\xd1\x08\x26\xb1\x57\x02\xc1\x32\xec\x1c\xdf\x41\x9d\x22\ \xf9\xbc\x1d\xf3\xcf\xd9\xd9\xce\x7d\x3e\xd3\x29\xbd\xd3\xc9\x76\ \x30\x7e\x2f\x1e\x98\x5d\xfa\xb5\xad\x78\xc3\xf1\xd9\x97\x08\xd9\ \x08\x13\x09\x34\xee\xc5\xf0\x91\x9d\xa8\xa4\x78\xc4\x3c\x67\x26\ \xff\xe2\x75\xbc\x26\x65\xa2\x58\xdb\x90\x8d\x94\xc8\xb0\x94\x57\ \xab\xdc\xb6\xd3\xe8\x89\xe1\xea\x95\x8c\x14\x9e\x81\xb0\xf7\xb6\ \x32\x3b\x04\x72\xfd\x03\xc2\x18\xf5\x94\xf5\x09\x1b\x70\xc3\x5c\ \x43\x26\xdc\x3d\xd5\x24\x37\xed\x23\xc9\x7d\x38\xfa\x62\x97\x99\ \xdd\x26\x31\xd2\x38\x13\xd7\xe0\x8f\xec\x11\x39\xba\x2a\xd2\xfd\ \xc6\x16\x46\x11\x4e\xe8\x5b\x3d\xd0\xe3\xf3\x46\x2b\x8d\x53\xac\ \xf1\xc8\xb4\x73\x1f\x3a\x59\x07\x7b\x3d\x3a\x2d\x2e\xbc\x3a\x7a\ \x58\xf4\x0b\x12\x68\xd2\xc2\xd8\x24\x63\x8f\x00\xbe\x47\x3d\xcf\ \xd9\xc1\x79\x83\xb0\x4e\xf9\x75\x8d\xed\xee\xb3\x19\x6e\x6f\x93\ \x72\x0e\x7e\xf1\xc8\xcb\x30\x0e\x34\x49\x66\xb9\x0b\x0b\x3e\x6f\ \xbe\xfd\xcd\xe8\xfe\x1e\xea\x11\xa7\xba\x6a\xcb\xb3\xcc\x15\xa9\ \x38\xcb\x10\x77\x02\xe1\x3e\x59\x1b\xf2\xd6\x82\x6d\x07\x4d\x82\ \x2b\x2f\x65\x76\x14\x9d\x24\x6d\x55\x63\x2c\xec\xca\x13\xcc\x2b\ \xc0\x21\x67\xe2\xe5\x03\x9b\xa1\x90\x4f\xc5\x49\x97\x47\x40\x86\ \x30\x05\x7c\x82\x62\x30\x09\x85\xc4\x9c\x02\x07\x2c\xa0\x56\x05\ \xef\xd2\x51\x38\x24\x9f\xc6\x6c\x8a\x72\x44\xfd\x69\x64\xe4\x9c\ \x82\x31\x27\x07\xb3\x7c\xbd\x2c\x85\x68\x42\xdf\xeb\x11\x32\xc3\ \x93\xd0\x4a\xfd\xe1\x7a\xbb\x50\xc8\x34\xcb\xfb\xc8\xe6\xbf\xf9\ \x4d\x13\x28\x17\xc8\x8d\x69\xd0\x9a\x2d\xb6\x18\xa8\xe1\xa5\x8c\ \xc8\xa2\x80\x8d\x9c\x54\x84\x5a\x7b\x8a\xe5\xbd\xb0\x52\x6f\x5b\ \x8a\x41\xce\x2b\xd2\xaf\xc9\x95\x2b\xb2\xb9\x0f\xa7\xe0\x70\x56\ \x66\xdf\xc4\xc2\x52\x92\xe0\x86\x6e\xce\xd9\x43\x43\x53\xb5\x63\ \x25\x0a\x58\x9b\x36\xe4\x16\xb0\xd3\x32\x5b\x56\xf0\x62\xdd\xef\ \xa4\x0f\x40\x6f\x18\xab\xc3\x94\xf8\x98\x57\xa2\xd4\x47\xe1\x85\ \x45\xbb\xa5\xf8\x32\x86\xb1\xdc\xa5\xdd\x1b\x4c\x3d\xb9\x20\x3b\ \xbb\x0e\xbb\x09\xec\x1a\x85\x79\x92\xbb\x47\x68\x26\x03\xb0\x04\ \xd8\x40\x79\xe5\xfd\x29\x4e\x54\x6a\x47\x14\x05\x35\x3a\xae\x57\ \x85\xa0\x7b\x24\xf2\x08\xf9\x48\x37\x3d\x88\x3d\xba\xc7\x03\xfa\ \xb9\xec\x13\xd9\x30\x29\x99\x88\xc6\x9d\x23\x77\xea\xe8\x94\x71\ \x49\x30\x12\xc7\x68\x8f\x08\x39\xb7\x3c\x06\x9d\x91\x60\x58\xaf\ \x9b\x27\x36\x9a\xb6\x43\x89\x34\x76\xda\xda\x18\x89\x26\xe0\x3a\ \x07\xe6\x63\xb6\xcb\xad\x78\x26\x6d\x3c\x14\xac\xd4\xf7\x78\xcd\ \xa4\x1c\x30\xed\xcd\xb7\xa6\x02\xfe\x26\x83\x15\xdd\xb9\x5d\xde\ \xe5\x06\x82\xa5\xec\x24\x2d\xb6\x32\x64\x3c\xa9\x11\xc3\xb1\x99\ \x8f\x54\x1f\x0d\x91\x1f\x0a\x06\x62\x61\xdd\xf2\x05\x94\x66\x9f\ \x78\x4e\xfb\x0e\xc6\xc8\xb9\x12\x9c\x6c\xd4\x77\x34\x6c\xc0\x1b\ \x61\x90\xbe\x87\xe5\x0c\xb8\xee\xa9\x0c\x0f\x55\x05\xe7\x10\x52\ \xdc\x13\x06\x51\xc4\xfb\x39\x1b\x8d\xb8\x01\x37\x93\x82\xc7\xba\ \x2b\x5a\x88\x23\x38\xbf\xdd\x3b\x21\x22\xd9\xde\x85\x45\xfd\xe0\ \x42\x68\x2f\x3d\x06\x7b\x4b\x7e\xa0\xb4\x7a\xb4\x28\x2d\x8c\x8e\ \x7c\x80\x60\x9f\xc9\xde\xb4\x9b\x66\xed\xf2\xd6\xdb\xd8\xf6\x45\ \x4e\x7a\x4c\xd8\xd6\xb1\x6a\x6f\x60\x09\xfa\x92\x8e\xdd\x8c\x3d\ \x52\xdb\xc8\xad\x8b\x98\xe5\xfe\x00\x34\xf4\xbd\xac\xd1\x39\x6a\ \x97\xc9\x20\x98\xfa\x98\x1d\x13\x90\x32\x9e\x88\x1b\xc4\x65\xed\ \xfd\xea\x25\x18\x35\xe6\x9c\x58\x39\x5b\x1a\xca\x54\x7c\x54\x05\ \x39\x6b\xf2\x03\xd3\xef\x57\x1c\x9c\x9d\xc7\xd7\x41\x90\x6c\x09\ \xe5\x0a\xb4\xb3\x64\xb0\x90\x76\xd8\x58\x5c\x1b\x3d\x78\x4d\x12\ \xb2\x12\xc5\xa0\x66\xce\x12\x0b\x97\x99\x54\x9c\x7b\x75\xe6\x16\ \xad\xea\xc2\x4f\xba\x5c\xac\xee\xdb\x8c\x16\xe7\x43\x2b\xee\x47\ \x75\x53\xd2\x36\x06\xc5\x50\x63\x67\x04\x5b\xc0\x5b\x14\xf7\x52\ \x1f\x1c\xc5\x78\x81\xcd\xf7\x2e\x43\x20\xac\xb6\x1f\x56\x5a\xdb\ \xdb\x65\xed\xfd\x32\xab\x69\x14\x1c\x38\xa0\x9a\xac\xf3\x51\xb0\ \x6a\x59\x83\xc9\xc5\x54\xd8\xa4\xd9\x54\x31\xa5\xa5\x3a\x92\x82\ \x49\x23\x28\x31\xe8\x6d\xf7\x09\x12\xcc\x79\xdb\x73\xf1\x7c\x10\ \x01\x09\xb2\x15\x68\x79\x08\xb8\x3d\x31\x81\x9a\x8b\x18\x14\xa4\ \x97\xec\x67\x0d\x7d\x2c\xb3\x8f\x9e\xe1\x89\x44\xdc\x8b\x1e\x70\ \x82\x68\x3d\x54\x84\x0b\xb8\xb4\xb7\x63\x9d\xeb\xa8\xd1\x0a\xcb\ \x57\xe1\xe9\xa5\xcc\x54\x2e\xe9\x38\x2b\x62\x58\xa5\xc8\x6c\x9c\ \x57\xe7\x24\x22\xd8\x56\x31\x77\x5b\x3c\x93\x23\x24\x84\xfc\x76\ \x5c\xca\x18\xb3\xbf\x65\xfc\x9a\x04\x08\x9c\xf7\x48\x7b\x85\x4c\ \xc8\x4a\x33\xf6\x54\xe1\x4f\x90\x3c\x6b\x95\x67\x7d\xc8\xc5\x27\ \x9e\xb5\x36\x3c\x01\x77\x03\x01\x23\xc9\x35\x43\x3b\x7d\xd8\x93\ \x52\xc4\x52\xc1\x71\x2b\x88\x3a\xba\x33\x96\x26\xc2\x00\x54\xea\ \x72\x5d\xd2\x8d\xc3\x02\x27\xa8\xda\xa8\xe3\xdd\x0b\x32\x87\x18\ \x3f\x4d\x77\x1b\x17\xab\xe7\xae\xb9\x6b\x6c\x32\xa8\x38\xee\xd8\ \xe0\x2b\x75\x95\x4b\xd3\x23\xcf\xeb\xd6\xbb\x92\xd9\x6f\x9b\xde\ \xef\x4d\x08\x9f\xbe\xd7\x1d\x5d\xd7\x04\x7b\x63\xaf\xc4\xcc\x26\ \xa2\xd8\x1f\x54\xb4\xc6\x89\x35\x0d\x7e\xf4\x8d\x4d\xe6\xc6\xe6\ \x5d\xf7\xc6\x56\x48\x6e\x54\xfc\x36\x11\x69\x4c\xb3\x6f\x40\x77\ \x82\x0d\x3b\xb8\x8d\x91\xa1\x37\xc6\x6b\xe3\x9a\xed\x76\xbd\xd1\ \x4a\x0f\x1a\xb3\x60\x44\x91\xae\x5b\x24\xbb\xb6\x80\x70\xb4\x6f\ \x05\x65\xf3\x31\x85\x62\xd8\x01\x56\x89\x30\x01\xc5\x6f\xf2\xf8\ \xe2\x52\x54\xdf\x72\x90\x2b\x38\x12\x71\xc7\x0c\xf3\xec\x2e\x3d\ \xc2\x69\x2f\xb7\xe2\xf1\xb2\x8b\x6a\xf5\x5c\x63\xbe\xda\x4e\x5c\ \xf2\xbb\xeb\xc2\x33\x90\x58\xca\x05\x83\x85\xba\xaa\x3a\x17\x51\ \x27\xa8\x79\x3e\x54\x06\xd6\x8c\x63\x66\xed\xd4\x37\x5b\xbf\xab\ \xea\xd4\x41\x6e\x8f\x2a\x60\xb6\x55\xb0\x17\x0b\x78\x98\x3b\xa0\ \xd9\xc7\x13\xe7\xdc\x93\x5c\xdf\x4d\xfb\x73\x2c\x44\x11\xaf\x03\ \xb0\xd5\xb1\x82\xec\x2e\xb0\xa0\x71\xeb\xd4\xa2\x75\x61\xbf\xbe\ \xdd\xab\x2d\x40\xf5\x8d\xab\x22\x37\xce\x29\xc8\x67\xa6\x15\xe5\ \x35\xc5\x05\x20\xe6\xeb\xa1\x26\x6b\x09\x59\x57\x39\x4a\x1e\x9c\ \x01\x5e\xe1\x12\x68\x26\xf6\xa8\xd3\x24\xd7\x2d\x66\xd4\xa4\x50\ \x33\xc5\x08\x06\x5b\x97\xb4\x7c\xca\x78\xe6\x30\x61\x4f\xd5\x64\ \x2d\x70\x87\x1a\xc7\xc4\x23\x93\xe1\xf3\x78\x06\xc3\x94\x65\x94\ \x82\xb4\x2f\x78\x51\x6e\xa3\xea\x81\x86\x95\x5e\x93\x06\xab\x93\ \x9a\x14\x25\xb2\x8b\x3a\x9e\x27\x81\x40\x62\x8d\x17\xf4\x5c\xb4\ \x53\x35\x17\xb6\x18\x0c\xfb\x12\xcc\xaa\x74\x9e\x36\x87\x4f\x2b\ \xb6\x1d\x45\x78\x1d\x9d\x72\xdc\x9e\x14\x9a\x24\xa2\x88\x95\xd1\ \xe4\x7b\x06\x8c\x76\xa3\xfb\xe3\xd3\xf0\x33\x81\xdf\x96\xb6\x27\ \x5c\x84\xb4\x54\x94\xb4\xa9\xf5\x6d\x92\x01\xa4\xda\xb1\xb3\xfe\ \xd4\x82\x74\xb9\x14\xd4\xc4\x66\xe6\x32\x04\xcf\x2d\x60\x1a\xa2\ \xa6\xc8\x55\x91\x58\x8e\xd9\xdb\x12\x53\x8a\x1e\xc1\x89\xcc\x1f\ \x46\x86\x74\xa7\xbd\x9b\xb7\x62\x5f\xd1\x24\xb5\xb4\x5f\xc8\xbe\ \x52\x3b\xe9\x04\x91\x2f\xe6\x40\x83\x10\x26\x6e\x78\x64\xf2\x64\ \x21\xdd\x58\xe3\xd2\x89\x63\x82\xa0\x4e\xda\xd6\x51\x80\xef\x02\ \x84\xad\xbf\x6b\x68\x07\xc7\x67\xa8\xe9\x98\x64\x10\xbb\xdf\xa3\ \xb8\xb6\x33\x83\xdc\x26\xd1\x6f\x53\xcf\x8f\xe1\xe6\x1d\x01\x0e\ \x01\xef\x08\x72\xca\xe2\x87\x61\x5d\x38\xb6\x0f\x18\x95\xf3\xaa\ \x6d\x52\x1a\x7e\x3d\x09\xd4\x2d\xe7\xab\xbb\x87\x48\x63\x9b\x3d\ \xc3\x1a\xbf\x0b\x32\xc6\xc4\xd9\x98\x46\x27\xbf\x9d\xcd\xdb\x94\ \x03\x6e\xd1\xdf\x97\x7b\xed\xa0\xd0\xb0\x6d\x06\x46\x60\xea\xbd\ \x3b\x1d\x37\x28\x74\x6d\x90\xe7\x87\xb8\x82\xd3\xc3\xd3\x24\x41\ \x19\xb1\x45\x31\x27\x0d\xe7\x45\xa1\xe6\xa4\x10\x49\x29\x91\x55\ \x13\x7a\xc5\x68\x95\xda\x4a\x25\x54\x2a\xc6\xeb\x75\x9e\x9d\xb9\ \x23\x5d\xfe\xf6\x14\x3b\x5c\xc3\x29\x14\x14\x1c\x2a\xfd\x67\x7a\ \xc8\x69\x4e\x78\x2e\x3e\x43\x6a\x5f\x66\x15\x8c\x2d\x18\x5c\xd4\ \xac\xec\x04\xb4\x50\xc1\x2d\xac\xee\x44\xae\x8a\x2b\x6c\xe2\x87\ \x88\x15\xa1\xa3\x98\x67\x57\xc5\xdc\xe1\x1c\x06\xd5\x38\xd2\x98\ \x56\x1d\xcb\x95\xbb\x24\x77\xe3\xe4\x58\x85\x79\x4d\x10\xc7\x52\ \x53\xcc\x43\x0c\x58\x43\xd2\x62\x3f\x85\xc5\x78\x59\x32\xe2\x2b\ \xc6\xf6\xb2\x05\xf4\xde\xa6\x3f\xb6\xb7\x02\xc1\x9c\xec\xf2\x28\ \x2e\x97\x0a\xc7\xdd\xfe\x6c\xd4\x7c\x8c\x23\xa1\xa9\x6e\xd7\x57\ \xd2\xac\xb3\xa3\x27\xa1\xa4\x15\x0d\xa8\xe3\x0a\x00\x08\x7f\x01\ \xa6\x8e\xd3\x02\x5b\xb8\x35\x65\x66\xac\x50\x14\x3c\xd1\x19\x5d\ \x5a\x09\x25\xc8\xde\x33\x13\xba\x1d\xcf\x88\x6c\xe6\x15\x94\x3b\ \xd5\x21\x70\x92\xdb\xa6\x94\x4d\x65\x82\xca\x0a\xbd\x68\xa2\x1d\ \x93\x6e\x31\x8a\xdb\x75\x65\x9c\x61\x91\x72\xc9\x5c\xf8\xc6\x0c\ \x5b\x73\xfb\x11\x14\x5d\x8a\x84\xce\x1b\x91\x4b\xb3\x7e\x16\x4e\ \xba\xdf\x94\x35\xa1\x47\x4d\x2e\xcd\xa9\x40\xdd\x57\x68\x16\x23\ \xf4\x73\xc3\xa4\xfb\x9c\xf8\xe4\xa4\x4c\x36\x39\xe7\xf1\x6f\xea\ \x52\xe8\xe3\x5b\x04\x19\x5a\xc1\x64\x8a\xe7\xa2\xca\x15\xe8\x13\ \x9d\xdb\x6e\xac\xfb\xa2\x84\xf3\xa5\x73\xf4\xac\x57\xb2\xa1\x14\ \x5b\x8b\xb0\xec\x93\xba\x8d\xdc\x17\x52\xaf\x23\x2e\x3a\x07\x64\ \x9a\x73\xc1\x72\x77\x34\x83\x05\x23\x86\xcf\x1b\x39\x3e\xa7\x62\ \xfb\x28\x7a\xf7\x68\xde\x54\x90\x0c\x08\xdb\x0f\xa9\x89\x18\x3b\ \x4f\x6c\x86\x55\xe8\xba\xcb\xc4\xa6\x8e\x30\x43\xb2\x82\xef\x16\ \x8e\x09\x5b\x86\x52\x64\xa8\x86\xda\xc8\x81\x88\xcd\x51\x53\xf5\ \x04\x41\xeb\x0e\xbf\x7a\xd1\xda\xa1\x42\x6b\x78\x52\xd2\x18\xfb\ \x48\x06\xb7\x88\x4e\xed\xb5\x2a\x46\x39\x26\x44\xa3\x87\xa6\x91\ \xb5\x23\xa0\x53\x4b\xa7\x37\x06\x0b\xce\xea\x98\x71\x7b\xa8\x85\ \x09\x94\x7b\xe0\xae\xf1\x1c\x8c\x24\x40\xcc\x2f\xdf\xdf\xd0\x4e\ \xb3\xb8\xbf\x91\x5d\xfb\x16\xaf\x36\x72\x29\xa0\xc6\x48\x02\xe9\ \x77\xff\x6f\x93\xd9\x6b\xb3\x3e\x1a\x57\xb4\xe6\xd2\xc2\x5d\x8b\ \xcd\xc8\x28\x4a\x4e\xa2\x17\x1f\x0a\xbc\x62\x56\xfa\x3e\xb6\x41\ \x0f\x2f\xdb\x80\xad\x4d\x05\xb9\x0c\x50\x96\xc5\x6c\x23\x5a\x1d\ \x59\xbf\x98\xe0\x20\x89\xa1\x97\xcc\x62\x51\xac\xce\xd8\x63\xfe\ \xde\x05\xf4\xb3\xdc\x96\x82\xba\x90\xdf\x4c\x5a\x89\x56\xfa\xc7\ \x5a\xb2\x98\x18\x46\x9f\x0b\xde\xc1\x9e\xaf\x2d\xf9\x51\x56\xf5\ \x51\x16\xf3\x5e\x0f\xbb\x58\x0b\x95\x78\x4b\x09\x74\xf4\x89\x89\ \xce\x91\x5a\xa5\x5e\x35\xc5\x0d\xbc\x16\xbe\xa3\x3e\x2f\x24\x24\ \x87\x05\xcd\x0b\x14\xf7\x5f\x60\x6d\x8d\xa0\x96\x13\xef\xf9\xf3\ \xe7\xf6\xc1\xdf\x3e\xb0\xfd\x6b\xff\xda\xbf\x7e\xbc\xd7\xad\x5b\ \xb7\xa6\x9d\xaf\x4c\xba\xfd\x6b\xff\xda\xbf\x7e\xfc\x57\x0e\xd4\ \x6c\xfb\x49\xb7\x7f\xed\x5f\x3f\xfd\xe4\x6b\xfb\x49\xb7\x7f\xed\ \x5f\x3f\xfd\xe4\xfb\x3f\xd9\x29\x2a\xc7\x62\x4b\x0e\x55\x00\x00\ \x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ " qt_resource_name = "\ \x00\x06\ \x07\xa7\x28\x98\ \x00\x73\ \x00\x70\x00\x6c\x00\x61\x00\x73\x00\x68\ \x00\x09\ \x02\x89\x1c\xd7\ \x00\x73\ \x00\x70\x00\x6c\x00\x61\x00\x73\x00\x68\x00\x69\x00\x6d\x00\x67\ " qt_resource_struct = "\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ \x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ " def qInitResources(): QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() spykeviewer-0.4.1/spykeviewer/plugins/0000755000175000017500000000000012262550403016254 5ustar robrobspykeviewer-0.4.1/spykeviewer/plugins/Spike Trains/0000755000175000017500000000000012262550403020550 5ustar robrobspykeviewer-0.4.1/spykeviewer/plugins/Spike Trains/correlogram.py0000644000175000017500000000247312262550403023444 0ustar robrobimport quantities as pq import neo from spykeutils.plugin import analysis_plugin, gui_data from spykeutils import plot class CorrelogramPlugin(analysis_plugin.AnalysisPlugin): bin_size = gui_data.FloatItem('Bin size', 1.0, 0.001, 10000.0, unit='ms') cut_off = gui_data.FloatItem('Cut off', 50.0, 2.0, 10000.0, unit='ms') data_source = gui_data.ChoiceItem('Data source', ('Units', 'Selections')) count_per = gui_data.ChoiceItem('Counts per', ('Second', 'Segment')) border_correction = gui_data.BoolItem('Border correction', default=True) square = gui_data.BoolItem('Include mirrored plots') def get_name(self): return 'Correlogram' def start(self, current, selections): current.progress.begin('Creating correlogram') if self.data_source == 0: d = current.spike_trains_by_unit() else: # Prepare dictionary for cross_correlogram(): # One entry of spike trains for each selection d = {} for s in selections: d[neo.Unit(s.name)] = s.spike_trains() plot.cross_correlogram( d, self.bin_size * pq.ms, self.cut_off * pq.ms, border_correction=self.border_correction, per_second=self.count_per == 0, square=self.square, progress=current.progress) spykeviewer-0.4.1/spykeviewer/plugins/Spike Trains/sde.py0000644000175000017500000000747112262550403021706 0ustar robrobimport quantities as pq import neo from PyQt4.Qt import QMessageBox from spykeutils.plugin import analysis_plugin, gui_data from spykeutils import plot # Needed for activatable parameters stop_prop = gui_data.ValueProp(False) align_prop = gui_data.ValueProp(False) optimize_prop = gui_data.ValueProp(False) class SDEPlugin(analysis_plugin.AnalysisPlugin): # Configurable parameters kernel_size = gui_data.FloatItem('Kernel size', min=1.0, default=300.0, unit='ms') start_time = gui_data.FloatItem('Start time', default=0.0, unit='ms') stop_enabled = gui_data.BoolItem('Stop time enabled', default=False).set_prop('display', store=stop_prop) stop = gui_data.FloatItem('Time', default=10001.0, unit='ms').set_prop('display', active=stop_prop) align_enabled = gui_data.BoolItem('Alignment event enabled', default=False).set_prop('display', store=align_prop) align = gui_data.StringItem( 'Event label').set_prop('display', active=align_prop) data_source = gui_data.ChoiceItem('Data source', ('Units', 'Selections')) _g = gui_data.BeginGroup('Kernel width optimization') optimize_enabled = gui_data.BoolItem('Enabled', default=False).set_prop('display', store=optimize_prop) minimum_kernel = gui_data.FloatItem('Minimum kernel size', default=10.0, unit='ms', min=0.5).set_prop('display', active=optimize_prop) maximum_kernel = gui_data.FloatItem('Maximum kernel size', default=1000.0, unit='ms', min=1.0).set_prop('display', active=optimize_prop) optimize_steps = gui_data.IntItem('Kernel size steps', default=30, min=2).set_prop('display', active=optimize_prop) _g_ = gui_data.EndGroup('Kernel size optimization') def __init__(self): super(SDEPlugin, self).__init__() self.unit = pq.ms def get_name(self): return 'Spike Density Estimation' def start(self, current, selections): current.progress.begin('Creating spike density estimation') # Prepare quantities start = float(self.start_time) * self.unit stop = None if self.stop_enabled: stop = float(self.stop) * self.unit kernel_size = float(self.kernel_size) * self.unit optimize_steps = 0 if self.optimize_enabled: optimize_steps = self.optimize_steps minimum_kernel = self.minimum_kernel * self.unit maximum_kernel = self.maximum_kernel * self.unit # Load data events = None if self.data_source == 0: trains = current.spike_trains_by_unit() if self.align_enabled: events = current.labeled_events(self.align) else: # Prepare dictionaries for psth(): # One entry of spike trains for each selection, # an event for each segment occuring in any selection trains = {} if self.align_enabled: events = {} for s in selections: trains[neo.Unit(s.name)] = s.spike_trains() if self.align_enabled: events.update(s.labeled_events(self.align)) if events: for s in events: # Align on first event in each segment events[s] = events[s][0] plot.sde( trains, events, start, stop, kernel_size, optimize_steps, minimum_kernel, maximum_kernel, None, self.unit, current.progress) def configure(self): super(SDEPlugin, self).configure() while self.optimize_enabled and \ self.maximum_kernel <= self.minimum_kernel: QMessageBox.warning( None, 'Unable to set parameters', 'Maximum kernel size needs to be larger than ' 'minimum kernel size!') super(SDEPlugin, self).configure()spykeviewer-0.4.1/spykeviewer/plugins/Spike Trains/interspike_intervals.py0000644000175000017500000000221112262550403025362 0ustar robrobimport quantities as pq import neo from spykeutils.plugin import analysis_plugin, gui_data from spykeutils import plot class ISIPlugin(analysis_plugin.AnalysisPlugin): bin_size = gui_data.FloatItem('Bin size', 1.0, 0.1, 10000.0, unit='ms') cut_off = gui_data.FloatItem('Cut off', 50.0, 2.0, 10000.0, unit='ms') diagram_type = gui_data.ChoiceItem('Type', ('Bar', 'Line')) data_source = gui_data.ChoiceItem('Data source', ('Units', 'Selections')) def get_name(self): return 'Interspike Interval Histogram' def start(self, current, selections): current.progress.begin('Creating Interspike Interval Histogram') if self.data_source == 0: d = current.spike_trains_by_unit() else: # Prepare dictionary for isi(): # One entry of spike trains for each selection d = {} for s in selections: d[neo.Unit(s.name)] = s.spike_trains() current.progress.done() plot.isi( d, self.bin_size * pq.ms, self.cut_off * pq.ms, self.diagram_type == 0, time_unit=pq.ms) spykeviewer-0.4.1/spykeviewer/plugins/Spike Trains/psth.py0000644000175000017500000000474012262550403022105 0ustar robrobimport quantities as pq import neo from spykeutils.plugin import analysis_plugin, gui_data from spykeutils import plot # Needed for activatable parameters stop_prop = gui_data.ValueProp(False) align_prop = gui_data.ValueProp(False) optimize_prop = gui_data.ValueProp(False) class PSTHPlugin(analysis_plugin.AnalysisPlugin): # Configurable parameters bin_size = gui_data.FloatItem('Bin size', min=1.0, default=500.0, unit='ms') start_time = gui_data.FloatItem('Start time', default=0.0, unit='ms') stop_enabled = gui_data.BoolItem('Stop time enabled', default=False).set_prop('display', store=stop_prop) stop = gui_data.FloatItem('Time', default=10001.0, unit='ms').set_prop('display', active=stop_prop) align_enabled = gui_data.BoolItem('Alignment event enabled', default=False).set_prop('display', store=align_prop) align = gui_data.StringItem( 'Event label').set_prop('display', active=align_prop) diagram_type = gui_data.ChoiceItem('Type', ('Bar', 'Line')) data_source = gui_data.ChoiceItem('Data source', ('Units', 'Selections')) def get_name(self): return 'Peristimulus Time Histogram' def start(self, current, selections): # Prepare quantities start = float(self.start_time) * pq.ms stop = None if self.stop_enabled: stop = float(self.stop) * pq.ms bin_size = float(self.bin_size) * pq.ms # Load data current.progress.begin('Creating PSTH') events = None if self.data_source == 0: trains = current.spike_trains_by_unit() if self.align_enabled: events = current.labeled_events(self.align) else: # Prepare dictionaries for psth(): # One entry of spike trains for each selection, # an event for each segment occuring in any selection trains = {} if self.align_enabled: events = {} for s in selections: trains[neo.Unit(s.name)] = s.spike_trains() if self.align_enabled: events.update(s.labeled_events(self.align)) if events: for s in events: # Align on first event in each segment events[s] = events[s][0] plot.psth( trains, events, start, stop, bin_size, rate_correction=True, time_unit=pq.ms, bar_plot=self.diagram_type == 0, progress=current.progress)spykeviewer-0.4.1/spykeviewer/plugins/Spike Trains/raster_plot.py0000644000175000017500000000342112262550403023460 0ustar robrobimport quantities as pq from spykeutils.plugin import analysis_plugin, gui_data from spykeutils import plot class RasterPlotPlugin(analysis_plugin.AnalysisPlugin): domain = gui_data.ChoiceItem('Domain', ('Units', 'Segments')) show_lines = gui_data.BoolItem('Show lines', default=True) show_events = gui_data.BoolItem('Show events', default=True) show_epochs = gui_data.BoolItem('Show epochs', default=True) def get_name(self): return 'Raster Plot' def start(self, current, selections): current.progress.begin('Creating raster plot') if self.domain == 0: # Units d = current.spike_trains_by_unit() else: # Segments d = current.spike_trains_by_segment() # Only show first spike train for each index for k in d.keys(): if d[k]: d[k] = d[k][0] else: d.pop(k) events = None if self.show_events: if self.domain == 0: # Only events for displayed segment ev = current.events() if ev: events = ev.values()[0] else: # Events for all segments events = [e for seg_events in current.events().values() for e in seg_events] epochs = None if self.show_epochs: if self.domain == 0: # Only epochs for displayed segment ep = current.epochs() if ep: epochs = ep.values()[0] else: # Epochs for all segments epochs = [e for seg_epochs in current.epochs().values() for e in seg_epochs] current.progress.done() plot.raster(d, pq.ms, self.show_lines, events, epochs)spykeviewer-0.4.1/spykeviewer/plugins/Raw Data/0000755000175000017500000000000012262550403017637 5ustar robrobspykeviewer-0.4.1/spykeviewer/plugins/Raw Data/spikes.py0000644000175000017500000001007712262550403021514 0ustar robrobfrom spykeutils.plugin import analysis_plugin, gui_data from spykeutils import plot from spykeutils.tools import extract_spikes import spykeutils.conversions as convert import quantities as pq extract_prop = gui_data.ValueProp(False) class SpikePlotPlugin(analysis_plugin.AnalysisPlugin): anti_aliased = gui_data.BoolItem('Antialiased lines (slow for ' 'large amounts of spikes)', default=True) _g = gui_data.BeginGroup('Include spikes from') spike_mode = gui_data.ChoiceItem('Spikes', ('Do not include', 'Regular', 'Emphasized'), default=1) inc_spikes = gui_data.BoolItem('Spike Trains') inc_extracted = gui_data.BoolItem( 'Extracted from signal').set_prop('display', store=extract_prop) length = gui_data.FloatItem( 'Spike length', unit='ms', default=1.0).set_prop( 'display', active=extract_prop) align = gui_data.FloatItem( 'Alignment offset', unit='ms', default=0.5).set_prop( 'display', active=extract_prop) _g_ = gui_data.EndGroup('Include spikes from') plot_type = gui_data.ChoiceItem('Plot type', ('One plot per channel', 'One plot per unit', 'Single plot')) split_type = gui_data.ChoiceItem('Split channels', ('Vertically', 'Horizontally')) layout = gui_data.ChoiceItem('Subplot layout', ('Linear', 'Square')) fade = gui_data.BoolItem('Fade earlier spikes') def get_name(self): return 'Spike Waveform Plot' def start(self, current, selections): current.progress.begin('Creating spike waveform plot') current.progress.set_status('Loading spikes') spikes = {} strong = {} if self.spike_mode == 1: spikes = current.spikes_by_unit() elif self.spike_mode == 2: strong = current.spikes_by_unit() spike_trains = None if self.inc_spikes: current.progress.set_status('Loading spike trains') spike_trains = current.spike_trains_by_unit_and_segment() for u, trains in spike_trains.iteritems(): s = [] for st in trains.values(): if st.waveforms is not None: s.extend(convert.spike_train_to_spikes(st)) if not s: continue spikes.setdefault(u, []).extend(s) if self.inc_extracted: current.progress.set_status('Extracting spikes from signals') signals = current.analog_signals_by_segment_and_channel( conversion_mode=3) if spike_trains is None: spike_trains = current.spike_trains_by_unit_and_segment() for u, trains in spike_trains.iteritems(): s = [] rcg = u.recordingchannelgroup for seg, train in trains.iteritems(): if seg not in signals: continue train_sigs = [] for rc in signals[seg]: if rcg in rc.recordingchannelgroups: train_sigs.append(signals[seg][rc]) if not train_sigs: continue s.extend(extract_spikes( train, train_sigs, self.length * pq.ms, self.align * pq.ms)) if not s: continue spikes.setdefault(u, []).extend(s) fade = 0.2 if self.fade else 1.0 plot.spikes(spikes, self.plot_type * 2 + self.split_type + 1, strong, anti_alias=self.anti_aliased, fade=fade, subplot_layout=self.layout, progress=current.progress)spykeviewer-0.4.1/spykeviewer/plugins/Raw Data/spectogram.py0000644000175000017500000000712312262550403022360 0ustar robrobfrom spykeutils.plugin import analysis_plugin, gui_data import scipy as sp import matplotlib.mlab as mlab from guiqwt.plot import BaseImageWidget from guiqwt.builder import make from spykeutils.plot.dialog import PlotDialog import spykeutils.plot.helper as helper from spykeutils import SpykeException import quantities as pq class SpectrogramPlugin(analysis_plugin.AnalysisPlugin): nfft_index = (32, 64, 128, 256, 512, 1024, 2048, 4096, 8192) nfft_names = (str(s) for s in nfft_index) interpolate = gui_data.BoolItem('Interpolate', default=True) show_color_bar = gui_data.BoolItem('Show color bar', default=False) fft_samples = gui_data.ChoiceItem('FFT samples', nfft_names, default=3) which_signals = gui_data.ChoiceItem('Included signals', ('AnalogSignal', 'AnalogSignalArray', 'Both'), default=2) def get_name(self): return 'Signal Spectogram' @helper.needs_qt def start(self, current, selections): current.progress.begin('Creating Spectogram') signals = current.analog_signals(self.which_signals + 1) if not signals: current.progress.done() raise SpykeException('No signals selected!') num_signals = len(signals) columns = int(round(sp.sqrt(num_signals))) current.progress.set_ticks(num_signals) samples = self.nfft_index[self.fft_samples] win = PlotDialog(toolbar=True, wintitle="Signal Spectogram (FFT window size %d)" % samples) for c in xrange(num_signals): pW = BaseImageWidget(win, yreverse=False, lock_aspect_ratio=False) plot = pW.plot s = signals[c] # Calculate spectrogram and create plot v = mlab.specgram(s, NFFT=samples, noverlap=samples/2, Fs=s.sampling_rate.rescale(pq.Hz)) interpolation = 'nearest' if self.interpolate: interpolation = 'linear' img = make.image(sp.log(v[0]), ydata=[v[1][0],v[1][-1]], xdata=[v[2][0] + s.t_start.rescale(pq.s), v[2][-1] + s.t_start.rescale(pq.s)], interpolation=interpolation) plot.add_item(img) # Labels etc. if not self.show_color_bar: plot.disable_unused_axes() title = '' if s.recordingchannel and s.recordingchannel.name: title = s.recordingchannel.name if s.segment and s.segment.name: if title: title += ' , ' title += s.segment.name plot.set_title(title) plot.set_axis_title(plot.Y_LEFT, 'Frequency') plot.set_axis_unit(plot.Y_LEFT, s.sampling_rate.dimensionality.string) plot.set_axis_title(plot.X_BOTTOM, 'Time') time_unit = (1 / s.sampling_rate).simplified plot.set_axis_unit(plot.X_BOTTOM, time_unit.dimensionality.string) win.add_plot_widget(pW, c, column=c%columns) current.progress.step() current.progress.done() win.add_custom_image_tools() win.add_x_synchronization_option(True, range(num_signals)) win.add_y_synchronization_option(True, range(num_signals)) win.show() spykeviewer-0.4.1/spykeviewer/plugins/Raw Data/signal.py0000644000175000017500000001063412262550403021472 0ustar robrobfrom spykeutils.plugin import analysis_plugin, gui_data from spykeutils import SpykeException from spykeutils import plot from copy import copy spike_prop = gui_data.ValueProp(False) subplot_prop = gui_data.ValueProp(False) class SignalPlotPlugin(analysis_plugin.AnalysisPlugin): subplots = gui_data.BoolItem('Use subplots', default=True).set_prop( 'display', store=subplot_prop) subplot_titles = gui_data.BoolItem( 'Show subplot names', default=True).set_prop('display', active=subplot_prop) which_signals = gui_data.ChoiceItem('Included signals', ('AnalogSignal', 'AnalogSignalArray', 'Both'), default=2) show_events = gui_data.BoolItem('Show events', default=True) show_epochs = gui_data.BoolItem('Show epochs', default=True) multiple_plots = gui_data.BoolItem('One plot per segment', default=False) _g = gui_data.BeginGroup('Spikes') show_spikes = gui_data.BoolItem( 'Show spikes').set_prop('display', store=spike_prop) spike_form = gui_data.ChoiceItem('Display as', ('Waveforms', 'Lines')).set_prop('display', active=spike_prop) spike_mode = gui_data.ChoiceItem('Included data', ('Spikes', 'Spike Trains', 'Both'), default=2).set_prop('display', active=spike_prop) template_mode = gui_data.BoolItem( 'Use first spike as template').set_prop('display', active=spike_prop) _g_ = gui_data.EndGroup('Spikes') def get_name(self): return 'Signal Plot' def start(self, current, selections): current.progress.begin('Creating signal plot') signals = current.analog_signals_by_segment(self.which_signals + 1) if not signals: raise SpykeException('No signals selected!') # Load supplemental data events = None if self.show_events: current.progress.set_status('Loading events') events = current.events() epochs = None if self.show_epochs: current.progress.set_status('Loading epochs') epochs = current.epochs() spike_trains = None if self.show_spikes and self.spike_mode > 0: current.progress.set_status('Loading spike trains') spike_trains = current.spike_trains_by_segment() spikes = None if self.show_spikes and self.spike_mode != 1: current.progress.set_status('Loading spikes') spikes = current.spikes_by_segment() # Create plot segments = set(signals.keys()) for seg in segments: current.progress.begin('Creating signal plot...') current.progress.set_status('Constructing plot') seg_events = None if events and events.has_key(seg): seg_events = events[seg] seg_epochs = None if epochs and epochs.has_key(seg): seg_epochs = epochs[seg] seg_trains = [] if spike_trains and spike_trains.has_key(seg): seg_trains = spike_trains[seg] seg_spikes = [] if spikes and spikes.has_key(seg): seg_spikes = spikes[seg] # Prepare template spikes if self.spike_form == 0 and self.template_mode: template_spikes = {} for s in seg_spikes[:]: if s.unit not in template_spikes: template_spikes[s.unit] = s for ts in template_spikes.itervalues(): seg_spikes.remove(ts) for st in seg_trains[:]: if st.unit not in template_spikes: continue for t in st: s = copy(template_spikes[st.unit]) s.time = t seg_spikes.append(s) seg_trains.remove(st) plot.signals(signals[seg], events=seg_events, epochs=seg_epochs, spike_trains=seg_trains, spikes=seg_spikes, use_subplots=self.subplots, show_waveforms=(self.spike_form==0), subplot_names=self.subplot_titles, progress=current.progress) if not self.multiple_plots: break spykeviewer-0.4.1/CHANGELOG.rst0000644000175000017500000000621512262550403014243 0ustar robrobVersion 0.4.1 ------------- * IPython 1.0 supported * IPython now supported as dock instead of external console * More explicit error messages on file loading failures. * Added "Start plugin remotely" to toolbar. Version 0.4.0 ------------- * Optional transparent lazy loading and lazy cascading for supported IOs. * Splash screen while loading the application. * Open files dialog as an alternative to the "Files" dock. * Remotely started plugins can have a graphical progress bar. * Remotely started plugins now show text output and errors on internal console. * Filters are automatically deactivated on loading a selection if they prevent parts of it to be shown. * A modified plugin is automatically saved before it is sent to a remote script. * New features for many plugins: correlogram, interspike interval histogram, peri stimulus time histogram, and spike density estimation support selections in addition to units for plot elements. Spike waveform plot can plot single spikes extracted from analog signals using spike trains, optionally together with Spike object waveforms. * Python files can be dragged onto the editor to open them. * Annotation editor accessible through API. * Files can be loaded through API. * The Spyke Repository is available and linked in the documentation and the help menu. Version 0.3.0 ------------- * Added search and replace functionality to plugin editor (access with ``Ctrl`` + ``F`` and ``Ctrl`` + ``H``). * Added startup script. Can be modified using File->Edit startup script. * Spyke Viewer now has an API for configuration options and access to plugins and the main window. It can be used from the console, plugins or the startup script. * Added context menu for navigation. Includes entries for removing objects and an annotation editor. * New files are selected in the file view are now loaded in addition to already loaded files. To unload all data, use File->Clear Data. * Plugin configurations are now restored when saving or refreshing plugins and when restarting the program. All plugin configurations can be reset to their defaults using Plugins->Restore Plugin configurations. * A modified plugin is automatically saved before it is run. * Plugin folders return to their previous state (expanded or minimized) when restarting the program. * Plugin editor tabs can be reordered by dragging. * Code completion in console can be selected using Enter (in addition to Tab as before). * Plugins can import modules from the same directory, even if it is not explicitly on the Python path. Version 0.2.1 ------------- * New features for plugin editor: Calltips, autocompletion and "jump to" (definitions in code or errors displayed in integrated console). * Experimental support for IPython console (File->New IPython console). Needs IPython >= 0.12 * New spectrogram plugin * Combined filters for filtering (or sorting) a whole list of objects * "Save all data..." menu option * Plugins are sorted alphabetically * New option in plugin menu: Open containing folder * "Delete" key deletes filters * Renamed start script from "spyke-viewer" to "spykeviewer" Version 0.2.0 ------------- Initial documented public release. spykeviewer-0.4.1/README.rst0000644000175000017500000000115712262550403013711 0ustar robrobOverview ======== .. image:: https://secure.travis-ci.org/rproepp/spykeviewer.png?branch=develop :target: https://travis-ci.org/rproepp/spykeviewer Spyke Viewer is a multi-platform GUI application for navigating, analyzing and visualizing electrophysiological datasets. Based on the `Neo `_ framework, it works with a wide variety of data formats. For more information, see the documentation at http://spyke-viewer.readthedocs.org Spyke Viewer was created by Robert Pröpper at the Neural Information Processing Group (TU Berlin), supported by the Research Training Group GRK 1589/1.spykeviewer-0.4.1/LICENSE0000644000175000017500000000273512262550403013232 0ustar robrobCopyright (c) 2012, Robert Pröpper and conbtributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the author nor the names of the contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.spykeviewer-0.4.1/doc/0000755000175000017500000000000012262550403012763 5ustar robrobspykeviewer-0.4.1/doc/source/0000755000175000017500000000000012262550403014263 5ustar robrobspykeviewer-0.4.1/doc/source/lazy.rst0000644000175000017500000000600512262550403015775 0ustar robrob.. _lazy: Lazy Features ------------- Spyke Viewer offers two ways to deal with very large files. Lazy Loading ############ With lazy loading, only the structure of a file is loaded when you first open it, while big data chunks (e.g. signals, spike trains) are not. This can result in faster loading times and much reduced memory usage and enables you to use data files that are larger than your main memory. Spyke Viewer will load the required data automatically once it is needed. This means that while initial loading is faster, data access will be slower. You can switch between regular and lazy loading from the "File" menu under "Read Mode". The read mode affects newly loaded files and you can have both regularly and lazily loaded files opened at the same time. Most Neo IOs do not support this feature (currently, only the IO for HDF5 files does) - when using lazy mode with an unsopported IO, the file is loaded as in regular mode. There are two options for lazy loading in the menu: "Lazy Load" and "Cached Lazy Load". In "Lazy Load", data objects are loaded on request and discarded afterwards, so the memory usage stays low. In "Cached Lazy Load", data objects are inserted into the object hierarchy when they are requested, so they only have to be loaded once, but memory usage will grow when more data objects are used while the file is open. .. Note:: If you create your own plugins or use the integrated console with lazy loading, you need to be aware that the data objects are only loaded when accessed through a DataProvider object (explained below). For example, ``current.spike_trains()`` would return correctly loaded objects. But ``current.segments()[0].spiketrains`` can contain lazy objects. To be safe, always use the DataProvider to access the data objects you are interested in. Lazy Cascading ############## Lazy cascading goes one step further than lazy loading: Not even the complete structure of a file is loaded initially. When lazy cascading is active, each object is automatically loaded when first accessed. For example, if you load a file with multiple Blocks, the Segments of each Block are only loaded when you select the Block in Spyke Viewer and the Segments need to be displayed. Similarly, the spike trains of a segment are only loaded once they are accessed. In contrast to lazy loading, with lazy cascading objects are loaded automatically even if they are not accessed through a DataProvider. Once an object has been accessed using lazy cascading, it stays in memory, making future access faster but potentially filling up main memory. You can use lazy cascading and lazy loading without caching at the same time to mitigate this. You switch between regular and lazy cascading using "Cascade Mode" in the "File" menu. Like lazy loading, lazy cascading depends on support of the IO class and currently only works with the HDF5 IO. You can implement both in your own IO plugins, the `Neo documentation `_ describes what is needed.spykeviewer-0.4.1/doc/source/requirements.txt0000644000175000017500000000001712262550403017545 0ustar robrobmock quantitiesspykeviewer-0.4.1/doc/source/plugins.rst0000644000175000017500000002621312262550403016502 0ustar robrob.. _plugins: Plugins ======= This section describes the configuration options of the plugins that are included with Spyke Viewer. All included plugins create plots. For information on how to create your own plugins, see :ref:`analysisplugins`. You can find additional plugins at the `Spyke Repository `_. Signal Plot ----------- Shows the selected analog signals. A number of options enable to include additional information in the plot. .. image:: /img/plugin-signals.png Use Subplots Determines whether multiple subplots are used or all signals are shown in one large plot. Show subplot names Only valid when subplots are used. Determines if each subplot has a title with the signal name (if available) or the recording channel name. Included signals This option can be used to tune which type of signals are shown: AnalogSignal objects, AnalogSignalArray objects or both. In most cases, a file will only include one of the signal types, so the default option of including both will work well (you probably never need to change it if you do not know the difference between the signal objects). Show events When this is checked, events in the selected trial will be shown in the plot. Show epochs When this is checked, periods in the selected trial will be shown in the plot. One plot per segment When this is not checked, only one plot with signals from the first selected segment is created. Otherwise, one plot for each selected segment is created. Show spikes Determines whether spikes are included in the plot. The following options are used to select from what data how the spikes are displayed: Display as Spikes can be shown as their waveform overlaid on the analog signal or a vertical line marking their occurrence. Included data Determines whether to include spikes from SpikeTrain objects, Spike objects, or both. Use first spike as template This option can be used for a special case: All spikes in the SpikeTrain objects have the same waveform (e.g. because they use the same template from spike sorting). If this option is checked, the plugin assumes that each unit has a SpikeTrain and a single Spike. The waveform from the Spike object is used for every spike in the SpikeTrain. The data in the example file is structured in this way. Spectrogram ----------- Shows spectrograms of the selected analog signals. .. image:: /img/plugin-spectrogram.png Interpolate Determines whether the dipslayed spectrogram is interpolated. Show color bar If this is checked, a colorbar will be shown with each plot, illustrating the logarithmic power represented by the colors. FFT samples The number of signal samples used in each FFT window. Included signals This option can be used to tune which type of signals are shown: AnalogSignal objects, AnalogSignalArray objects or both. In most cases, a file will only include one of the signal types, so the default option of including both will work well (you probably never need to change it if you do not know the difference between the signal objects). Spike Waveform Plot ------------------- Shows waveforms of selected spikes. .. image:: /img/plugin-waveforms.png Antialiased lines Determines if antialiasing (smoothing) is used for the plot. If you want to display thousands of spikes or more, unchecking this option will improve the plotting performance considerably. Include spikes from Determines which data sources are used for the displayed spike waveforms. Spikes Waveforms from Spike objects can be ignored (Do not include), used as other spike data sources are (Regular) or drawn thicker on top of other spikes (Emphasized). The last option is useful if spike objects contain templates from spike sorting which you want to compare to corresponding spikes from the data. Spike Trains Spike waveforms embedded in SpikeTrain objects. Extracted from signal Spike waveforms can be automatically extracted from corresponding signals using spike times in SpikeTrain objects. In this case you have to choose the spike length and the alignment offset (the length of the signal to extract before each spike event). Plot type Three different plot types can be selected: "One plot per channel" creates a subplot for each channel, "One plot per unit" creates a subplot for each unit and "Single plot" creates one plot containing all channels and units. Split channels Multichannel waveforms can be split either horizontally or vertically. Subplot layout You can choose one of two ways to arrange the resulting subplot: "Linear" will arrange the plots as one row or one column, depending on the other options. "Square" uses an equal number of row and columns. Fade earlier spikes If this is enabled, earlier selected spikes for each unit are drawn more transparent than later spikes. This can be useful if you want to compare changes in a unit's waveform over time (i.e. multiple segments). Correlogram ----------- Creates auto- and crosscorrelograms for selected spike trains. .. image:: /img/plugin-correlogram.png Bin size (ms) The bin size used in the calculation of the correlograms. Cut off (ms) The maximum time lag for which the correlogram will be calculated and displayed. Data source The plugin supports two ways of organizing the data from which the correlograms are created: If "Units" is selected, the spike trains for each currently selected unit are treated as a dataset. For example, if two units are selected, the plugin creates three subplots: one autocorrelogram for each unit and a cross-correlogram between them. If "Selections" is chosen, spike trains from each saved selection are treated as a dataset. Note that the plot can only be created if all selections contain the same number of spike trains. Counts per Determines if the counts are displayed per second or per segment. Border correction Determines if an automatic correction for less data at higher timelags is applied. Include mirrored plots Determines if all cross-correlograms are included, even if they are just mirrored versions of each other. The autocorrelograms are then displayed as the diagonal of a square plot matrix. Otherwise, mirrored cross-correlograms are omitted. Interspike Interval Histogram ----------------------------- Creates an interspike interval histogram for one or more units. .. image:: /img/plugin-isi.png Bin size (ms) The bin size used in the calculation of the histogram. Cut off (ms) The maximum interspike interval that is displayed. Type Determines the type of histogram. If "Bar" is selected, only the histogram for the first selected unit is displayed. If "Line" is selected, all selected units are included in the plot. Data source The plugin supports two ways of organizing the data from which the histograms are created: If "Units" is selected, the spike trains for each currently selected unit are treated as a dataset. If "Selections" is chosen, spike trains from each saved selection are treated as a dataset. Peristimulus Time Histogram --------------------------- Creates a peristimulus time histogram (PSTH) for one or multiple units. .. image:: /img/plugin-psth.png Bin size (ms) The bin size used in the calculation of the histogram. Start time (ms) An offset from the alignment event or start of the spike train. Calculation of the PSTH begins at this offset. Negative values are allowed (this can be useful when using an alignment event). Stop time A fixed stop time for calculation of the PSTH. If this is not activated, the smallest stop time of all included spike trains is used. If the smallest stop time is smaller than the value entered here, it will be used instead. Alignment event An event (identified by label) on which all spike trains are aligned before the PSTH is calculated. After alignment, the event is a time 0 in the plot. The event has to be present in all selected segments that include spike trains for the PSTH. Type Determines the type of histogram. If "Bar" is selected, only the histogram for the first selected unit is displayed. If "Line" is selected, all selected units are included in the plot. Data source The plugin supports two ways of organizing the data from which the histograms are created: If "Units" is selected, the spike trains for each currently selected unit are treated as a dataset. If "Selections" is chosen, spike trains from each saved selection are treated as a dataset. Raster Plot ----------- Creates a raster plot from multiple spiketrains. .. image:: /img/plugin-rasterplot.png Domain The raster plot can either be created from multiple units and one segment ("Units") or one unit over multiple segments ("Segments"). Show lines Determines if a small horizontal black line is displayed for each spike train. Show events When this is checked, events in the selected trial will be shown in the plot. If the selected domain is "Segments", events from all selected segments are included. Show epochs When this is checked, periods in the selected trial will be shown in the plot. If the selected domain is "Segments", epochs from all selected segments are included. Spike Density Estimation ------------------------ Creates a spike density estimation (SDE) for one or multiple units. Optionally computes the best kernel width for each unit. .. image:: /img/plugin-sde.png Kernel size (ms) The width of the kernel used for the plot. If kernel width optimization is enabled, this parameter is not used. Start time (ms) An offset from the alignment event or start of the spike train. Calculation of the SDE begins at this offset. Negative values are allowed (this can be useful when using an alignment event). Stop time A fixed stop time for calculation of the SDE. If this is not activated, the smallest stop time of all included spike trains is used. If the smallest stop time is smaller than the value entered here, it will be used instead. Alignment event An event (identified by label) on which all spike trains are aligned before the SDE is calculated. After alignment, the event is a time 0 in the plot. The event has to be present in all selected segments that include spike trains for the SDE. Data source The plugin supports two ways of organizing the data from which the density estimations are created: If "Units" is selected, the spike trains for each currently selected unit are treated as a dataset. If "Selections" is chosen, spike trains from each saved selection are treated as a dataset. Kernel width optimization When this option is enabled, the best kernel width for each unit is determined using the algorithm from [1]_. Minimum kernel size (ms) The minimum kernel width that the algorithm should try. Maximum kernel size (ms) The maximum kernel width that the algorithm should try. Kernel size steps The number of steps from minimum to maximum kernel size that the algorithm should try. The steps are distributed equidistant on a logarithmic scale. .. [1] Shimazaki, Shinomoto. (2010). Kernel bandwidth optimization in spike rate estimation. *Journal of Computational Neuroscience*, 29, 171-182.spykeviewer-0.4.1/doc/source/changelog.rst0000644000175000017500000000022712262550403016745 0ustar robrobChangelog ========= Also see the spykeutils changelog at https://spykeutils.readthedocs.org/en/latest/changelog.html .. include:: ../../CHANGELOG.rstspykeviewer-0.4.1/doc/source/installation.rst0000644000175000017500000001165412262550403017525 0ustar robrobInstallation ============ There are two ways to install Spyke Viewer on your system. The preferred way is to install the spykeviewer package in your Python environment. Depending on what already exists on your system, this might require installing Python itself and a few additional packages for scientific data processing, management and visualization. On the other hand, there are also binary packages available for Windows and OS X. These packages do not have any additional requirements and can be started immediately (from an app in OS X or an executable file in Windows, please use the source installation for Linux). However, as they are independent of an existing Python installation, you will not be able to use installed additional packages from your Python environment by default (this can be remedied by using the :ref:`startup`). The binary packages are especially useful if you do not normally use Python or just want to try Spyke Viewer quickly. You can switch to the source installation at any time. Binary ------ If you want to install the binary version, go to the `homepage `_ and select the most recent version for your operating system. The downloaded file contains an installer (for OS X) or executable (Spyke Viewer\\spykeviewer.exe for Windows). Note that some features of Spyke Viewer are not available in the binary version: If you want an IPython console or advanced plugin editing features such as autocompletion, you need the source version. The rest of this page deals with source installation, when using the binary version, you can go to :ref:`usage` to learn how to use Spyke Viewer. Source ------ If you use the NeuroDebian_ repositories and a recent version of Debian (>= Wheezy or Sid) or Ubuntu (>= 12.04), you can install the source version of Spyke Viewer using your package manager:: $ sudo apt-get install spykeviewer After you install the spykeviewer package, you can start Spyke Viewer from your menu (it should appear in the "Science" or "Education" category) or using:: $ spykeviewer The next sections describe how to install Spyke Viewer if you do not have access to the NeuroDebian_ repositories (e.g. on Windows or OS X), want to install using the Python packaging system or use the most recent development version from GitHub. Dependencies ############ First you need Python 2.7. In addition, the following packages and their respective dependencies need to be installed: * spykeutils_ * scipy_ * guiqwt_ (>= 2.1.4) * matplotlib_ * tables_ * spyder_ >= 2.1.0 * neo_ >= 0.2.1 Please see the respective websites for instructions on how to install them if they are not present on your computer. On a recent version of Debian/Ubuntu (e.g. Ubuntu 12.04 or newer), you can install all dependencies that are not automatically installed by ``pip`` or ``easy_install`` with:: $ sudo apt-get install python-guiqwt python-tables python-matplotlib On Windows, you can use `Python(x,y)`_ if you do yet not have a Python distribution installed. It includes the same dependencies. spykeviewer ########### Once the requirements are fulfilled, you need to install the package spykeviewer. If you use Linux, you might not have access rights to your Python package installation directory, depending on your configuration. In this case, you will have to execute all shell commands in this section with administrator privileges, e.g. by using ``sudo``. The easiest way to get it is from the Python Package Index. If you have pip_ installed:: $ pip install spykeviewer Alternatively, if you have setuptools_:: $ easy_install spykeviewer Alternatively, you can get the latest version directly from GitHub at https://github.com/rproepp/spykeviewer. The master branch always contains the current stable version. If you want the latest development version, use the develop branch (selected by default). You can download the repository from the GitHub page or clone it using git and then install from the resulting folder:: $ python setup.py install Once the package is installed, you can start Spyke Viewer using:: $ spykeviewer .. note:: You can also start the program without installing it: Simply execute the script ``bin/spykeviewer`` in your Spyke Viewer folder using Python. On Windows, you might have to start ``spykeviewer.exe`` in the ``Scripts`` folder in your Python directroy (e.g. ``C:\Python27\Scripts``) because most Python versions do not add this folder to the PATH environment variable. .. _`Python`: http://python.org/ .. _`spykeutils`: http://spykeutils.readthedocs.org/ .. _`guiqwt`: http://packages.python.org/guiqwt/ .. _`tables`: http://www.pytables.org/ .. _`neo`: http://neo.readthedocs.org/ .. _`pip`: http://pypi.python.org/pypi/pip .. _`scipy`: http://scipy.org/ .. _`setuptools`: http://pypi.python.org/pypi/setuptools .. _`spyder`: http://packages.python.org/spyder/ .. _`Python(x,y)`: http://www.pythonxy.com/ .. _`matplotlib`: http://matplotlib.org/ .. _`NeuroDebian`: http://neuro.debian.net spykeviewer-0.4.1/doc/source/usage.rst0000644000175000017500000003766212262550403016137 0ustar robrob.. _usage: Usage ===== This section gives a tutorial of the main functionality of Spyke Viewer. To follow the examples, you need to download and unpack the `sample data file `_. It contains simulated data for two tetrodes over 4 trials. For each tetrode, there are 5 simulated neurons with corresponding spike trains and prototypical template waveforms included. When you start Spyke Viewer for the first time, you will see the following layout: .. image:: /img/initial-layout.png All elements of the user interface are contained in docks and can be rearranged to suit your needs. Their layout is saved when you close Spyke Viewer. The "View" menu shows all available docks and panels, you can also hide and show them from this menu. Loading Data ------------ The first thing you want to do when using Spyke Viewer is to load your data. The *Files* dock contains a view of all the files on your system. You can use it to select one or more files, then click on the "Load" button below to load the selected files into Spyke Viewer. Single files can also be loaded with a double click (this does not work for directories, they will just be expanded. If you want to load a directory, you need to use the "Load" button). Alternatively, you can use the "Load Data..." option in the "File" menu to open a dialog that allows you to select files to load. Now find and select the file "sample.h5" that you just unpacked (an HDF5 File) and load it. The data file input/output is based on :mod:`neo` and supports formats that have a `Neo IO class `_. For each selected file, the filetype and corresponding IO class is selected automatically from the file extension. If you want to specify which IO class to use, you can do so in the "Format" list in the *Files* dock. When you select a format with read or write parameters, you can click "Configure selected IO" to change the parameters. The IO and parameters you choose in the *Files* dock are also used when loading files using the "File" menu. If you want to use a file format that is not supported by Neo, you can write a plugin: :ref:`ioplugins`. Spyke Viewer and Neo include some features to handle very large data sources that are larger than the main memory or take very long to load. If you want to learn about these features, go to :doc:`lazy`. .. _selections: Selections ---------- Now that a file was loaded, some entries have appeared in the *Navigation* dock. To understand how to navigate data with Spyke Viewer, you need to know the Neo object model. The following picture is a complete representation: .. image:: /img/neo.png The rectangular objects are containers, rounded corners indicate a data object. The arrows represent a "contains zero or more" relationship. Note that all data objects belong to a segment and some also belong to other objects. For example, a SpikeTrain is referenced by both Segment and Unit. A unit often represents a single neuron (it is named unit because putative neurons from spike sorting are called units), but it could also represent the results of a spike detection algorithm and therefore include multiple neurons. Each SpikeTrain is specific to one Segment and one Unit, and each Segment or Unit could contain many SpikeTrains. For more detailed information on the Neo object model, see the `Neo documentation `_. In Spyke Viewer, you use the *Navigation* dock to select container objects. There is a list for each type of container where you can select an arbitrary set of entries. You can select multiple entries by clicking and dragging or using the control key when clicking. Each list will only show those objects of the respective type that are contained in selected objects further up in the hierarchy. For example, try selecting a different recording channel group and observe how the channels and units list change. To help you navigate, all objects in the *Navigation* dock are automatically assigned a unique identifier which includes the identifier of containing objects. The identifiers are shown in parentheses after the objects name (if an object has no name, only the identifier is shown). Blocks use capital letters; recording channel groups use small letters; recording channels, units and segments use numbers. For example, a unit might have an identifier "A-b-2": This denotes unit number 2 of recording channel group "b" of block "A". The identifiers are recreated whenever the structure of the loaded data changes - they are just a visual aid to help with navigation and ensure that unnamed objects have a reasonable label. Each list in the *Navigation* dock has a context menu accessed by right-clicking or control-clicking on OS X. You can use it to remove the selected objects (they will only be removed from Spyke Viewer, not from the loaded files) or open an annotation editor for the current object. The annotation editor can also be opened by double-clicking a list entry. The sets of selected objects from all container types is called a selection. The selected items you see in the *Navigation* dock are called the current selection. Selections determine which data will be analyzed by plugins (see :ref:`plugins`) and can be accessed by the internal console (see :ref:`console`). You can save a selection using the "Selections" menu: Click on the menu and then on "New". An additional entry in the "Selections" menu called "Selection 1" will appear. Each selection entry has a submenu where you can load, save, rename or delete the selection. Try selecting something else in the *Navigation* dock and creating a new selection again. Now try to load your first selection and observe how the *Navigation* dock changes to reflect what you have loaded. If you use the entry "Save" from a selection, it will be overwritten with the current selection. You can also change the order of the saved selections by dragging the entries in the "Selections" menu: .. image:: /img/selections-menu.png All saved selections together with the current selection are called a selection set. You can save your current selection set as a file (in `JSON `_ format, so it can easily be read and edited by humans or other software) using "Save Selection Set..." in the "File" menu. When you load a selection set, your current selection is replaced by the current selection from the file. The other selections in the file are added to your current saved selections. If a selection set includes files that are not currently loaded, they are opened automatically. When you exit Spyke Viewer, your current selection set is saved and will be restored on your next start. Exporting Data -------------- If you want to export your data, Spyke Viewer offers two entries in the "File" menu: "Save selected data..." exports all data in your current selection. "Save all data..." exports all loaded data. When you click on one of the items, a dialog will open asking you where you want to save the data and in which format. HDF5 and Matlab are available. It is strongly recommended to save your data in HDF5, since the Neo IO for Matlab currently does not support the whole object model -- RecordingChannelGroups, RecordingChannels and Units are not saved. Matlab has an interface for loading HDF5 files as well, so if you want to load your data in Matlab without losing some of the structure, you can use HDF5. On the other hand, if you want to get your data into Matlab quickly or it is structured with segments only, the Matlab export could be the right choice. Filters ------- .. image:: /img/filterdock.png When dealing with large datasets, it can be inconvenient to create a selection from the full lists of containers. The filter system provides a solution to this problem. By creating filters, you can determine what objects are shown in the *Navigation* dock. For example, you might want to temporarily exclude RecordingChannelGroups that have no attached units or only display Segments with a certain stimulus. Creating filters requires basic knowledge of Python and the Neo object model. You can manage your filters with the *Filter* dock and toolbar (which is positioned on the upper left in the initial layout). When you start Spyke Viewer for the first time, the *Filter* dock will be empty. You can create a new filter by clicking on "New Filter" in the toolbar (right-clicking the *Filter* dock also brings up a menu with available actions). You can choose what kind of container objects the filter applies to, the name of the filter and its content: a simple Python function. There are two kinds of filters: single or combined. Single filters (created when the "Combined" checkbox is unchecked) get a single Neo object and return ``True`` if the object should be displayed and ``False`` if not. Combined filters get a list of Neo objects and return a list containing only objects that should displayed. The order of the returned list is used for subsequent filters and displaying, so combined filters can also be used to sort the object lists. For both kinds of filters, the signature of the function is fixed and shown at the top of the window, so you only have to write the function body. The "True on exception" checkbox determines what happens when the filter function raises an exception: If it is checked, an exception will not cause an element to be filtered out, otherwise it will. The following picture shows how you would create a filter that hides all units that do not have at least two SpikeTrains attached: .. image:: /img/newfilter.png As another example, to reverse the order of Segments, you could create combined Segment filter with the following line:: return segments[::-1] You can also create filter groups. They can be used to organize your filters, but also have an important second function: You can define groups in which only one filter can be active. If another filter in the group is activated, the previously active filter will be deactivated. You can choose which filters are active in the *Filter* dock. The *Navigation* dock will be updated each time the set of active filters changes. You can also drag and drop filters inside the *Filter* dock. Their order in the *Filter* dock determines the order in which they are applied. All filters and their activation state are saved when you exit Spyke Viewer. .. _usingplugins: Using Plugins ------------- Once you have selected data, it is time to analyze it. Spyke Viewer includes a number of plugins that enable you to create various plots from your data. Select the *Plugins* dock (located next to the *Filter* dock in the initial layout) to see the list of available plugins. To start a plugin, simply double-click it or select it and then click on "Run Plugin" in the plugin toolbar or menu (there is also a context menu available when you right-click a plugin). You can also start a plugin in a different process (so that you can continue using Spyke Viewer while the plugin is busy) by selecting "Start with Remote Script" in the "Plugins" menu. For example, if you start the "Signal Plot" plugin, it will create a plot of selected analog signals. Try selecting Segment 3, Tetrode 2 and Channels 3 and 4. When you now start the plugin, you will see the signals of the selected channels in Segment 3. Now select some units and then open the plugin configuration by clicking on "Configure Plugin" on the plugin toolbar or menu. Select "Show Spikes" and set "Display" to "Lines". When you now start the plugin, you will see the analog signals and the spike times of your selected units. Go to the configuration again, set "Display" to "Waveforms" and check "Use first spike as template". After another run of the plugin, you will see the template spike waveforms overlaid on the analog signals. The configuration of all plugins is saved when you close Spyke Viewer and will be restored on the next start. To set the configurations of all plugins back to their default values, use "Restore Plugin configurations" from the "Plugins" menu. To learn more about the included plugins and how to use them, go to :ref:`plugins`. When you want to create your own plugins, go to :ref:`analysisplugins`. .. _console: Using the Console ----------------- With the integrated console, you can use the full power of Python in Spyke Viewer, with access to your selected data. Open the *Console* dock by clicking on the "View" menu and selecting "Console". You can explore your workspace using the *Variable Explorer* dock and view your previous commands with the *Command History* dock. Some packages like scipy_ and :mod:`neo` are imported on startup, the message in the console shows which. The console features autocompletion (press the Tab key to complete with the selected entry) and docstring popups. The most important objects in the console environment are ``current`` and ``selections``. ``current`` gives you access to your currently selected data, ``selections`` contains all stored selections (which you can manage using the "Selections" menu, see selections_). For example, >>> current.spike_trains() gives a list of your currently selected spike trains. Both ``current`` and the entries of ``selections`` are :class:`spykeutils.plugin.data_provider.DataProvider` objects, refer to the documentation for details of the methods provided by this class. As an example, to view the total amount of spikes in your selected spike trains for each segment, enter the following lines: >>> trains = current.spike_trains_by_segment() >>> for s, st in trains.iteritems(): ... print s.name, '-', sum((len(train) for train in st)), 'spikes' Note that the variables used in these lines have now appeared in the *Variable Explorer* dock. .. Note:: If you have at least IPython 0.12 and the corresponding Qt console installed, Spyke Viewer will include an *IPython* dock (accessible under the "View" menu). It can be used as an alternative to the integrated console if you prefer IPython. The ``current`` and ``selections`` objects are defined as in the integrated console, but no imports are predefined. You can enter the "magic command":: %pylab to use the PyLab environment (you can safely ignore the warning message about matplotlib backends). Note that the *Variable Explorer* and *Command History* docks, as well as exceptions from plugins, are only available on the internal console. .. _settings: Settings -------- The Spyke Viewer settings can be accessed by opening the "File" menu and selecting "Settings" (on OS X, open the "Spyke Viewer" menu and select "Preferences"). You can adjust various paths in the settings: **Selection path** The path where your selections are stored when you exit Spyke Viewer. This is also the default directory when using "Save Selection Set..." or "Load Selection Set..." in the "File" menu. **Filter path** The directory where your filter hierarchy and activation states are stored when you exit Spyke Viewer. Your filters are stored as regular Python files with some special annotation comments, so you can edit them in your favourite editor or share them with other users of Spyke Viewer. **Data path** This directory is important when you are using the data storage features of :class:`spykeutils.plugin.analysis_plugin.AnalysisPlugin`. **Remote script** A script file that is executed when you use "Start with remote script" action for a plugin. The default script simply starts the plugin locally, but you can write a different script for other purposes, e.g. starting it on a server. **Plugin paths** These are the search paths for plugins. They will be recursively searched for Python files containing AnalysisPlugin classes. Subdirectories will be displayed as nodes in the *Plugins* dock. In addition, your IO plugins also have to stored be in one of the plugin paths. The search for IO plugins is not recursive, so you have to put them directly into one of the paths in this list. More configuration options can be set using the :ref:`api`, for example in the :ref:`startup`. .. _`scipy`: http://scipy.org/spykeviewer-0.4.1/doc/source/index.rst0000644000175000017500000000311612262550403016125 0ustar robrob.. |br| raw:: html
Welcome to the Spyke Viewer documentation! ========================================== Spyke Viewer is a multi-platform GUI application for navigating, analyzing and visualizing electrophysiological datasets. It is based on the `Neo `_ library, which enables it to load a wide variety of data formats used in electrophysiology. At its core, Spyke Viewer includes functionality for navigating Neo object hierarchies and performing operations on them. A central design goal of Spyke Viewer is flexibility. For this purpose, it includes an embedded Python console and a plugin system. It comes with a variety of plugins implementing common neuroscientific analyses and plots (e.g. rasterplot, peristimulus time histogram, correlogram and signal plot). Plugins can be easily created and modified using the integrated Python editor or external editors. A mailinglist for discussion and support is available at https://groups.google.com/d/forum/spyke-viewer Users can download and share plugins and other extensions at http://spyke-viewer.g-node.org If you use Spyke Viewer in work that leads to a scientific publication, please cite:|br| Pröpper, R. and Obermayer, K. (2013). Spyke Viewer: a flexible and extensible platform for electrophysiological data analysis. *Front. Neuroinform.* 7:26. doi: 10.3389/fninf.2013.00026 Contents: .. toctree:: :maxdepth: 2 installation usage plugins extending api lazy changelog acknowledgements Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` spykeviewer-0.4.1/doc/source/api.rst0000644000175000017500000000707012262550403015572 0ustar robrob.. _api: API === The Spyke Viewer API. It includes the global application configuration, objects to access the main window and application and convenience functions. .. data:: spykeviewer.api.config Global configuration options for Spyke Viewer. Single options can be set by string like a dictionary (e.g. ``spykeviewer.api.config['ask_plugin_path'] = False``) or directly (e.g. ``spykeviewer.api.config.ask_plugin_path = False``). They can be set in the :ref:`startup`, from the console or even in plugins. However, some configuration options are only effective when changed from the startup script. The configurations options are: ask_plugin_path (:class:`bool`) Ask about plugin paths if saving a file outside of the plugin paths. Default: ``True`` save_plugin_before_starting (:class:`bool`) Automatically save and reload a modified plugin before starting. Default: ``True`` load_selection_on_start (:class:`bool`) Load the selection that was automatically saved when shutting down Spyke Viewer automatically on startup. This parameter is only effective when set in the startup script. Default: ``True`` load_mode (:class:`int`) The initially selected loading mode. Possible values: 0 Regular: Load all file contents on initial load. 1 Lazy: Only load file structure. Data objects are loaded automatically when requested and then discarded. 2 Cached lazy: Only load file structure. Data objects are loaded automatically when requested and then kept in the object hierarchy so they only need to be loaded once. This parameter is only effective when set in the startup script. Default: 0 autoselect_segments (:class:`bool`) Select all visible segments by default. Default: ``False`` autoselect_channel_groups (:class:`bool`) Select all visible channel groups by default. Default: ``False`` autoselect_channels (:class:`bool`) Select all visible channels by default. Default: ``True`` autoselect_units (:class:`bool`) Select all visible units by default. Default: ``False`` duplicate_channels (:class:`bool`) Treat :class:`neo.core.RecordingChannel` objects that are referenced in multiple :class:`neo.core.RecordingChannelGroup` objects as separate objects for each reference. If ``False``, each channel will only be displayed (and returned by :class:`spykeutils.plugin.data_provider.DataProvider`) once, for the first reference encountered. Default: ``False`` codecomplete_console_enter (:class:`bool`) Use Enter key for code completion in console. This parameter is only effective when set in the startup script. Default: ``True`` codecomplete_editor_enter (:class:`bool`) Use Enter key for code completion in editor. This parameter is only effective when set in the startup script. Default: ``True`` remote_script_parameters (:class:`list`) Additional parameters for remote script. Use this if you have a custom remote script that needs nonstandard parameters. The format is the same as for :class:`subprocess.Popen`, e.g. ``['--param1', 'first value', '-p2', '2']``. Default: ``[]`` .. data:: spykeviewer.api.window The main window of Spyke Viewer. .. data:: spykeviewer.api.app The PyQt application object. .. autofunction:: spykeviewer.api.start_plugin .. autofunction:: spykeviewer.api.get_pluginspykeviewer-0.4.1/doc/source/conf.py0000644000175000017500000002106712262550403015570 0ustar robrob# -*- coding: utf-8 -*- # # spykeutils documentation build configuration file, created by # sphinx-quickstart on Mon Jul 30 16:54:09 2012. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath( os.path.join(os.pardir,os.pardir))) # -- Mocking modules for Read the Docs compatibility --------------------------- from mock import MagicMock MOCK_MODULES = ['neo', 'tables', 'guiqwt', 'guiqwt.builder', 'guiqwt.baseplot', 'guiqwt.plot', 'guiqwt.curve', 'guiqwt.image', 'guiqwt.tools', 'guiqwt.signals', 'guiqwt.config', 'PyQt4', 'PyQt4.QtCore', 'PyQt4.QtGui', 'spykeutils', 'spykeutils.plot', 'spykeutils.plugin', 'scipy', 'matplotlib'] for mod_name in MOCK_MODULES: sys.modules[mod_name] = MagicMock() import spykeviewer # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.coverage', 'sphinx.ext.pngmath', 'sphinx.ext.pngmath', 'sphinx.ext.ifconfig'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Spyke Viewer' copyright = u'2012, Robert Pröpper' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = spykeviewer.__version__.rsplit('.', 1)[0] # The full version, including alpha/beta/rc tags. release = spykeviewer.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = os.path.join('img', 'logo.png') # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = 'icon.ico' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'spykeviewerdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'spykeutils.tex', u'spykeutils Documentation', u'Robert Pröpper', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Add additional features --------------------------------------------------- def setup(app): app.add_javascript('copybutton.js') # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'SpykeViewer', u'Spyke Viewer Documentation', [u'Robert Pröpper'], 1) ] # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'python': ('http://docs.python.org/', None), 'neo': ('http://neo.readthedocs.org/en/latest/', None), 'scipy': ('http://docs.scipy.org/doc/scipy/reference/', None), 'quantities': ('http://packages.python.org/quantities/', None), 'guiqwt': ('http://packages.python.org/guiqwt/', None), 'guidata': ('http://packages.python.org/guidata/', None), 'tables': ('http://pytables.github.com/', None), 'spykeutils': ('http://spykeutils.readthedocs.org/en/latest/', None)} spykeviewer-0.4.1/doc/source/acknowledgements.rst0000644000175000017500000000064012262550403020347 0ustar robrobAcknowledgements ================ Spyke Viewer was created by Robert Pröpper [1]_, supported by the Research Training Group GRK 1589/1. The inspiration for the GUI came from an earlier program developed by Felix Franke [2]_. The simulated data used in the examples was created by Philipp Meier [1]_. .. [1] Neural Information Processing Group, TU Berlin .. [2] ETH Zurich, D-BSSE, Bio Engineering Laboratory (BEL)spykeviewer-0.4.1/doc/source/static/0000755000175000017500000000000012262550403015552 5ustar robrobspykeviewer-0.4.1/doc/source/static/copybutton.js0000644000175000017500000000463112262550403020322 0ustar robrob$(document).ready(function() { /* Add a [>>>] button on the top-right corner of code samples to hide * the >>> and ... prompts and the output and thus make the code * copyable. */ var div = $('.highlight-python .highlight,' + '.highlight-python3 .highlight') var pre = div.find('pre'); // get the styles from the current theme pre.parent().parent().css('position', 'relative'); var hide_text = 'Hide the prompts and output'; var show_text = 'Show the prompts and output'; var border_width = pre.css('border-top-width'); var border_style = pre.css('border-top-style'); var border_color = pre.css('border-top-color'); var button_styles = { 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', 'border-color': border_color, 'border-style': border_style, 'border-width': border_width, 'color': border_color, 'text-size': '75%', 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em' } // create and add the button to all the code blocks that contain >>> div.each(function(index) { var jthis = $(this); if (jthis.find('.gp').length > 0) { var button = $('>>>'); button.css(button_styles) button.attr('title', hide_text); jthis.prepend(button); } // tracebacks (.gt) contain bare text elements that need to be // wrapped in a span to work with .nextUntil() (see later) jthis.find('pre:has(.gt)').contents().filter(function() { return ((this.nodeType == 3) && (this.data.trim().length > 0)); }).wrap(''); }); // define the behavior of the button when it's clicked $('.copybutton').toggle( function() { var button = $(this); button.parent().find('.go, .gp, .gt').hide(); button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); button.css('text-decoration', 'line-through'); button.attr('title', show_text); }, function() { var button = $(this); button.parent().find('.go, .gp, .gt').show(); button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); button.css('text-decoration', 'none'); button.attr('title', hide_text); }); }); spykeviewer-0.4.1/doc/source/static/icon.ico0000644000175000017500000001246612262550403017207 0ustar robrob h& (  ```(PPP%%%vvv'___...jjjooo777BBBF%b^^ɟᕓkge(""-ccdPPPFPNNsʤɤΐ USQuӾӴblddմbͷ *t]\{eɾ{\\\̱sIDD1}{{ϣԁob^`PՆxIQlhDŸ̂ߖwYzcbXqe^R?WIxhXͰG3J-"&ss]].~zzEusssd==ff7%aaeQ|jjv ~~*1FcϏ w\\G$( @ ^^^TTT222 ccc]]]777 NNNllleee<<< ZZZ}}}uuummmCCC dddAAA|||wwwHHHoooHHH###NNNxxxRRR,,, A"1-+732:64300*'%LyyyZZZ555}NJIۑXTT.*(ʏfff555 UOMKڹ`\Z0+)vǐ鸸/ ~c`__`cqqr(w_̭dֵdۺd޿d޿dۺdַdέd_w( [ҿbβdغddgdddddۺḓdbƿICC$da`¦\aa`aiS䠆aaaaaaϰa\~zy000 !X[ZYXW`NpWWWWWWWаWXOKItqpҽlU^nًQNk[YIqbNNNNNNNЏgZ5n鏌111M˘sIfZpdbVXKvESDn_PBFEEFb]JZCY>Z9M&ԓC> -'su::F&%Fvv}==vv_6*$,,]::F!!zgS%A5/+a\Z10|m#(PPQppHH.#dd.T ֿ߯ Կ 꿪 ̲ [4//6z ]YYzZZQQ1)۶۶۶Ԫ& SSU,||uuZZxx4+#@@@##%`IBBIQ&&)Qiih``[[ԃ90'9~|JII@6,$6ԡ224vߨXX=,3/'Z⨧* jrrwi  Fffg ť\\]669u""%a##&_000pUUXлpmiKhhhnȱidd8??G?+?9?1?1???=??spykeviewer-0.4.1/doc/source/img/0000755000175000017500000000000012262550403015037 5ustar robrobspykeviewer-0.4.1/doc/source/img/plugin-waveforms.png0000644000175000017500000012050212262550403021052 0ustar robrobPNG  IHDRl\bKGD pHYs+tIME  TtEXtCommentCreated with GIMPW IDATxwxևߙ95'' @QBScAEV@QJ"^/^,RDCgf?B ! `>y2LYڿY{=麮h94$$bAe @ 8躎먪/$i$InY4MӤI׬Vks#<"JN $\.>vAAAӲ7FPPPnٌ墰P@  8 >f~~v` 1h ^/vEI hO>,^^MȑL&N'FQ@ 3+}yoF@ QvfرcGlXZdb00Ȳ4j%l_3<ҍ.6_-[{!=Z Xx?Y+[pa}ڹ"~@2`GӦ β* ADؼհ?5w}N0_}| 6lc`%K7Rtp`$,.{`,q!E%xN]'lWD'$5pTsש>};6ޖοI 4R7ֲٛx%._תizy:FE`3(hy5c$?^` }xeUݎp` 2p0F{Ie c*2O?T^Ks殮 +0=]޹泮c0fЍ&ZCUӫy&ISrY4W63NMZ<1T]Q_`J7$mfo`͖<|l~ mmȪܽ;ٗOWCᱍiK)-;9SFVN(-fY͓G qReʃB }8.~®2Q2f5 @QG~UZryX\~aLD6Bm.ߏ4 w\)ZAޝ*AHJj#BMG֨9s`Heǟ9[RK{ٛk[ Ɨ)rKX#ӲU:|/_N'eQdL#Q+>/r v}* D7ʅ󑝝M\\\dGVVqqqg=#O>aI,r)p@`d(zUx$>rfNNxT;~cW" )nK> \5ai 2(Z"'vk>~jc3*G1)˯BHK J*ҊL ꧼ18⢂0n@p\F@/GYt o!tO扄=]dcـ30nJw˺ Z]~؝F10#<&®<'*Z֬Ϡȭl#S?ۺKΡqL X(ʕiNv90sQ AL$h◝߿ߏ%33M>sBb %*v]dEld'(Ev Z .Y\(DwHgZ0ji;io#drSM6x(-8=IlՉ>oO~)U.TخqU@|9?qTe[_s=\F#8yޜc߿?߁!*N71[ÑWy$r_)m$+WhBvf\ܶ3NTP¾}: ,>VBrJ@y&pW_ ڎf ,~cGezGR6z0Wnri%pWX4' Q]B1=fDwk耮iGSPfUX#jB:8<Ö+ YI]XXh$ ]x<K"¾P>fIi!19V||$T%v`=xU [5$@uR1EIhZ_ږoדUti)0lͧQnNZ0{EcԚ{ra2=U`$֮.0cQF`c z&3wr,}NT? 9:Rm)Ib{USd3s+E2m.SRP'uq89)¦n~r>JULv  o 1Zbh Ό, fp QRBCC꼢.ԋH f2T-a އN1㣡Vh0Өc/&p:d"m*ah[Yl!%oHE JP[_L Lҩ$*{qupN&>̄Uy?JELŮ@Yk hZci%48D풅.53nTNoO$hShfA;dB#Ŭ BBBvp?:u.J46-͊dD+׍RM+eך8䁐ѧL̈́pPXvDXl v|k& hBr *KFCY1)ϋUNis1c G)PnUw^ :>T_-9sP8!$2`.KDPLsJG>28dq(N6b %f(YFqQ9nML5׀@a %.&%9GLRrKTXBlqSs$%0UoL MNLXxzljpO  p/^,rrb_ %RRAtNq1)+e" U5q(@ -!@ [ B@ [ ` @@ ` l@ l@ -!@ 8?=lUUx<:/{#rgz@ >C<mE(vgPK,-¯ @Ԃ@ \vl/VW!I2HU #:ZRWU-yߑS@ ԑ?4E8ʢhG_͔E8"׀WyV+1tJ?Πǿtxv2!{fǝ+߰[Ulg41a7Od=ICoxta6?t6''Oyv3 ۗƬd$^O}v`HIR(al6O^y{l^)A}_@=̗~D֖׽qqb!aM{K!@:;<.m:-X迆)?_v_~b und9Tl|O 2s">؍s&zᦋC8/g8>DyGω`k~ ]C7C7ȡ9:Sw^v43] flb?9+tt\p26,XO՝nj}it梠j[0qCdsDvmF"M_ȊsG;'JH/ &>OGo]WJun;S^W\I 1m+{ul&JQʳ$?P )A/U{}ysJ;,ژI@h3~zĚjHqjkzKS0bFw`3y)YIr=<f3ڳα2gvJzb?[(Q Z&Mɂ1ذ'OLA; uioh_ǹ fLb;?O\A 2b~oؓ~ 1|rh\l|;wb{hi~iz1^ª#ͅo~#BwY %f{k_,mˀ UL Rz)-߁/6c~[;IƣU?U(^lO:כs@ #g_7}NstìVLJ5' ۘ6t*./Mf}||,U-&F?w;-%ǷWl/R č#fPs; yf0 ZlqS1$J<KqmfVɧ#p%!}7:(_0})^ȦS/è73ph/qMA4o*zFaz9^y{ȖHZ6箍d#ܿ5b>W݇=]Pp~ݼ6bNO-S֕^K[lqiL63 6Ν>': @tt4^s9n 'aB/ZXě74X߃UM̗ϯS5m8z&?sV\ʿn=of{1V۞c 7dS"|~4ӧ~KU ]x}u,I8reQ@w1՗qN ˦'#m0pɸRaq}<.>]+cڵRuq(n\GeJ(]B0ж]0[K@cztoNUA25 > dcMў[LdU)?Z+4nhF6$ am%N7t'$~Vm\"Eg0ruළ Nh:SS 40tFQ]GS->V@~۹c$F9^CmȒuJ㘛 O മ$8w$)gu5:4 xR{J}۴^[Ӿ[jWݱaaP^~Օ4mEl7)qs&%ETvn`wNGQ/Q}')sqR,.⣯'k`Vʁ(z:9>w_U)JȺ W*nj8Sxz;O$^ҟGB[5G>G}8x4b#0sS &fTϯ9k@l +zIh\s#tR6bT)d)n=N֛锇+c7"w` B7 XKb)n(M]JtnrͿR 0(BH1V%"+ ?J`:yk`|0.]FUHKmDTLQ k "6xȜ$CHչZ+nSvkK &[u% fT*Xc"VBBo:l F Sazpl@tz=Eݸa\V, $)D:Pk[$ٙ#ZWiڊϩb 4<9lOGS|}eVɏb'*J 2to?kB!02*`Lpx`5.I7vv60%:) js'Oh3N쀯 ~1uki11i8= uZڊ~ᝣDsW%TUM¹HJM )5&U*^8mJD/ w`[oUޙ]IEܧP=iڊ;Yatj~Χ)OsӬSZunJs_|C߶_n'KtJ;U7s޵RxGniuc#n>cn=\~#Ȑ Z"Μy"8ͱg`JvlA~]eIIFZG05g+OeaH0A-mNkAǓ6R)fW58F(֓0GoS0's=rEYgm?$.y9 ,hIH"i"s!\{ #c84}6O Jӫ⹛0iFQ Xcܻ8РhZ5ºw͌0j(W؃THv(^7s&kE> hwXndRN€b?ָK4. X~-^y? 'AKڶ npQkI?z6p⡵i fyt42B`mҗu/0xA\i4#HiclWSUSћ[㌜kS{>n2 ~%]e4]hfdIEӴWԷ/uѾU! @5Eyr|; sIyr.|;탦hs^t- SfGAk6Stt "#yf*dnvLb@c/sExyy1 \U,-W5- Hs^rY4K},LDNtR@ U-B@ [ ` @@ ` l@ l@ -!@ K'=}8eJ+zJO'=}$ Z_=Nzz:O(C?og@ 8/U=3k(*eA)$ ShH+<|gl-nD%?^5vNua/" +oj^]+գw2k4m3Xd؇c{?.‹&\|zh_3M*g*=C=l1'o:o={o^}#1W ooѭ·XL': 9cd"a #-Im۫7w.|VHOچ`ASx!(~8SF!jϤɛ' C޷9]wx6hނ ː7#|Gb~,CFl+m\oAr7bwWkv~]H_9~BG!^,"wKqIpe~7~\xj]%3=%yom]z%ԏ8y0v|Z1ofO&9e6KgŪ /M[oe) $hg&pՀĪl*}Wa~TXƔgn_]0ѭWA㮽HӖGr6?XڙKGyj<~t۶$kdo\+fؒ#E#'B ásyISRm=|_,%0~Y{!vz}W&³}CXL=O{d|>z\aO6rW.{r݇`&82F\1.bTyKt3arYd ]NY&{3)y}WFhgƾZ9sگ6Aù1_vPh,&] n0`t4Sݳ9Cgqя|~(:T? tƵ͡y1Ƭrq<|CA@쨔hLf >TEa^eN7eBzuӡqj9+h0ĤQVr(`o=4 QBб%`;fepk+7Ҩh^cHЄ 4zj۽yv`f|IQ(v-B+ZwQ_Y`s)Hp9Go%f6$PkՙZ%`Ed\*b.@l%+V"oJDe@WQQNmI1VmsS@+@f;сA^ ,J9C0PBC=u7lGi GrrqD\0sGL\ٿh>nit0xe^r~ϫ78[-OnqqW:gR==BdQ>ZaUuQ7@'==h1q8ʮ(+`׌k{37NQkhE_VH|4c6mz1;#Ogq$hFO=梻2ؘɢOvE.%c :MdFLgڂԸP%+uscQQK 6+̴t83Jol1 > /1U_Ӌz3ſw㺋MrAC%k;tmcj~8"L5ȃ17fAPy9rC{۱;tXFlD@ގ$TFqճ0⚖dȂyG밓VrqSe9 7_oCmˠ'c/ڃػ!FH S2o4K|z jykL{-ukĴcI`!A}D:u޻woQu}dZ_^}>Q6@pXtxwB DJD j`i-~D@ @ ` l@ l@ -!@F%PUUUEA%(ylAt:),,]tOD$f3`2 k~?r%,L~i]p0Ο {.((cǎDGG +dY&::SRRrv]q:DEE[=]'[P[4Y 2*[n;}ꅯu۳9w ]^@#H=𭿥`|zao\z{11j(jSUU)1qMO' 1s6DtRG'5\Lr_ >e9~Qhsʼyx<̛7L`%yu'T\ o9 ˬ%={"Dߙh3ڽ+^6zEPU+F˖-iӦ,[Qp'Ӛ(=&zӫ*q݈xyh=>)ȉ'aw3xs|7{L'=}]ƣmaPtrѰ*HE1ߙ$ݿ?|:f&ܒŦ;i$yl[ "\o_V_hm8cK-IsETi6&}[韨|؟}_f\ѥ+;xWG}D A|Gg\ Պf=CueR!L`7y}T kM凂S?4w&_$nb؁$[l~c o.0@ ,oegXGzjQ[Ztѫ;w}mVyLݓY?dK}&L;پrw6f,ݛY8'cB|oo~ZG% Yd ,_ ,YBqqq?(,|2}>K7JL ҷ 5K߈zKW\ZCv`Y~G^VZqlgO2W8! +bs Ԩ-Ϟń%8Uxj=Lx^F*xv4~*KaO肽^*3胻hfRyO^ѐ= Yt6 ј#nd못Gϋm?9{Ud0Ώ.1civwtA`Dt2_)89)?t K\gny3-)2)&aHXSV許kٷMI7su\sQgHBZ Ħ?ɰ;䉦5w0ˈ1 /p[dh;}%z[F>מּ5;Dny6#!\UBVHaZ4@׎~lJt+j:W+c/1UCUqQUU ݪ7FDѷD$L-s]}e~n(ֱP8 aFˏ#ڀl GǗ^cpCc mH>G~vfb`$"–eV+UMEՍaK8mOk퍸<'Á@/JVSAJ5 ~"*W5mKU5*vw^ 6&%W ^`{AGr26eqnO%AU;g/^W~M2f1qLܧg2 ͢7>gK]Wqf8u?y`ár%8 , 'Vg[&~p Iv_|9N~/eٛjatЄ9n|=|ڧdyu4MEh2eRSow7ֵ*Alw4QL^~Y*4TGv[b/3IC9^D+X%y yW`G=M< HiclW󰗸L.2$ڤ#'{%7m>$SͮDt]S"^]Ľ۹cη|<5{"ϦJK& *N7>CMf'}ŸRkizRщ@M.ӷo_~'ך]ϫc3O'sd\ 6myݥ<~5#5F]v~{5FP$IyAHRoYYFQ|nUp>GիWӷoS l}!^!؂zM@@|у U.>GSPU*( #GDQ**N~tb 5jv~Gkp\$&&j*Ω(RW18B޽{O$[FGGcXlf!V n|ޯ%[퐐 (@ -!@ [ B@ [ ` @@ Έaݺ1 С HfQ@dݺ v47nF:tDԢ@ GPoR"eetܙpjӹsgJίQ̹kRdH=G(1''O ?D}8򱛀v;fsisܱx^d|fs~,G7jU?5DHQc<^v~~YT7.2{7 >$HFfivC6KVOp0/"szΕZY-M͂u@%o(F|s3H _財;4١ `_P#M1 Na wߟ̽}ZeI4%pJ\twu Cd}RNϗy?@toog%m<@RlK1)*FɄɷiC_wU;l [mŨɽ6k6fR5z%ݼ6b(^,mǵY'"wWý!ye.NOB^bH`ȹ>Պf=CWw -% q'c5f2Emo Si4zOdqg1|j䱽7:4s odeܻij<ȲicxIHlu/_v_Č#7G2ɦD*4iO/,{hçZ־9̓$cy𭗸$L‘,H5Šh<t+^H< NqNsIമ$8w\CRH\2P旱Ť*>.E a-ut[Y8eLD35B@L: .|_?b_A`7bm(থ0vXƤg6 [#q'3nI 1,kvɤ~#b+vkhHyZp^,,cSfGdZB TMg/^W~M2R]? V֜Yl)*ݬ[Y/ux0&l@+2=g~&ojVlQlQd I@ "zDb/3IC9^D+X%y yW`G=MN%R)7M` 㞚Ct3C[Dau"2$3g4>1)ͰRHSN{Ɩ-qt֭N/ά\D˖yGUqٽ¥x"*`{ 5hzǴ_zӛ1MDbW+Hrш(<ݝ}w33;ӊ3sٴ]˷'#ʃ@ ̞=x nc޼yu/ - K:!9ѥSSNӫP,w-BX]eOCDAu@ l@ -!@ -B@ [ B@@ ` ԝ5V#=iJǎm@; !Uց$3x`dz_UU֭[ǪUةx΄D ILLnRaILL~y5/08䭪RȺq݈$yκgi=eR}KîjbNkǙ*r={HK8&݇nl;aH՞wo`x33uY/eugB؎kniHAT>2$ &锂 PZZ ~5aMAAf-ʠR~UU^%LT<lN^߳џ>F F{yF>xr ?ӆ=n>, ] ~<;z ^/#s Ly˜ IDAT '-fK~F&Z1O3ߋޜa}r1[Hc< p4ޟ++לwn!5-߿?ىU<{緌{KKo8^GF>zVEQ{- _Ŗ\k.jnC*̄#]ލg>Dxji4KKtBıc}4ĻxѾOqiӴ¤ᗍ";2_1/_Eߓiod}y(O^_Onw@vEjc=?0{w4_y{n07?0Oݱ;ّH +(Lnx#یQ@h_\~奧qs9 ٩p1!WF{t4)m=6$=4^az7^φo2",|e-ޠķ elt#o殗JyhjϞM(H[7"gd}7VO|}k<{D|̀0KVG?[4|G7uGt~yq>: 9,8d1=]x^g{w'ڗL|eJGI)qsxdv-(Mpas1#ov$2?Y?#."ꎇV]^I }y GOH~tlQaKv [6dUsY5c#Abh?zIOxSTOM="mG1& C-JI֍G6@ܒ7"d%Nd+of:fm)FeL 6=D.w1Vt%wsn$׫l'19-JF\ߓH!׌PdkkzI aS a_w]lGb(\k Τ<-S[ud(B%%Q/E:Qah/ pnȽ7|y$tjp)ͥ@ *p$0lp$eXƒ0寲&Qj}?hSzSƸoo1%͉߆lwu REO~_SX֣ðdOix5Gz*3= [ 498tQ~@Od%_/G > MؼgmD͹ٿ>sٽ1%dWq+7FvJbwM2WN>&0E&/[ÓisZ/ þ:FFN_;]ix/k,qcV[ޭ$40k|G|u|R&{3 4UY0>h-%X~0@p@ [ B@@ ` @@ l@ 7 ׋(h&QǸ߉,rђTk*yn7t:h $a6jO!؂:YExx8Vֽ.l6p:B&PXXHDD6MDPCe>nU:x<,Rʨ,׮ ydYaAFZk!؂ {c!dxYoQ L{ 6(ݝ̴=5pp4fm+tǘ59*%{͟$o;t:13DP=s <σY&.4ɀ5 ]ij~n/ Z pLfƎF |Fi(n~wMY-0wa]UÒi)w&ȍAzRe3T?+ Ӿ(eO,>~W L8υ}^[+ϲE6ňB0Nw:- ="l푈ַӒ|hlCNc,qՂ zmL%;t#2 u U$ǘ˞WEPPB"UUG6J=5 ~"3Be^XJJL yYǿH=~bv/ZW}z&HRVngNՀtK;'`7ZԒ[b:_"u&efy@P~K ՙ2` @G`F*GݚƢ9x˘1}5[d?kl!-ˉ?N+;ο,ai|Q-ƐրKHٓA=h%ޞCYG[$3fRvvl= K itt4p\IHdE#:P܀Q$@lcɛ`fK ڗؓ7m{5O&c?. ٱt 2,1j{JYJzd(/ߧ)` qk7 ,]?R` %U{Z:ah4gef4W #>Ȉ!(8lvd hl6͟K=uopgOQ2!FcHMyIXuzhZ6!{g6akOY FWCU)ڷgH+$#VD2֬çQk3"|lT? oFqǶa@!ͣ|KF11dQ$됼R% v얣Aқ)xՋ"HC[ѣo_ D!l?[ V6JbD;3BSpo&ey.N0޸}[4EVrVCt]NL1[?~6x:eӂD OFx2X2c>Iwv^Zy h=!gM[T 6%ϻYZZlFQsR!H^^^={l㫽EΡ̡nRs@7JΪIXfRg ,˨*ʔNs :^\(YEx50DӺgghmY Vuڗ:,&}{݆Ѡ(5Ex!uֺ",^*hXCPZZ݉WRl6N~}x1b.0ӹz>Ir` .mjng]_g.BݹcEàilAEb4/ .gʟi\Zk!؂ YQ b$G ` @@ l@ 1KDpAzQ咘wqYe^q-nbrssq:BuI0vQUV˧lA"<<*Vԩޅ ==͆_~/ [PQB"""l :,sav{ tiTUY\G  e[>Bus-`;`{YoQLKCT 4kӔ2w8wMꖇ}.zucQ+f_0#{Yz{S5 4;#c0I }!vu4Jh]Yҵ$δphbH3ڞI՚?cXsS57Yl] iЪ+X>bRgΚ֒IKٓ3K+׌h]у0 Nӻd6U=߄>mD40SU[ߥUTW.~E]ŸdZ.t,sُyY~jvj!u<[R9%_I?|*ػ$?IbW2A] V)ܽ6 ¢C8cJ'z0#-c0` @G`F*G3]e}4ɲK!!Ƕmd8tԋKGʖ%ؑ܂[jrЃd &C7F 6u0ENRpKzvǯd V.cUXzl7o;gw LĴNc@u̙b72OXu‚ߦc Җ`kz1^dtߙ%Y<xuD4LbP݋Yzȃ+/~,a 79F"U41sg4-m{ش'5:RhЩ]ِQ(ܹ%kwҐVZwSdd|B 'X"LL8F6*Eiٴ =dؙoIʽ 1)8ȹ؄ ]N굎$48w N̢5D[2H!PxICH4{Z' ֤+#Z&],/gFӲ)f9JaH (JcᢝwĨh_¦ (%bNjlNNf(4jF#*IʂAA?!m t֙`=cn!F ̠Rqid5^yh2ng)=;s2A׽ՇDTGAQ~\h w_̝; '^DAJJὯdPUHtD e;VO*y.`+̥PM(B|PRpR0Bm՞}ĨNydt)UO)^و8-&"lSf%i8VYKT@CIFMann GPQFx)jgT4=QYgЁ=~^f]wCEsY*$O^EaJۏޞp1>lڱ„VT#nh#d*uq&CRl {u2FHz^EECUT7k~M9OL%=#^T&^s;C64f?J НFZ6ŊaйMLE2Y26R=44YoDVQ;W6X1Ha=:h~i`cR6,cjz h֡ 墭xè;u!ÖFtx*PP<*̛=:FX*>G_y"JoS@ ;:E?:̶nTr~qe(hNv7Ʌh5uR\j-dRcޖ>9a7td/hE.ĩ PZBg5^G@l>Ķpf!=w"F!l![aPPa8(a kN8ؼKԖ@(\JLeK=d{1btX;iQûNZe M ˹aא3= "4#FM=;r آ1gn`k M󐓶.VLdk)(< zJҙMH8N0Fԗ.5 Je~O5U)9B*NB@؄}xbg~:]hH,:`C93-͝˾8XdIר:Mi U~h &.ReyT9i'PKqmcCわix5O.{.!kjd艈Ntebl؟(KiIVtFn\NrZ0N嫠baAkIPUV#:_JKKl8NsL$I:#-sֻu} v" ijBuKR׋h$62P{*rj]` .NgF-\@ -!@ [ B@ [ ` @@ ` l@ l@ -!@ -B@P  (0Py;!A5n999\Kb1A@$L&vՊh- Kqq1999tܙ`dYDUUbŊvLzE\MN b-8ȲLhh(:t ??Fa9Qr=p8 7V+^F8!؂KBUUΔE!A5D mvUev۵oO- `{<:OϮ lK.dk1oL+=r 677qƑ[m9TΊM;G4t(#>gK2r)zyxsFڽ)In1ݝ;+ Pļ1-<6zGur>kcz"6f%TqU<؍{_D[U5 ?0nX{Ҥ}LB<ӱm[zܿz/_?HR&6ǘ݉_- H;QpB+X@W2c4:7S<sx4Jm48:_uU e ΈҮ;c[MZYO_EbB,-/Y_z9:u*aaaԩSy8G}x9|!taQy}/c>|Xj2u hy:pL=#|=&#_?ޑ؞ 's_FI*V6 Ov'p˓Ww>7z(Οd_aq*WKF rl˗ٛ(J=7!d|m/ ({7=¢/l1B~GgeVu3k;^ysL㶒{N[_!DVxV^]$FGfjZt/Yc'NZU|>d/Kkmr>Xe끑1An-'mvO}#iK}n[Z|^f z+z;;Wt|/7pSH,{Q;?kP]!}[iJa&S/̆REa7h!_; ;בpl_r佽3ʘrc,?>({Po9=d4]ytv'zH iQEs,~۟dTS.c#v4ډ;m{x3 zm!ՖƲ1RIk(>>=VE;oylw]5 $D f4\ʽN|5[檧n}==o88jp0sL3g$ UUQHir{<نE]^/Fg 'H_LVr ihcuzύK(tV|L: ΃+^܇ pnȽ7|IEjp 9^uEe9+3`}dxQL1"d@̚X̠((*N\^WW`DIh"ϧĭ`r| 7 k. ;ÿ#t esY.EASVr;Iڇ㫊L+:|VFUAU(ϝ|aH6}[TRf/{'%opN+ HrMryp Koß6\))k`qH-aWu)SK|V`E(Ex}/Xөu7}>̢Vo ;">9nF$sbK:=P|;`]*,'!L㘶0ÏEubUQS(G+=d8z|8(*7MH3c'p|QP<]`7NX,pxWP=`Ww//VZ>)WqqN*nD(ۑ8^nMNj{鯟n@ #/[.ZQ4*Uc߹d%b]?~`#ҧObI͝ΒI8;ddK w& '͢}ٸ*iۊyפF {r@asR_[5F=}S˗|h%*hBlXlþ"K*jw%x{VN <ȯ>hR(jYL=zjhZG1̫̚g_SMS^_2ۍ;g_/PAJd} jrnr|ÄuAL{O)e}LG*6dz)9ȇvDDO8 ?uS'U(˃ЉC}?ՓOʴ^J R򞆂bm&5+xn m`T o;!̧ߌE-FZ3%p'ope{(Lc;2(EegeJD x kQQ(Q/Ч  <{/=?,x=ZPv,Kזn|zO 27]9e!qt$+OeY<_{'0?}>L]_cBdffsNb9q˟y x&??|Ek0裏86V L4f͚5{ x=l3fn:`zFj:S#=1ڋ^06~eؿ?͚5f`wɄ!Z y7ד_k+T54f"ZXhbsyK$,Xj%33{JZU/HzOܜ'}.JRylcK`⹗޽; ,wUzA9[ x VXX`˭ NYV^t)III'}Sx` .zV+AAA̟?>}uN63PUt㩑x>jFTt Eldt:𬉎N;:3bkpVٹsI???!AuPf3>>>u~#4,l6k S .8an@pA 0@ l@ -!@ bAj#:S/` . n7\.<]pΐ$ Ʉnjb4rB=^brrrܹ3u+@ʼndeeb v;~~~g& . ΦSN SdY&44:_(Mp8cVa \]s@PʢlJ"6vx~۵oO܀F?p#ɯa;ƼFg]zR^=?+ysJsvKkH1hOv<&2],..˸qͭtǣJ|hehUp LXˎ%n$]U)9eRn73f|}3c&;hapx崸wr*ncЇbHA)Sr2eI1OOz~_|3c:rUL3[$F@;BwC[rgȖ΁ÒIK 6/֊RE%+$֩ؽ9s搐9sNeWxs^b؞mƒ45!F[(M f`S*Y{W{ne͏\NR)$RʗL@2^(؍՜{8n9C/>bE~4gƝW e谱i* q^wċ|2.Ƴ ŔO-gNjŬnC34m;anA?^aBO豦 ͯown׼^*p#7_סkJw-G"}-;'䗏oQA/ˁ?'|̘_F}(",rB0. c{̝BL3}Ы:z'[~yDH[fS:[^|ϵMIY\n 3 rvng'Z%&\{ײ}~O<ܼ*= 2sT x焼m&] PLe[OQ!C@SюJ)G[-[YQP%2@aގ,\=,TaΧ?!׃}3j8*Q%4^JYxFCk]§SVqT=)H-8!zkt3ȲsUY*X=zh0l$sh{]`0k2~8}O1S37%hVJG!NSQ ?uS'UxaĄ[Aqd2tei9iWv<}շ=;esY}%"*Qu;l t}2J4hqw@BuX$%Ƽo3{A2M|=6]{'F C ׽.T Hen޼y2y^M.Zm'nz "/b=݄/?w`$ o~9- [A2{ySH@ ;<㟝MM6R) 0 _0 "XA)bCH("͆W HQ" BB nMNHB $y`n7_SD"ᐊP˘Oܿp&$Di?~Wfz ~c(̛7x/ZK,|• PAq}'~0Z貢N)Lbb"[n%&&Oppx<0([ Sv|9~M 6ɬZ Bjj*Æ ;géiZӫ^&V8/:ʁ U2&$׿OwӰפK :t(Ǐ`9,GlM X;uSrW ż?NPnʸ/s?vvqdwH$\zVEqocRt[qFU6zA'\r?y+`yZn#xs#>F%_umg'𿅳yL=*uM` Ao־-5L,/ .wqoo0=/byؾoMH,ab:ďۯgܗt7;J_ٹc#ow+ɖ<@7y_~udS_pT\'{KY7<_^V"##ŋgVX={Xx1-^Ȃmn)/rk|1y==2^XhN1sGߦ8~Z }- دK;R$tUߛ#0+:#ɺ[s.9nԡ]D1EsCۉ:3\_,66/,;bś,tD9=Ɠr5=RKHv얞 ~ֿ:pߦ:<؁f/֭puD><ݯ F1ڹSX=.T(cjO]w?Ev-ZIJeNn-nsMӊ)F@@|%=qדF1iB5—f{U΃{PB F|EXlu sX5@kK5sgڝ (z9z>SUkӁȯ[V6,៘<iDK?Nf'n6U thf{崯T M]%2Q5_UE4tł=5 fBu'Ɏ=Xt#OWaβ?9g璕ۘn$8ʊAUT\H  kHǻmt"̬y-Z NUP3x B_cE",yǖ$+`BŁL:8d2`-|"%2z؊CU_/:jhZA?M]P BÇ?c~hg} e/mpMhrߣ y_Bɠ ~{7}-ZL^ o`C[]SS4~[Oh9_ lَ؂DV|:#i^瞥|MWpzEVmkǫ9,͹ P: q0P-ĄAeҥ=pZ$f<>MC}<nk˲cSÛ+ m%MT7_ *ؗvFA jk:.'NGtyP5@N [ ѪWgpye+vb E $OٙGy5_/PSϸ/*vjX=l%0C0iAQ3 / @n ~[hq 8K s7<ǻ5@V}ާ.PBa=rF{^d@` g̡0AYLڏ.^!h7չkSVOE<1Wn8O+em>M> zMw珦hd vZ΁y P/wA[pU;5{=X^c-_H SB"~Jy:a3#U?47j\sS/FʝFsmffj:}xWTY,r,czRRRz(?<34 ,gw`vQd ðEV+ڵ$ B?~Wfz ~(̛7x/ZK,|ؗر&֌H^`yS &11['88^?< :^xӏjt62]B vt~,g̪UX,2lذs4M+vzr)Z}Q9)Suz+YE"[jŪUh۶9kM 5 e5[*op8;;,-\駟HNN> ۷ZxEJb!<<+WҮ];bbbJe1M.!FC,K5C`]q1 4HNNY;V^MZZ>%-Tzl6NX֮]Kvvvh,+٘Lr{_Eb/'fDγk׮ff+"͍" ZdSpyQ`BBB)+EvYscB @A[AAADAlAlAA[A$Jƍ8|hvEBBc0HRAR7A!)) 4McӦMlܸ-   degӲeKˆF˖-.Gty`ejjOdk;3ǬeyWRF/EAt}n=R/rz g, _8rN;za|zZ O}GUpGѺw/ eǏ~SŎ +@}0_T¦X4SwvZJXh3y4LL,j`T %#:wR hdӘL&LQ~NJW6Zڟv J:=:yNcxRoxQhz 1vѕ34o ۏVEہ~ɯ_o>Ίd}huFi ܆"#OkA=lW=:7Dd%D;IwP {U BlQ)F 0p#lrt$fٜQGo7^ןtrԂp-Q!5̑7p)8*7ۃipƏ?7DoS@ɦ 0[/ЪNku^5uhtkm܍h^g%d' & 09g\; ˙^}vQ&0i nי|[9e5I|d]`5*D|aSzua Z ˶Kٛ:}+ zI8<Wop풨]_\ tw664YWӑ-=#Gt' ۲д ӎlXȷ?y;4Ymf?;_XAb{oŶ){gJ5lr3V?~\FH 6ԂCCyDwk#&t![r}н}2M0etЖUжhY7Gjt\Ƅ^m6.6{}]4`0'ޚ׎3C5CQXTkڋ%>5cLJ > -I.i=nlrx]j=m8~|Ng?a_}4n>svP jG?ÂXs_d.r!ŝsv (mfuQ|N,F䗃xfq*[ 3p{.y>nZCz;hsWu:ҩAV\`+sy$|ćC)O u4]b:. \bUSqS%_Y+yh@<Au ԒGtlAcav.+n o8#s=Moez;&lCӁAgod'X)̠˕l<9J㍻:!8 Z#Uٵ͖uUX3/VPP!)|QbX#E7K:o)Ս(,rkuUi, Uh\Tqg Šyήc Cni_eu I[EDQUC l6*] ^Qj[7"%Trgp0UWN o'\\ed6{Q[(J>NS|83,wßZX05U d,ͳ cHu"3uXyW9 Z b1l]1Lh[Vd D؂9߰|owzY| ѽT]GWh;&˴*[5БAG |6-%C6 e#f䒛ES<8RU:mp*?(w>5*g3'W6wbםۭ7}{s<SVU|}ւ%U=e2! ?ĉ,,'#7i0|F9xX?W*Wxk덿nG b"b63cLZym}!,Y"Pq1nf(rl2GQl].PaC"ưKJD7o~JeG^C"hJ ͭ/ XfIu0Lb'*$f%-ׯu+[z/\kd^f|7ݧlcF|a W]0(Qد}WE`0o @[((dgg&"ϥ j2dfdaϑ!lm({v!R{D b!,,+WҮ];bbb.9ԅrdv/[rjOv_ұիWSV-Vy F|nH͚,:'?=E~FOv]ZNG7EJftڵkξhl`0`2L7L%-r(rBffw^JPbxwMx#.hklvGjxJe_EQ&$$rnIDATC֗"Bmݎnc$   - - ` "؂ "؂   - - ` "؂ VA7PIENDB`spykeviewer-0.4.1/doc/source/img/plugin-signals.png0000644000175000017500000007320012262550403020503 0ustar robrobPNG  IHDR+5ubKGD pHYs  tIME tEXtCommentCreated with GIMPW IDATxwtUپlz!PEAEDDQQ@`AR |""(T)bD:$}f?6Z(}s2Ν߼;wO9Nr:-v'O @a2/NYɡ\rlv5zKxZt:MNA@@'&N(ZN n3g1::cvvvu`4.fӧOӧd4%##C@ Ŋ+mǎ'&&&6ׯv*6M@ (ZH֭[zGt:l6zh!@P*,thի7x<t:h@pEz=5kdÆ M`` fY@ [j*Zĝ [=A@41 $1L^\?Tn݇vc !R4mG ]g!ZcP|6|Ygl٦1}k8''GMS Ug{W(-BX9;7ds-4lU@ +C7GrN2ɹ+P욫ZL+rI:SL^fmsdSǎբ aWs~gG% oL -.vN# X7>l$+~;ٌ%|hCxfAFr*Rד{w-[Î;PH@@wy'"QU~1vy^'psOERVUWn*ANET(sju:oڕ$┬!qq(r>~Ό *%nCVTT1\*`Rnkuk%; EɑRxNhP&S HԴnd[LL2UrC!7N۶mٶm99288f͚s: D"cKORوF V(XmIw6FQpPL͆rApn]¥EC$ wߞ[vVW|GvaJT"}Ql:hŃ ,lZ"nO[T{QqQ 8[v% {\7< (\@S\׫֟c#*e QmB}ЙHg$  ٜᯄ<*հb?'E>T5Ю.r> CǩGI+USVNMϧb _ܩ9%rZd4 z*%ѕn.  //SF FՋD_:|?giv4Ri}jҦVts|Bl6ಹ-D {2ETDr"gV"vΜ+D,ۓЩo,=څ'77@h[WТT|LHXgT{'Oj׮۷ƩSRUmWCжWGV/KE_ֲ{P tAutpkDKGiBb@:U縧;5 Uv(#aír>5>s?m#hPggD#ןƍFڵ";;:uFFzҤI.]HZ~b1i%@㴑JF[ИD\iItⶹ&:$ĝ_0Xid.Lk~'c *CD/zIm"Cx|NK@PHB #x.\؞ƀ_H~>EZj6ٻGIKhpͅٵ'8D|]t,{_}iZBBB}wXzB%,B1)yI bhrh&MիEMA_Tm$Ēx nL{)-%q7e#ܼf P=s2IK-Dp3DnT\9ɜIM!@ DD BD@ ""!"@@ BD@ DD 5'"2NÁn-Fdh4r1Cq+XlCB¢rpz? _DN'Nr$j@SYjwX,E#Ib޿dNs"3En~q8\OHtκ*V RV;B@*$La変"( 'Lf.4:INc(GqQ(&朠W!ѣ5tp7ʋ' a"U.UI@F99-[H+ 5[8-8'-\"9k<ܑXw{Lwx~Vor|~e.'3 nH@SJZR2LY @êC)(7 (H n1%$ -\s˳Qh1 \(t'iiDD-8~qєǟKM x2jr8>Zձܰ Y%lZѣb[?|]^d]4^iKwer}YۉˑkН'nC9J֖ mB9G3>A~J.Wβ pޖB+HJ̜1/חroeg3ف5Z7C!P}C#R"*Λr!b˼5{+U.sI)iN6):YIz}f|tM|s`ٴ, f?,6>o=Rfz vZD~>9Wf™'rWu{ >)e_}mY=>$0K`^ {984DM#fmj2ve1HNa~jMD%xPUۍ~v{)4:@)iIL-,_ =[~4=;"P/i@ߖ萜$N@`D%R:%]q%&Gu71Gu@ێhl=IH4#CiԽ#!/"b+ijOD[|YReѻVMDֹPg,3~\F@Ae=C$P #$ %50L;ѷ[C|/8ƢG;IفTֆKyԅ]Y e괥gNԲ>kF_(fg*6%Y=Ҙ @A6C}T]c %@k#W7~47?E{p0&"DVQN<Q70ͥh:˖MCɉ,p3h~o4}>`Oŗ/aid5o["A7V*bkk_ici ]A-2 3m0%Z 6,_D,\<ַBLйg'"g&Mv7ɮ#l)hPTmQ.IFQ~Ӹj{._I?Q?x 7;wu=oUhT?p푈d"zZMZZT⩊$ "3FFߐWA$:E\U\^{ >@F:c4z5T/TFhݒT OBf,~nJh47~K aT2HҕsA:(TOn!"Zr_^-f5 ?c/w/MDc@ DD BD@@ ""!"@ DD XnJM@pȍM@pp5"MLfvv2{))ܰ=d$3t;heRsN:ĞI[3^Spc?xUzfq*oF"pffLLD(geBsyuh?#^ <'q ^8f[HDf!j6G,^O&'!^'.@` 8L'';# NfZx7b}1b,O6 B̚rEGG0sf!fkt5=ٿ#Ry`lDXC~'ﵥ؜r:O`pKwpG?x .;3ˀOG=(]] xe:gj(1F JY%m ^SnؓM=ϼ1AΈ&gkf}yGhstP^KPя1}<R2i“]~/'|'v~G殲ugQC?ZlI` A(zV1#|\Ħ0aЯ>ɇ 7+1R7ygxKM.nYf!<<ܻ|)m4aui\jT ,e0ўӢa۶bԕ5|ѕ!YWnqT2ǣD~6heiX"ֲ+Eje;t~$ j;} H*60Pf~z''K=]e ZseZ@iGViAR\9ط1 ƈ;+ST@bq(1tDn\sМ2rL|,U'wCh}C՞ɍ42NYEO[@ Gl>2k4&pv%Ofp*[wUr>̨GYv8q`DcO$_@@٫%W%7br>ZʞBt{Jy55MEOIG#;:Nˢ|(. ^GAh )ܷΨCs^l<9cGϥ(R|0tv;ZS3*nWa6%\FݳvC%yB}zҭ׍dW~ !a4M&Q- mu'?Xby:=2* η)fGrױL :E:,kZ?)B|dv&!cA ydx|ipw2?Md־ޜ&t(+X01jp/ R7#Fuw[e7m\o"qJEt  Q*Ԧ:)~cѷȓe~ˢZv56Tid9JXH̺Pg݊xW"JƦ}g(h} գHH[IvT{{>^ڔ3P4鍖Άt!&"*ܧ1/6+ )_G^+MҥKq:,]=`EDGhsӛ,]T@ÆSvpQMq)) Yn5j`ݺuFTUu'❱ѳ^K#Bk>c`R xnͲZ1>ɴ)&U0xR2=f9'V=c8?W'e,ZL w> WX2&'Wk*Γ93#}#iy_ _ikm'm: e?z ᐤѡjEqm IDAT=.?@jUl˓X? k կcs^lip23罁u=]zV_~%eʔ!44|K rLD8C25-Ki]YjpNbW×xls"4$Ĭ럇3?~* 4Md^^+`'c$+o,zSywT*+i\f #el' Hlpy!9G7j'y"F? -\{HD\DD"u$R4=ʚLsTLNJ|p+YFV$P"r²*|V7{lfr/m;dg*++y܆2Dso{uM WʟHpo:VG}|_.TUƞ~];IWX4.r4}Ů 4DJe l9}wq<ۅ* ǤՔ g~ ˅ӖΡbCFʚ0V]h7./bOZ^V1I?B'J,#+*د܌Sޛ:XGzYoM)o*'Rwp:S-"šI.P+ 떼.i,t^a؉XHZhO?HWlRgn~_SƑGzڅiXTx:#"vT[* kaT#k´sչw4F602zOPH5q?W o$"[s|wނ"<36a_=TԩfY\ۈl}bz=3f x*SV-ʔ)u] okdA cdz~\UU$IBk. n-V+w}7B :uZjaZ/ɿhv9 g|B2F"dԐ&XCDξa͂[]qF, 3DQk @5 g/rj7iٲ%7nm۶B7t3NDp rssBDc׵ȶmڵ%Eɓ\dBDX,BBBذawu*T!)v_ӓHEoa.ZaÆjϿm66mrNŊٲe thu4Fs __µF W{qqq+營.<<Ʉ?09э߼qh4V+״!"q! `l@p]H4@ ""!"@@ BD5eӉ(HFdh4D."Nud9JN,;xXD2S7=$GDRlRVBD]DE!5$ ޅFC'i;yՍxhBj j_/){l˧7G\K(@F9LMLD(ge(\V*Pd.coDd&r~G.Z۝y"@8 "x@)h%-Ix,yaUʡRۘrDz{-<ؿxAẼUd IBˆ?(ۉ΅"_8L'fcSY':ִq%~0tBF0gGfL֗n]LZ]fq*ٿk'X2ֽHQɾ9tBOXPvCYwn%m /}ӥKW6u'^#)~&?8dSdFөͿ2iTŎĄJdntV~VI,x jNɟ`t82V觪a~q&{"1kMTh݉HDf x6:D pb&YYw!ϙĞ`=X]qov r=gi 5h0FI^\wɇܺNֵDu!X=0Q>hu~֟v&e̿/s@Ag-OH?Ĉ-]u.E_Ǚ8zˌ1PnwRyJ5 鋊+c+'Rur77»G1h&r~ ,o \cISܤ V$t]UxႣ$ hR| TD#Du+SҧQ ONN,}+Ίn e̿/CFS:; xgmE]x*։Gvt9F_$w9N;Y!"ݍYZ)?lYq7Y0t[˯sɮ Bhh~M \7*_dP;FN U[OFG/j%LStoȅﶸY7+bԟ5(Ԃ[0AqᑝgkY+]j0ى Jxauy"3j~ )sut2yev-M;T*42 %i$f](uknEY =8SX5qGh-`ޚ;nGDL:$/ÏGs*loEN 0Qea J`F$x6܊Py%4Z=3[EݸU'nŁŃ>L ?*5kt$\ i[\' `Ɣ8I1K>TiZv;iT͊ MbX}zocU}E428 0P. NDC j`\mBCP?ogFO8U`x+%ANj/G ȻL][!G^th?5zgff:;[k4U[TT [8vWmOPP -u16LTUIKKCҀ^<$UА0ZDwh4 hy.(K?h*ZW "jX,׸m(!"@@ ""BD@ DD !""l4+"FS "rMM@5!l4o0L47g0@L*/M@ȵF#FS "rM"rZ';# ѬZx7b}1b,O6 B̚rEGG0sf!fkt5=ٿ#Ry`lDXC~'ﵽ@۝>˚p=0'@MGI&Bg^ ; T{?͛Β_pG{ MM2-e߲'UL'3&&-aIBO3v^ayl4VwǷϜ1yӕFW-esm)g(<w 6xp׬\M1cSYKH0eϪ0g5,baYpx*uk $$|jtkarS1 īV~4uuEbSҠ)<Ɖt;!J#gbMDhᄀmU/*->=L90|$Л(2D^$qޗ4ZYVaѤSdytof'ٛFUiVb]vJF1i5Q[/K&jWv#[#G6D\x$h;<9g,!ˣ'jWRݤ#) QCh^7nyM@3FS "rM"i$,,:v@ DD BD@ ""!"@@ BDMODukW,gRJxDp4@ Dص+$ :uB|p( K BD '7{bA_vYMn^БGp ͢EDZez9BNgueYBd/2˟M!-{2pPwn֒]o<΂:S֫°od{vgĻ.0#RM4p8 7Wc"]^KMʣǚO>䵗2yjZDS<  nQit3:"5o>?J1eURDz432gC&veǘ_>jC)4ׇ.{\,nW.;wƓW~35cLv2> EccΜ=䫔xƮ56y:̛HO(Β]Aݯbc*>K%R<ח94~)߭qXɹ{O p{MOj~OU߲`Du}V'y@fGqf%&c_E~Jltv僯VUsK]cӖb ңN(9NcwBuN ?Ùܔb/F?U sW|1CZDzUG"W**L%-!>(Ue;t~$ j;} O/Zt|m8*\֦}9}e,A CZ5'Ʊ^RT^%5=$oZ͉<ުfHD~# % kí)gЇЧgo̵ۻz!w<Ѕ~: Pф<6;{I0DаTܗ_MFE"K&W2.wL~zL"Ez4zeKkIZ=wlZLDKd],m#\b_X2V=oB[fИ_tI{rrsUdJHmnG&9~E>Xb8o7S~/$=F/>E>[F]4fEW ^Q}yD4P| d،Z =킊DB6*ʕꪗ\3\wwF"s~ntzT}{* \t'xҗ;k~Hp|`Ͱ@^R.ɹ(w& ˟qtXJ!HF<7fc+څqx4֗v,2r~V|;wQmm:5XLyR2ӣK\<'?wq]ƽrwu,tTW.nt֠},DKŝe+q_UϺs0[H8T2wK{ ; ڧwKa}Y|iizs Cl_ xmr6wtIԛoҧKY8.BWKKf$oa[FN&=ިv{Mԍc\̚ }'"뭔њ~#ȝ_&<#Lb>Z&]C5%ANj/G {.\fHpEVJ5l͘MԩKzFL47g0 U#pևﵺɹhԨQC?jy?_jԨ.M;wbmh鋜Ͽ>Cԣ5"QLzF&!A4+ۢvS`w\Q `ٸwx3 jwzBъܨtF @ &!"@@ ""@ DD BD@@ ""\օ.]Mt~ޅ.]Ҧ\1צ@p p SOg̥lؗ 5 ՚Ё -Ŧ>T^Lwe b aʚL*S#BGAz"qo`ZbhOyoE\O> M8zgz">z͉0di2^t1oa3kQ l`'cz?J 1)i֌6|aTijvmGu<޺,X;K6r$ FTT7QMDk-KpbKXJ߱׿=>߽k=߁;S^ HgZg*j彗>2ʴGϻ(^f(ۘ1'䔥}#1CL.tÐǫ9o+mGPS *OUd]3 w;?x S4|Gw{ggS9.3w;024d_"Rd/E*-doDe͒%$J""!DT~%2s~`43L|߯y5߳={>y=߇f ɍ| ̫/XEE (9 D4HJˮfrvne?i:|ASxJs7A3gZ)ΕP=T3O! ëd=30@ɫcyiDq!^"u;U"|-FOz/<'3~aj)Z"ǽE`d W~uplc9nVG ,AN}9/Ϩ 5 IDAT}"_<ƉG8S&K6DG*"#g阩ф39t4%kW*- eq@Hz(_$|ouiC5>cʎ#|t-jșI?~l_aGPx/1N (f98:<֔~?͟W/gٍ~?dS&VmiSWہvC4_͜: y9,Y(U6ͫ`49PŪ ߱š>DTiMM"" EX2+^{F`H |[ Q2B !"@ #eaEWad@x"@ DD BD@ ""!"@@ )3lpiYe|||0("@p;t;u5iZ'ا$UC[`Xĕngq8I]C$ Ri疿&.&R,r"y-El#3b;Q;ɎۻD$3b;iH JbƑ|?W3I+-WXnjg1k fN[~ ' I(n$I!9IjbQ%UN$4֔VʗPXۑ/e⁞.ЕS]"-z@e4")$L'0y(f<ޮ]0>nՓʑ9_YrW \QDT B<⑋DdpD)8Չݭx7z55dWx~2:9y>3! &OLֱaFqC>ŊFyyd,HY׶1M^xj2[g{HqKihUu3̉jMc;8Yt"MKLϱ9ԭ|# QΙʼ5{Iusϓ2!*wLGm %Ȩך.^p 9] r6#g&22BWknQ;{xBn.]˾o1oWO 0wG7˖`;9l:ع3 o=_{Ps跓׫%:ܿYKg[ד{NnN9lq*z&6F0ꩻ ɇG1x2[ԥ3/6\Hb,{9W"F n @:niwvu6P.N~?ēSKku{Kso+sj#U 2ґlY_b.IudPu#xlcl;KժazbD&)2=2~%*R18fQ;XLPZ&":+\l0 X$e!X (~帿kK|%%c0hd=ȑd;JJJND54}'0a'G ՍBm=ٲOtJŲ #0$&(a+7TuԬ$U 6k.cG*2A?/ݍS( 1=UUy[(CrkZ,Vs:\'6ai=:_FYC/2ކIşsdS[%S4-^KWeo. :o;Յؓ,>7Yjí9(5(tJÒhĭ9 o0擟3AL ՒHoUL ΢gߦGU(_4v$ ԭi?TqC2 'Pe_㥞w!euLAǃb2FIR~c ;XFd:{C75"?2nۤ:% AeE/D) x'55Jk˹,ʹ Ȓi熿N r \l}wOvZ_~(*`$%%!ɠy*kA*1}ĕnpl66h?sn]@p(X,k\?O cļ@ ""!"@@ BD@p{`&b™(7Aq\l6RRRp:ޙ7 I0̈́bX0LBDCVV)))ԯ_pdYD7MHJJb֭PtڂHrr2#22RH1@e"##SEf+.(cو(fX,<OBDMӄR̯AáC)"rQ!#{ <#2RkRSS8p W6ܷ3grT%<(OCK Y |YGuÄb-,its˯ ,fEt:Yh}ɳd!"R <#w\Y :ަ؟IR9WȺUHq$Oxrqzj*Wի~D$EAQ DRy' 6/. gtl1WgڵiKyaZTp yt{l[cшZ3h0[57g ̙29 oLv;$!F?2Y96CKE/N#n˘?gR?VHiS{ʕ+q\$$$p q/k}xiŏ0=EtԒ (&پK=Ky6BdNRT*xՓ}ҹ\ss#16Ӳ{KJutS pc8$~W"zA;+5zfUB1)8cD/QUm&:jeZܲ|rVk5M+px{WIZ}9{@ &(5 ~wgA;v,t;ȲW¡r'l!_7A͟t^~6s$I#;[SsL߬$|h#/*J ;E##U M]~']ΨjlCQF;Q)$$?1]aY'&֙L}}4 #_iMiQEěm4op}r NQj E0E]A@!Ѧ xH;!$EwJO# j@; nU*7{!Zko8-^P/yoA"GfLyA>zq9"\ktBw%sHޞ3ku:j@EDECD4]=GDT M XE@5T)ipW%,uQ?`3 V ^oĪDnqZY:qݦ^ {?_,d=GsQEK踲c(d@ҳ9Fi|=)ْFQyke '&oT:Ȧ-HkH$ݺ5w:\qtPv6tj%WdQ׺6%;qz<8Ҏu;8~դ K%q.'ft`ZNjEt R9V2˻qR뱡S~-Ooń[#w4x 4GL2 T woD캂L=:0e^R5pFE_CS{6k2 Q5 ž\O脶͌Ӝ. %ޮhP2i.ds$~QyM.>EI(](Rtx>}F-O|"rcF~z4iW$ݦDMF!"Ed߼͛7Ӷm+ѣG+ɚ b!,,uѴiSbbb 4AQk+J*Snh{^^uȺ(EQʺ6 6PlY/vJ.ͦM̼.YQ"M$Ƣ{.r> =\ҥKH``Av###<$N3,@PPPKPj^6NAp0@ ""!"@@ \팠PȝBP|P冼""(0. FJJ NS }Hl&44łTS CVV)))ԯ_pQ&iIIIlݺP1VW[P`INN^zDFF )ȲLdd$u!==LqBul6 rC""(.(GXwRСC"U}uscyсЋx]'|,ڏz,?wFO#^${z8żs͍m抈;=k2ϳ f/Ӟ~6]a}ƞ_j>ؗ9;2sqˇ[[p-thѢ+1L\}w&oegq})VP/dT\իW_&PQRƉh$|åv`0} ӛ?~qOF=Js.*7ͧ)tT{D^'Mვ. /tQΙʼ5{Iusϓ2!*Ipu/ äiiANvL%Sp@{~m)kgQote/LdH-g=$PC`9t?Kp U:xkDN8ڿ2Oa<8#vb Y1Fu䣯_j! L\ޙ3c,^(b_-8~$|)lD~/՝_}KgZr޲12[d w]A=foz Gu)l^msDZ/_S+uogשuu7j2Ci7f_|)#!]}ɋ\a?o֑Q^0(7:mY+հQ΁%n`Luxw#Qȓʕ+IHH`ڵ$$$rJWs䇄DP\#bl9|V#֣ )#!)WA وARq:gj.,mFK0o .Cq%_owgc1n8W_]%Np-^-|6s!H,эp]z_MNʵx54DY&<$O=v!N` K]M!l-i8UM^ H hGETxC™̷3H,g2W;jI$kxT\q։(Y4JwcAʹٳrF_4F@2Zg(a8R79jC ~6ѯ1: sts>?o'" z9%ɟ2uSܑJ%d$hWʙCF *&^""UM"A^^l&hVN;utW: qR̶ٞ}(S2_:gٵb5's~U~ߩ.t]Ş|߷&]cKշ44}b_ϞzӃͦCIBwaͲp*6NFbYs.ۅiK柟`]%}0W@SL).)cO MQ1Ysv.%UUQ5].ٯXr L+ȗP̤WǑ ޷3]vP{?s_uY9sQXF\K@P%էO?ɟFL13rhӋzXRRt`< ky & @ +<"Hƕ~h4?Z SvU`jጊPcpwz'-O8#\WĨr ă1/S9:sKtd7E1 O$ק(&NjJX[HLL$>>VZ+ RĤӧOFF>JvȲg}F\\QQQErMI&1>gIH6%$y¹=X" B XZ_3C9ʷƣ,"zvy¶VxuIDATbE1[ACOu~GF3hhdJ7iXG6axA;nK[LDT B}l|xr;Q0!\hj2bф|4ikcR;@S>b38L~?}Gm;R59 `dտ$_Zy1L<:z4J_8/?O"Sp)WDϕiWbOnIy^ 6|9qhK4k'9>67i7r(S#<76su>;2\~IӒ&P2w<3C[dHFӭ0+"Ûc Sg~ö(!Uh@'l,b+V$c1'>}Rnpy_<^#>CzJ6/1*H=Ͽ8N!"7.*UutEd޼⌋ڌ՛eb .t0XWdӿnFIR43a^o0"0Wf gֽ!cAJ7?@_!Z ֡0=;4>̪&bM2ve찖2in[K$U|.o9wҋg >LTp%_gf5Tߚ$}掦~DxN\L1;㛳ywΨ7/E`1ƍeEt( !KQsydi0>{ٟ^Yw\ r#t㧕Ôfx֗wfjۍ~6NǻN!\ɇ9x, CxJD$~`MF?^p=֚thjfU ˉ& 6^QZmr"{>2ddAJχ=g$5|K`)2b|ϧ8LxlHepjp,hQ )Ưʉ9c2gq4қ[U`2f%sGcyWΥ{eu2SQ1].̇V/o@D: N;9hݾU5 B巅8yrR\ ^ O2'|:U\ǩ\SD2Nf`=O=B6T,__xJ ~alZ21h箽L9wK ~wg>gub#"8Nφ~`ڈENrѝ޶|3J\d7i20X@-CF#>d ΰB1T)(`lCny ;55'GxsSщ5:ٹd$oOZJӎIhN@_od|bXՌ2 4Y/;îq$41bSЯsriO~V7 W瓁wᛇ}Ͽl 2:ݘ9 _P!Ѧ x} $uOIUBŅGuRB(=t琎CJ1~Gu3'} Y<;gǿjY ţ+he s4ʇ~CAl'nƮBȀ+yZzA6mG]C2l`rx{N~_N]ߥT]i- gdDf$!pxtOlӗE3:l'JlGܕٰ4/`#,]~,17ݴ G@wer|Jb${t ?2Z-*ssCSx"ȋl5wEe#}~ViXMu֝5ϭH^R3.sb{p<&MHƝ-j@$c O*dcZw@?2nۤ:% AeE(z=4_;0X'&ϓe/r |3G%bc)kdB[bSa4 BP񱑌ק׏ 䝬41ERnԾ E?؃ۧѷb­DUhfbՔ)L8*U/ˊd_JV'^w֗<`%w(JHy}W?q5EAT~߿*-熻˲+\pz9`N A[$|^ӱ 9O7׸K/4MAoUj+HJJBAU$IG <,UZc6+)x6h?sn]@p(X,5n o=%.Xif/v(^'BD@ DD !"@@ ""@ DD BD@@ ""!"@ DD 70Aᣪ* CKEAQabfk!"7˅f#%%->.$a6 b`2i4?BVV #2.U5"rx]JzkZ"Mmύ_õo"k?ͤ=в wjD)wZ?~vu+KtXŘQ56ظ7D@rmMSoU$gCXL~ݕq2o <.pPC)^\)&yBy5>'y;!^_d߯Sw8OnVӶ%5_>o(Ż߽D<<7Ńiin<*৽ "k+)jOr:bbR Wo$Cx|kD`\[8=/%}9=ng 躎h4vDl0B|0mes~D4^q, Ao +i.?fݼDj15 9_4e\21-C~?26}y"gXu:Jq Hq& ) ?Ń>-Di@4]x,oZ, "R.x@B/(TOL9eO+ ˶Q 4$ ,Ap:ݨT+D#E30 0VwJdT4oHhGјHxԛJ]7}IҜ/\i0_tՃ4 =9Echm}`48*DEDBO5\]蠧ӛYQv'7Dʧh6+͠隆95tM ڪs|2{-u%(Јh&zھU8[C+"1Zx<7DTG:LsXQiEQu]ɛs3YxMo"ނ:"Z<-\XЀVax?8MvQ/̀qlFPu<էÎjN67pu8(>+E?cδ[Ũk9FueqfFlO¥x߰zC jhGuߴ djwꯓudpbb1٭XGu+{:bk0>y}fݚ_\媶"r nSti6mDff5cMIT]Lо".odYtx6AAA8džuHMKeY.4[+0l2pEVPGXXUm-DaU&emk5Xغm-D&jj c[og@ DD BD@@ ""!"@ DD BD36 2NgIENDB`spykeviewer-0.4.1/doc/source/img/selections-menu.png0000644000175000017500000004214212262550403020662 0ustar robrobPNG  IHDRsRGBbKGD pHYs  tIME r{tEXtCommentCreated with GIMPW IDATxw`}7=tHBDT+`k/Xq ػx\$ HRC d|$!$3gϼ;y"F@ !W]e/$'i@PIZM":nsd5#"T;"BPMB D[%QvuMQ؏ _C׆4j 탻dʼnvĤͷ],FL6#PU$z$@u*4:{<'`Er N@}0Le<e#|=>DfB'S~>oTV{#1so[_ ?߃^:;G{ih]Cίc˩sذUEh+~_^chYEeg7i<Ыhbģ. =mZ?*//棙:<q ֟cYzN1b}Vs>_$S}6FRGΑes]:g5MZxW2IIpmZO>֡LjܜؕxQ4[=N2V+ǃm/8hu5F.aO$g )Dք%jCgtŢ]ɜ<_3T_%Pr~%^CR(~7_3ɻYg&fʛ<3,EvL!yS{xk0Y{4<\,BhFfܰ0mLW +{>…\lĽ=7=a}1b=Bc|4>cn~m i:Γ3Gș|9@Ms_654vO%#өP]b?"1WxŹq4SgCS|Ryg똞^”6':Jd;[S_5yH643JWkV`G"rwbB{84eOdul෸3vkvm_'t~Uk!2b֍l?|<Մj'-G,#Q>`AQx\(W $:b0k|Xz+b, yů'/5%*F:xdGV>s:sR*:CS<Bf#sp >*{7z ×0+HMyQGǯmے0DS i^ⳛ#q_H5)?Kz~%[{Ґ\ǿa&,~qΨ@zubLw?Ƒ߱;k90#'KgXUEG9aBCt`Ni{ڦ#ٚaK^k*[iKgGyyE$ j!i.uON`՜h~3MgX4Hv47PqK')RwMhO`rdE';?]WCqi Xּ] @ZIN;B*IγᅄP}K2NG2.Ϫ8\?~<Ǐߐ8u]L44{n `c44\I|xM*(xdF~fztmmM0Hpzu"p*.@r9]Q2>ha r [L`/>G̞4:9N@%o+:A9ZhRy7\LrDQAXˑɴdcb?6g6?דTR<ƠYOknSIR._ZHz~~*,Z_h1VdUs!RբVy~oB !Mt NdÙsȵ;bnB&ޥH܍S8>ay3k>l Nz?k4܎Z->ėGEJ&[x##&Aۚܳ~s&:Lh_81y_Ws[/rj4;j [%P.'J%b^ZOs9q&ƈO~'1_AmdÎZ %` ]`LDž=a+,(b0B?v>[O$} e)r0|?|%t4:#`u&ĿV>ZvTЖ:-{_r[+]q`g߲7É+s?+?=k :WfU4#Q|dc:GC%윝<UQt:5QnK$!ie*f=%'"d@Qj )G 25TrOnC g2g|F-I`3 ÇhN~^$% $Pz [޽R^->2|udؽ3G*5 p"?khޕH/?D3yd~JGX1j`zOBѻ0^RxatOXؗ]+?[ԕv_q>'aFhcT&γ/-͗1`'fLc; UŴiӆrN9.uY<{ 7 _Pmlxk[>{Z]lwX*_TU[LY!eM4DM^G X0g|@ܝ+¢lKT76wYd'y&c?ek=wyh?܍Yv9u;AxVpݎ jimo!"B@.\]?5XQ~t_SFb!dfO b8p' > ٽ;+BJD[D3eD*X*_.':EQjVxlV38Y[yldB4@uƤgvC&~ݵ 1>MN|mgAȖUʣ=Nn^-[Dp5`?Zݦ,f 9qՅ4BВ~:}*d2 mιoְ53iMY}Bi!⎻Q#)uYm۶rꤜMj;Ezysqj}|n^A|"}ER85y,5;v=ji#7YrW%>,,#2&ui}:w(QN`08p@FJF$ѫ?Ǐå"jѠG3h4Wtžykt)=LbbEK^}iݓ3?fOVXtV0uD+hrM h)bR|?Sn2K]SZ4J?#TnŋN+U-Ogeetɸj8e"r3 |K;Xq􎲙J/^ʰdǙW2Ƀ#,Vpg5F'ҿoŢSEQh42wJmS1#PWÅ";kKſ˰bRſMyѩn}*M,ˠ%J5@Һ \-IIu/w c_U2 ~QݜP)|Ér<#A*@ Q4z9Z4F)K7 #VGLj[( (w:](J1иg6"Uzb(6ʺד.Ie\. .ӥ)G(#Qt!\xVI[k# UNUYn_LJ^zՉV. 8.Z)'$9AcLg(je^j#xZnM6m ~]GUՒ,xڵk_jk#-ѣ*&\u.QFZ\[#Jקs1=zD7o^AD*VH@HO=ϋsET_*3SnݏD\k쉬_',-)H*?C_hNO8v(;T9WZ4iꚗGPP9rÇWڍR-6**N$^q`;8N'6$vZÁ*vˬKw?A! ϋw4-|-@̞=7<@A5-t01?D;׶4> >("JN܌bl׻mH(G;bf؀W'mp'BJDD3lذG̤C$ȮD-xu:vN'۱Z %^ݑQdˉr7V:v{1qk(kQ,)ȒL^ѹEO̼&ƒx.$c?19ڂ٤'/_F7^1bD_ul?f|ABvdXDEUp.v;vlFtr9].tVLsK54KY,7 mSG9ѩrBw[>^ǝ(ĉd*lePPP@AAAn7+7i8LJwƭǧK(BBB(ž={馛p8$ ӓfBIsEQQdVSǎtԉÇu2Դ4(((@sβ8ݟ=їQOl9hO )m%7RWmY.da5ɛ?fM~ ʱe˖0D0~)[H6A!7mSRRhժgϞcǎ?~fg/gFrL h$Mw=-:<^v+ZBoYKy2%?Zv] ܅U,^f3Ҥun*ʜЁjNH> 7Wb%h#+;/FʑT-UCHx0]#ֺzgdee1lu#LH5oƗ_}Y"m JRJHbY" \+t̙ "fذa4xbccٺu+>>>BPPuRoG~Лt.G]ynn^uMى1oIE πH:1)hgg"#\eYIuu*$BWSVR_s *EE<+.=#9Tֿԟ/^ tcfMYv6]ih)h"2jXZr'dUImu𽂽GfnŠNQnE~y}[)ξt֟K.UmUN Zw96pujIdT73f-LH6m8`s?Fʅ,[0__FcL2˗%Ԡ]CI_m֮eT%@UutSޛG୅rSn!FkM8I[w. O :twzXz _lM+c&G)yrMeu&QKYO wZSm cnG?|Jt'ϭ'7*ppbcc:t('NJ=e"Ť:"Rȹ)x{EvMLt4t~19ײր{CpjjޙNMPUO Ԭ4X3Sؾw^oY2g)m{ǯ-vdkr1كsY][O#{_!!~) /Ls$IEV4*Ϊ煀:v $YU*{T;줜b IDAT+7 tؑ^xAH-hѲݙbF[f`XLF[uS4N&g㖻|'׳fg.y5!^!#cU6-4Xω\U. ȯ(SQ+/_\ŞNq)F{nf{HI7y0ƘA|rL"D^3fʍ3ưAwS 3{X*ЮnԾrwֶ )..NJ_ĔFAll,6miWTl)73~@P#t?=LJh]@ 3@ 䌤,ӦM4&M$ 2@pUf$˖-Wm横HԠ *j#"2s!??EQD@BH5t2o<)D QQƣʕ[,Wg%++K 7wuS[.9>~{~]&JHaNuȮ:1$NEjhe[^{5rrr܊o{rW Іs+i#Psvh5enkv=F{N.uդfqmժ ~! , 77g&MI5+j'dgNzŋNa^ vxr!Fv' zc;ﻇ%-&4m oؘm|f.2m۶eӦM,\wκo皎m*S]!TJh>U OάUD*7VU^2d}4ai=I=0FNҮبa9Z2BuvߘD S^zuq&ˊgN%6 n;V ]C>=||P:[j>!̯h$=pߢ0zpPa9GwVy2xjȍֱiю\.t::]a ~<[.g+3T⇧7:8= E!$Vw{.nXϻaYG5~[GYq\h16l+V|wNJ/~}sa714DK7a(6[jX)jfqX]KF:l].WM1cƌa..ĝm6\ae,hm/\:EVr{hZGd̏ٓ"‚WӺ#:wRdqyc mߞNbÚ֯7=5Q]n`<ֱe[qlB&M0y*S 8#)^J3aY.^eۦM/?X˩K! "Ų$&&ř3gJ͂hDӹs2V???~zUbccyx?;E1F"h?[￟KV`0`6KgC!q%fo.OksYnf2e /:!C$Iz C1 8Bmsyv?>~%kj0Gsܗ_~-lA|u($S|+l'}60}Ii"2nNnHMMeѢE̝;z/cFsb,6Nb&,~qΨ\m(N2A4Ԣ5J[ӧ=O= .$;;Yfo>كnoPu4z?vlGpmΏ`=nđ}|$ Aʃ>HnN{2?b↴XfNu[D'\**IIIdeeMAANº#GD$6n܈b___|||0u.$bе/k9KH"t)= z1Ѩ;;f($aZ󤤤Ta)ޤpyZn\=\[լ-<=m!XO{TI[kGeI]ȑ#CVV6JYd fFc$YYYyTg^1y@"|LX8v&u-XͭZ11 חQXI{P?9Fu']O94b;ŪcPuFrp:vl6VR,:6 ݎ,qZjQd$5Bڋ2ӻK{)+:~7 ZAiV]^mieT<%.X Zʆz"^ȽӦZjY#XK %wn i8uGlXy;%㼻}(S!FkM8I}*VXd{&w7\&\B d$5o(ZeСHd$IO>zbCzm/ТVձ9m<- #2Ї{GVc~z#CfPZNHjRV"#`j6^(XmG-j:V^ڒ:,:vT@J$߷ Ab$OjvUŠ*!ȑ#lܸ%K[ooVd2XD|1բZ'G~uo?$4`M+WUD̔<\U]M  i4z, ޅlF#X,z}VkSք`J&f#f>ZMLoko5XSҘo`~#&BJmzޖNgٌRD@@@#)V0#ٶm[5kV?*fiBH ҹ7V r{IiҺ7~EV1L2U_ڌ~]Wd%ʓ1b+d#dΓ1|?MC1hh XNI9jŀ)j{v-Nqsy@ bFH,KIQ|5lT@N:$''[ROӷoߋR'lT@Q2T$ FS2VsߒXv؁AAA5kTKHt?Y^Ez *#)'iH LƋ37~.o 3$'4Qh̙3g7j4C.z)$%ӪAB\]bZ/x5Z4N{!%TUN"F3.?999dffb2JJ I\xz\*}UQDMff&xzz F=AȒM*0+)wc4:!.ڛ܆\UX@[Hf!˕?qQW*GI^DD>ȘvQ`:FOY[Vwul_ΥSnp{[Qqm[&eXeVr%-Ej h%$!/46D4(fב4 jp5>[VܕPp:8\.WG'6).RHO;,ٕߕcSM(]c7䏳+jZc4nDrCYy-!Lu-;UTt.tJIC~2ii6 R~f_9Rq]ci&?rt;,c@LouU]Z*GRUi @?FfxTt5sSr5b\h>|TM-OKzG%%ג`93=:v4} IEX~K@5}QtºzϨUkA'|}dE}9r-n1pF<Մv*W j"1Fc $y RrOq&3 ;K`?.]_>ݏD\kgCG#QJœ$]Ek@.ӹlGIt67Z=ZIN'OQQx!*c Sĥ*".Ho]NJ: ξPdlG /;(ǡ|)69r(2zdd2E-NI؞'%dbW>¾^(}X @3<{ޭlJ׻ҸdAÄgkƖ >#VF_TJ&2s #}9ڱ*uQ^[xS*5ubyJL7ȗ  ˓t~uyu$,hlPml[ٺ]Ii2Zd]d+[ɾ|FR٧kqdw+\-z_z I9I8`3j߼KR,h jfdlVxqޗ r.F4 04:$ܸ gբt lZ?LJR8b2q 32rseas?w]4a m\ldohtDl:K>_kiSYR._F̾6N1(L5g51w9|;aA-,=z&00 ҭgrp~:%qVqNnI0JZilF.ņU6c4my8lExh$Tt 4֪IchM7:Td9Ӊ)|z:Dᩑ@2ei}-]8]$&Wb~?]zVuڱ/,PFT/:\$o5I>5lIAS/zɓ&a83- }JI *3~+9S ggW@%#2g>L.R^GOF Ā0i\mgH8dP.fڦD4N ?p)rKG4X>`FNf%krIs\!7`Ͽ_:>b粁UZZ O H@tp#vgCGR+EI8vq!]`J,ڻҩSN^iFBksy@ i?Ί4n" YH,٤pYRRRfYJcbǎhѢN:E޽+8wo}2&%[q(:ћ@=;Fߪ52)nzJ6+%k'/NdHP%3;Y+ƈRwqtWAã仫=?JǨѢx症IAу,uӑIC/@ߵ% GqNW Ue:βӟqM0WH-b?mY($y08NFM6tBB*ȖNLH !- )j|AS/IMy4<d+aMCC #<O0Ë&(`<<^[b|YxlsnDDΰ>yFZ} SGh?@s-ŗЅDb6xxx\tWA׷* FŒI!x xZmx hيch#[zz7 !44dmKD$U>{x=k+2lls>;=D!m:.0FyTR]V|CQE V_"1zajx^79GФu3T_!Ͽ!Sj<̈́3*n\|UNnm6Ƴ3j.۟Ǽ6baÆzE^CI?ݽhs-fBWHjrSA#9yU;.Zg^1y@"|LX8v&|ͯMfh"#6>ޒcFeRz}gplaٶ5GKw)7Ghџz?h',`r:YBK==O'çįY:Z_7 &u8Sf#|{?ߊݘ"D ̻?/z;'&1G[2 Epck6[_Ґܽ߰E`?Y#hng2}m8LJ fyxd?܂_AjKEtጘ;l&QcgqR~guƤ'V@pڏdU[*a|s}ٲ͛GaԀ6cciQnq&|+W296'7=hbzKEmP&EŲWd \ߺ>SD&9+ؽBH,4tj%Oz-]۷9d:Kߺ`-:Le<1t c'Lf .}76Av y1BnC[QL[q o4{2vj|w@pMЂTy6}J?˜n7U0}Z="#BH@ D !$@@ B"BH^pƵDF-=1e"6BH`ۛ9r$=3Kx_B"IC3b E`;vtĂ]>w)J3 ێrZu,ZVKAX- 1F"BHZ3|pIIIٳf#z=NVB"J zł7v]X,xzzb6th4!$00`6q:"0u7xzzb2JX,7lFN'.KɄdB !\}hZf3zEAcYZVtmW/dDPf<<<.=P Kt7 F Q0 FhA2 F(Y;gIENDB`spykeviewer-0.4.1/doc/source/img/plugin-spectrogram.png0000644000175000017500000003634712262550403021404 0ustar robrobPNG  IHDR#WbKGD pHYs+tIME t~tEXtCommentCreated with GIMPW IDATxwxߙپMφ$z(*D(RرXѯ"(XQD lߝ):$@>>l윹3{뚦*@kײm6JKKQU`0@ 8}1L($---Z`6QY1a0s2zha9@P χfܹ :UU1 HEEEgΜ9 <LDDj`? _~%C b رCϹ袋BFa%@pH^/K,aРA֭z o֭[;=zaZedR! )++ài k& C%X]xÀdd 2.S'6ضA& OO_Yab[h !|B͹ѸbH7ꌈp  a }[`TŻٖ!aA{l -ޭlV$6iCT'zٕyu0؈MjDID(h^r7o sG>$#TZv6{+nw[P7$ɻ͹ *cgz2 tP,DRiڬѦ `&q2u; jER\~ia!lU7F$ƴhMb.] &ٓIf 4jӊz,^B54$(XC1 Uegg|̣9\:HDG5]xKv݅vcԹd8%tοw^r.ȥ`,98ο~9]kDff$%(|e Q0 =^+L 8gt뒎 7[V;Fl矪2:]QFVAc4 qV 2rsK+MQtkhF=g͆J[rr=+lȚPE=jrrrPU-[РA4Mc۶mȲLNN9if'X8bHJK'5~. 9P>k 3ݜ9oV6 }L o5_}]uf}{6B@\ąm0!%pݶ 5з>rXN6W9 9; k;װ@ &vǝf ڄek)LbK<-m}΃?Ljip(?lкw8|G?B؃ EC'׍e<BGf͚c~?;v@u, 'rQj܅I&gnJ>?n4sLva AJ PˊPj3)&-ܹѐCEHZ_hER_Y[Q`g!>U#14N*I~A<|»qj\J-V$\tz۩~%[aْ||6نD4hL%/l4!G5 OJJ 999|>$Ij=f"r,FѠM-X= ؕg]Fg=5U'tTutbBHiS,2H#j=@+=[T9v#_XC<+R {/!jxmI<.Pm֎B|wJ 2{i0+h>7Ct?{IFPU]nيi >( ](akٲbs+(P XjFuoB*&7_a0:"TtFsJkZeEhրx9f& UH[V$*תJDT1 ٴ݋vS,o.fG4f؜EG'PCaf9N.L%8Q_" MEHnn.bٰZN^^CUx"GX !ow(ZQd!%1uADZ4lb[ 9i@ H`I+v)k_XP$mzu">]ʧ_:0Z2y@Ae6?LOQh7Q-h[ I:Xg|m6 <3m,iq {DwzyJx"GMqq1Lll,(BII 9R5aR v*ObIU \π[lӃvPc$ :[ UPU'ڷH%ƢRZXH;L$h$[pD4bm z/dFZ̒LDjSXYeXod^NkL?N|z]Ԟx,ٞ&vd ,мkW\l9@lLfI8(ݺZ"m2E;:Ip8x%""qI&]t[Llw[(T))BJذv `.L Q"| ʂ{F6b"nŤHk ~_%%F2`&*b4B2 j )6cp++j);s&'!S4((IILs*.agN1A3PvS9S@ _}=F#.&.>`4h'eK-:y䴺h}Qc+\<@ǷOVH8 Z/*;V܊^q@i٥տ-v o2X"vl~5l-MX4nȉ a^?@\_1:c.̣ P16nC3,$;@x"ot \"1nÜЌ ml(ρj;!qES-J:!w>;~ &BD@ DD !"@@ ""@ DD BD@@ ej~/&rՂ ")\H?$*6Mtoi:I|AXHѪ*߹ߑ[@pin$Ȳd mւ&%[i: gmzۛD6JbU$PBHB~f-fz-%Tl+,fx1.-="ǁyxuC\p\vbŪTx#a SW?Fh -\,ehIUB2Q0 J &$CM=74ݎKMy5anda|SP^bNєo;<(1-xv&QOr6,9=ϢtF KKP_*ZȊ0q9;11y~֏A&Q}E+,?f^!b&J3}߿"3f̨ij&8 ] aWroo76 ^y]^iv8.gwywZW<9~Ϋ0wg}w3zq"_TA<~ؘSbhm)nEVsFN~|K|ԬPٽ`"FpK06[&>𪤈 x > <gxgce)y}·|ʭ47yXü#/>zA<_xD#8=DD9B!) _P(T^Bs fv$$"3%h\[ӯsFbϺkfŘPtMT2v0vi;,f?H˯d39_I(s:CZ$&I"UY:Fq޵|y\L(!] F*8Mr"!;ǽ6~ѠMLǘ-X+O6bTj”[3׽UP:qA"ۉ3M;%"/wMG!&I_G= naz˫.`Վ24Y"t9i\=yMXymz֊&4pHGS K.F~z|qӥWp"h?vƱ_Sþ߇K.76!l8"LU~Y PvR}>f羀sc}p#/Lqؓ+\fRp3*AjMb`6KaoKX hފ`=Q[t `);V/CA}šRl [Zbh׷;AN~>f3j~6p}#&&~ӄ-Vg[+;{ߗ ;w^f-3헱6̋ h4i$_~|BVlXH mUeYFӕ܁ ȒiU~}󉉉;a-/+ KN_X,tlև_}E^^ ~PEtt Bf Θfّ/`6[(f;5Ƶd̬7D@ ""!"@@ BD@ DD !"S;VX]hz.:t8$@ DXbH2ChƪUXb:vw@  ҥKbccIHH8'66.]PRZZóje,S׭XϴRu>]]vW[LM z"R~fpv@ Pm_UU)ū>?׭e蒕91\.@p3 a41GА#(X O}Gx{`QBYfr{tT 8UUTQdOp2EĠ( G0H`=[|$X\4܏&^ l}a$|;)~; Sf8n_5i=kHrͳ\ҫ K7P^?& j3_zoV§Ds.C?7am~g9Z:Kl 7%>u;%}ob=H2U mˠz"b./rk]KxiY)?p;=L;ڢ) coC;rCX<,w=o%iϬ3繮XOVps"!MmcLhC Z~}}9![gnjXYl6Zz v{{tf[?^ts ^G?[e"T|l5Mط60I/ߗ|{Q[ +I&gT~)uu|DŽ[#iT(ʌ/zf }j|l&c3V҄/QQ B!!v UfK_᝙/rx̞xBM=&|?|<^nz1W3vIP*RB:3VD D̍]U-$I@+72 JVdoVZM d~Ⲏv]W,)-Cd2cs9&X-&ZnC~A Z) мy3֭[w}wDG:#h޼g :wx!JB_x!=B/l)E@ DD BD@@ ""0Y [p:(1$D4! z)(( 0I0b0Mo!"(pMAA:u">>ˉtb r"ӱcG\.A/˸\.ڷoOqqqB^ѲNQt] !8(6p8\PW)," DpmE`!l޼!"-;ܽ1 F/b O.<|?<2<`7"ĀQm6ݻY?Ż UcמN䡋ӱJ1z\2ܽi:n _ޔZXTx{k QmnhXn1{lg;<6&$Fy 8+/S~.WYYJh?ЁPL=7=N(8@y˜>ljq&&S*`d~ cʨ !a08</f?"܅#iwKQ(14y .ފ?#NUә4{9;$1}00>͜9s>|Q=pNH_M+*^Kb/C}۰Ώ09ﶝwǻ<3sfߜzUCyj/ڛs}q+Lbep^tLFyB4Ong/7u]I4 5+ hȖ3nM{UR `n`T ӛG- zm瓕OVVϧ=-j艄X\<ӮbҤ+Im["2}-0B0 C|2E)GO{N.Msezh֣1_q6CIDAToaೈ5JpfoZ*Y_ t; .]ڎ{ے==&\unjX904JmbkQ5:L0<*w-oS ]1~7N@]ά,,|RsXlR7-cb4NE DEE1o޼#zT2'11)O!Y}Uųu /?4[>rLh?1W ]Do\ d*c9oquq]Ns M·gMawʉf@̜z ) 9q$Y QZYHhh!T IMϜH￐xX"qeܲtТխc{մ?uH>х]7=.SmkoD&kل42㌉Ģ'5T@Hp{ ]/_BHar.`C왴IݿntꨚWKh|tDl7g{!F,92=q<9?l- !hgtpbjhŹݼq9k $ bM{_~.{ &RpްQt>Ly€!27M53wxxyck]x,dC8rMzȋ.'I*4ga g3k ?d&"Ryk| D? ORdffү_?V)yf+F^y'eYf֬YdddxV[P7.$jg޽{vZRRRؾ};8BNL(:UAMEr讦Ӛ=ϒ%Klr}0giZ"biɘYorUm"rz#ݺucɒ%^'%I:UGg5AKKK1BDNz/B*۶mnhf!"(68/^LϞ=III9. iv lA B5zPtoU-0rHEvwҥKiРv]:NGjj*?58UdY>慄k5-PSX?33KMMtt:ot. łn.Nt2;,8"##kt!"DEE77@ U1&BD@ DD CΜ⨪*EQj<.D& z)(( *$Il6fd:e0an7tԉxQWPi|rbccq:<#VSXDر#.KzǗe\.۷F!hY(zIHHVD"R@p$mE`!l޼,":e,C/1eI~! 84K`=nƫ5n]ӆ@ $- ;v,l'5]E$/ޥ><)qYQ+]GpϟNzYUޡ=bZ]9ѩ̞=@ ٳޢM("%;Fv:K»SaF֭/V> Ҽys.\xPodD+jɒ74ݎKMy5an w̗U)uG^I2ȥ~NI2F¹^!\ґ~ݿ|KaJW3f4Kp}gZ B ky3c/^!_ȴ7hH;ej.{9z2H),Aiq@C[Ϝg媭 D7;F$~!wL>ll$u"$P!^~egZuM5E1U7WGaL.wLw-_?07'|KRDŜ9sHLL$>>͜9s>|16~ WuMʘ<ԏz'"ϟO0$++ lJtt=+\ _3& Ȍnx7L# :ru]IHHhlhήrf.Jx#_sq2]?˜wŴ2r5},a)|ڼҰ^SF=H| Hz\_%/9;S=ڶdֈ=Z`ULt|-ˀQm[}(Қ.Y8SYgucT;Ӹ9+ᅵ4gG,7w ZQn :s</+Z:M M;OTTcUyu+ ODDbوAR :ĚkppMH|=GURFq}ynߠh~&W5^6vȍ#>fc 6^d" k2gA$ F5;x?m (!~ܾfUb8g=d9L,*Css߆XC{!ŋ&NECr[H}e@RY[W!A$eETMӁc+8\H h FG %R4Fn3=Ål;H;%V\,(4*cCTwncOӯpM>Cp|H& Ix_=7>w6ˈ fe 2*ɦqYSRȲ|)14pQiZ*dpzJ>vo.r *&#"k{VUTQ仮S) u~p/gW@Gf3enS"-mua OW&r4mOcA/㟯SdPW?_u_FV,߂W:̾QDGQdMч(vd"vѴ '!:Ha7߰@#j dEU6?Z(H0$gݢY\E$ &i3~ L^㒦US99޽(躶yŧ.~y')>1utA|tY3$.~ >7?%:5mDSSǝ&mtPM'[*fIyLe2؆ydt<̾v>fL9nTJ}[ ,^uSѐnΧa͞|-Y#nC|mH6o=ބ} Cd:o^ agTtzg>PTŶ+È*ɘF3#r D6Q/1,+b9Fďo[ރIx"%-u#}&M',Y 3Ga=%77Lj74;Sle+_Y5k$&&kHܷʴ<>Vf\-u"I8q&op8ݻ7k׮%%%۷qfP(gNUB~{"xP1S%<0nH]M5 {ߟ%K`;!x)!"5@8/axmv!"7ҭ[7,YB=#tRݙ'"C'CF!"}=Ro_~m۶akXSF\\/gϞ4M;NB=yOD(*aEQ9r$veҥ4h.DDPӉ#55~uEQN*i,BµuVrןyпt:q:BD7:˅bnʼn'Ȳ 22F"r ITT~sZ#a@ DD BD@ 8:qr( [8[ 9AA^/1($ Lll,6 tX[mVn7 #e"""HFTTam-DqЩS'E-ܣ@4X|98΃ 5KRR2,&d4LkD\\1ψ-Ø|:vrQq\oߞCNl۾z!~ cdy;w($>a`ÇM(-+%90X GD!"HA>T>ݚYjƪh:-ʇFW]"Rn$I5.K(x:(#pHIDZGf"r\Mfmj-T-0}8[V锋Q|ʇu"r"'K漉ܯIOoI]N1;*rD9M5O,xV.hהF4П/己9cx* nKWOt;**"™CDlq#.u4KOSv< Hy(ߞ Q3Xn|Gw5K8V.y{ =Vv`ߦ96|9z+߼4]"R8#3zR7g=='t 5چ-* IT ]F J7n˅fS0'ѻuL~AݸfTVʷG3CSi ]Y f/`5*=s'Dd@*:YӘ]c_ta3Ijw ϼv;ϞbƆFnW'w;_W)TLԑH7̅.os8ν~w~aljr%˜ogcVfPh\%ʆ̍:z _aiYF|s o9~S.&?d)ht1}R47J[7+{{݁*8=B@ ײN h4q\8b,b\% *Е)ٔh.: tHDn3xW\{f4 rIAOq.& /#o{sXp™#I~Fq HPۍ.;l# eN4]'ն<~Aclz).-3u(ꛥxlm{¨ e/b/l<(Ӡ/SӐ۪ABB+$G#j5#}^LCeЬOPE+ բFD*&!u k}UE0{`٥`aT]{<EM㑫:{''VԲȲ\ VS޴3a]xߐFE?W gΔsg(-^|gtMCӀ&9HR.3`w[D&̔Onn6qvP 4M%>YS];,zק^`|HYQ˱xM&+@8Hɖ?X݇ /`߳B |2R>ªV9ܻ3*a5t>ƌ-G|jQ8 sSW"a5Z>q}bo㾛 >_DjEQ H F~?VEغ&"RݱcC~;h6 Çg0a u> J_b"Rq|e˖C^iZIJ4Ynsrs6FcHebUƑV-D4ª&l}!$f9%!",ȲLii)aWptDDDr2Y%"* Z:m6g錬 qBDjFll,/gϞ yZۡ6E) 7# Geҥ4h~V+hw߷7iiGBPz$tjցb>m`ށ)xXd4oyH[ 98N|>O6֔$阗f qm#QwTN'NDFFi,𰶖elm4ъ\;YA9k,CZ v%].N(:a=UeAdd:**Z8ZI(1O Ļ3@@ ""!"@ DD BD@ ""!"T+6 K3^QJIENDB`spykeviewer-0.4.1/doc/source/img/neo.svg0000644000175000017500000005251312262550403016347 0ustar robrob Neo Hierarchy image/svg+xml Neo Hierarchy Robert Pröpper Block RecordingChannel RecordingChannelGroup Segment Unit AnalogSignal AnalogSignalArray Event EventArray Epoch EpochArray Spike SpikeTrain spykeviewer-0.4.1/doc/source/img/plugin-correlogram.png0000644000175000017500000004467312262550403021373 0ustar robrobPNG  IHDRbKGD pHYs+tIME*3+=tEXtCommentCreated with GIMPW IDATxyMǟw3ޙ;a6}5,EI)e EHEPd+IDZee f_s~ f0cȘ<0s?syK5`EQdYFV?JVE }vQ)ZJ (t:>;^/`t:t:B-Fl6w8E-#лwoVZ›B̉\F9u\`ݎ;MD ZZ]a@qD;ڨi_×}Vߊk\aI"˭֗ԭYs{R'@q%slR` f8,&Օ^H}9I;gWLפ^jvz#&fO%j4nHO թ'W'@Wq;CBBx<9sk:T!Gb9+Y9H!HIRՌ%ewR$ f_d[6 G#Smh|.8^B%E}fv'yC-xSI9nw5 FsIyIQ'lس9?\(KJFJn".% .J>hY$&f|o譴ns$D wH>ʁHW"U@BB$q U,˜:u ZMBBQQQb$.΢!$*=d[^,#y2@eƛH:!?lߒ`Ӹmx h.iIsIn|Z2Tz=IGoT$22* ξfVH ~IDҩ4B@)W`"+B8y5t(L^Pd.-ÇȺI>ŨZ{';$Ɋ7'ACPԫlsf7;AQPT\,Sk ;l.èUȶ;.ԨxUS$l6[NeY&##\%חԦ*DXro+>řȉ#I*4f+9a*Ng#ެs. B| The+"Ѱ~=իG:1`Vpx/~U'%i?+%/Om YTd|"NLLD$|}}AQ$twɇ}n'dV J33Fug8%oH5؝H~ha-tSrc֢>S#I`c?}Ib׉ݖ[IP׉08)7`q.W]|Ok` tn'؝ɳE\%zQ i]wzz:F@PP)))h4222#qIVavIon~O70n#πZmJ4NIk"$%bZt]IFeJִEQ"354_eFJ~UElw:D6mA&ԀWH;jw~ijҨN d *~fp6!wj5f͆/)콒 Od`W "3# T^]jCb.Y4-_qo,HM"#- U1͛TNKBX|N0TCm0áM- {N[E,FǖY[h>M  !b@ D, !b@ D,!b@ D,@PO11^/$RɭNjZVER n7Ν%==Vz:Zԭ[ի#r閬ܹs?tԉ0*]yGeزe f-/Hıcԩvh @hh(~~~lٲjժ]EW_zLDcT , ^W,_JJ*URKq֖q8` q2s VB֮Y<5$3ɬjx<⬮`2ٵNJ1\|= i[IsF (Y%]#~c K:*MaSwدT73Up#mw UFcGR ֯盵(˦& h4ܙ(Q&#6_g{]$;+ a cXk?wʾf4ObM3:dc+R"?/JOȃ-Zqh45 EJغn׉W"oم-+F#f~=_2wňiŃ߫eWuw@~o^]5]K\;[ #ބo2'"G޻3g}V`8xHT)ɘF<&+ǘ99ƿ2ݟfWQ9~;R%KrۤU̩oB:Cl߅IR@:2eW<%_gԺ-,wZR!)rܦԨs&ُ11t=wp‹ zr_*ToKdNd]4OptnuիL /cJ'NFs?[d lZGm}_ ?cira) 0}<ܦ :Z(pi lڙNZt*;gb8gZ"Sbث21;RxR d?Fd9-eu#/~qfR&L}y3TIj'RЪ$\rk yLw'9=U ;o63{/T}f.V7N22pO,0JN9bcy.`ӧ1cUJk@cO[JA#05a9Zf;6^ ,9)l\JєW7xɎL/e^zV]inxmGlhS|yt&a?e~&ٲe 9yXB1nr5CzJ'jhc>Nfɼ> ~0h=xRE5:t>=,jCv/mtyMl{V$ I39H]هk?e$*ԨJ)|c'`R];v#Rm=]ŝI\H!yksUIvȨtr(zo]RQVn\.nIɕw#7{fOC@S[rn,9$΂waꉤVG=՟r$k :1\ plNfxP郩e$/C%4ķ?'aS/cte~B_A[ZKX]9_ݩ8 V}t^|: *Ա&V=oFLq\U*QQQXVC8-Iƍ2cM/]۹\R X p8yCAD$!b@ D,!b@pK"e amZ2qBXVXXXXVi9DXV: 폅y{ XzX´6\I֏xCLLo0pGV#oZ9ņ; S]Rif×~2F50^&6լ}g@Tb Ӣ(t%z~ɫSjS_G(ëҬx֗3dv'nG^,qIqM=įw$WYK\/_cGƍLռ$d 3SJ&}.m%0-yXe鬝;~Ǐs#w}lOR?LG~aRzF>XIy7Q8ÓLޞN_%&%k?9JыyspptP@Ngfs̼3猳[0:,/S<^Eix(JW7X4vM >C:&Qo5݅X6 ^xQ4t>#fZ ȭͳ0R8]h0 .!n?]"@̸Q,k%N?kZ I߷'awaziɭ2Nm瀻]RU*e˓!҆ g}Q1w2kݘٷ|t45q}1潉٫l:OXoNKb;lXn S۞f+ޝkֱ_{m s-L_[eSZ4Ldѫfgbg׮OˮO2s\ 'wڤjS<뎤Uzp\Gbpsb9;ފqd;Ćtԍ&5P[9s əKk9Ͱ0RXuBl*~~>e}n>җi{sx@jdbe*93rӛ7 ߴXѝN̦dg*Hn #5j`uKjaje>cϾW.%Kbaz彲{NMkSfS5)#8U:f ,EeI[!VcW͕LΧ7amz[@^n܍* :-H^)DWx+b@ħ{.|ו|O%0ע Nָ1tG|2^l_LtI,L̏TAU!{dD6LƾR!d<򉹮r#j;9+cpo5o4c`?re;Ͽ`-(&"X8A2P]QNLF2&v687e7kV$_=*SmUKϣk^O Ӓ$8[;GΦϟ&&:_ #:Gsyw9ܮx6ΙOlǹ/R H$o{v&~-xg@̽3s0 -9MzQGD_ҵS:7IGx;<4ocFѼY-|qP+=dyǪ]N6c^#~|YC@{F1\e:V=ݤL`IhaZٓŸK3 hMY1 *@Wc>3ϷzJ1oTȤ^o5Z+~Ĩ1cx$͵m,[w$X֦XVB@ Ǐ^?kcft]pjoIMMeر^KtiO+cO̜/$XS(nz>/l&] BB}O7nf_򦗸]c5箚1Rї652?}֑"zj\.W.;z&~ºrB&=фu3rH*+(Hs*낖sC?vǣM[.6m*r4VωU %w)r>?9?g#=WX3 ]=0>]^o~q#&>C?E`]}'ݻwGAL)]+&0wٕLൾ#Yw>qrp<472IF嬘,C~6ُOȲs$ng<CLLd/9;tn gެ-kr1>o#{ϋtjv-M/_HQ&cңJǚ5k\2!!!T\5kܰvUV?xkb~/.@ Mydm0~ ؃ų:bq '\IᯙL5\JF'bN}rbP#q~ fl Cp }BX0#bo8fѫԊLʖי{}q; ܱ|:z ݨLlX4RJ߲~1Yywuɱ5~g̟yrn.8p.5Ɔ ppG@@e/]-`_t:QN}v&i/:Zv&Jn 46,PKF'A 'ǣTyy 7&˧7+M航gCKTvOpVG_F ׂ=PN#7޾MLzcۍNT9QaW^ @enð޵0@t tT]0n^Y9kЫk:MXVbuytZRcA9bʼnt/*ݮ ˤodo|Zf/}bO0jaƚxppzնlv;XcBF )oc), A˛qxǹ ;o6?K IDATj6\2XJ0_:7wR)x@,!2*|Hjj˃$ir˕e[R3̜77۰COd`sCtN{Y7 F?IǴLaF>ƇOOȄK^Cf|N̼¥c5!w2N_$8/@:KL Tj\8Y.PXH8oZ*؉?|ҵ[ލ UL>WXNǦ ƠHH,XBV@e$$Yyd`!\5s\4/./P D_%4ojbK$$ɋ++c?cOHm5jQ6"+ ;~9 U (Ǘ*QQo۝IaWը&]kpv֍>o+r&ZA_//I{lل@Z߈䵋H&^E"H`q|c]w* ;I;f =(Iv TLNmYe]3Cs3 z#$d|I"!˃hBRRz yMnHЬUV=&~fh}y囼0CڀF!¾ rt^JHW/|j0}_`-ճr3(Q Rl>ыn=!MWQY ƽ#z2 *7Yc+ W:Y0Qf!>=^}j/!=֨=YZ^CRpYdfgv~%#,!CdT06#!cyR*Ynv/„b5EœS&, Gɗ︆+Dڴ Hll,ݺuG4-Lzz:V5VrJׯOʕK[ڴy ߸?Ν;sA"##9}4b\ȡ`ĖEw n>ݻwg˖-ȋ/X3yNB$Kq۶m˖-[СC0䬩R+by ,33N'D|ƿ;ݻw/RNd2j2v$\ 꺔V r&=e@s܉s+B$e}ڴ_~yߴ9rLw˰?⑜c]{RM}Q#A/T )7,?CLL5Gʅm/='_4~m71DGyYWнy-kҼNj=5CH6a]oft45u`#D] n@bV ?LEZipH:5uj;ܵmdHko?_^-b\q9y plmv~-2(v-zEZu_6=/om<Θ7Y|3 H}Df|oN/q+H0A [Gv}'{p'nÞ ks4C[0 ׌dV|w/N΃rRDZ-ݳ(dz2x9YTiˡmi*e gm?L\\6l --a)MYrv*NCuP7j[o@}7oLr7zºU*_^mR _V&1N&;PV։TDUӽ *Lu=0gddoj Z4ݿ+>{~&Εw/6 E<䳓ҩy]Z>8'(R,JC_o= jN1Fk4jcQZMCxϱu~zQ\sˬRՕZ%txϳmA==Ut|j#_++tƍ^~-V4kSo FY2 \~6T2d+V݅\G"6/1/2*[Xԡ /pfC> sfbVLN$ٞ߯?ɶV<乱=Σp^L`. ##i qv"6sV6)'0U G)NLJQ~ I9SHBIs!i`NL ۪kۛCq ֦64d㟩\0VPWg =J>ç6f N.}uFwZچ'Ʒ ٝ?cw\qӤyiJSh մ_Uw|dSiܜ6gC՗FCײB{~5cy,OPĖ)%ZhgV!ٮ`PI6<j@")-I,t6.yegm!ŷ6qO9d)Y Aw'\%Vl,~]ŬO>Dd\϶]ĥQT1jE7;Vr&aJ֧ԥk#?TwaEp$ed+yޙ9N $䯬\'rt AߒMcd\^/δSi3'j"Cf3sa2<^)ص.w]N.'dwsN/ VҦg-^$O*;?S.%\ؕJ֦:"zLf*йHZ?u_c͘׈3q}PQL|:z@x0Oa' "eK"Nj'V<{fB]55ݫ9uR]*Ѵ9:U*<՝]S?4s}z}jLxj| ]y4NV7UQ!ɅL?xj+5g֫=] -=әn0mDُ2yh);; mJxi4g@VTQIhʃ3x8@+-:PKyy@X֦2I0|k?>S6-?k  k6"֦amzPr$J7WmώWbI=g^e@O^ 1TW4q*t:"p:f.cF{?9xӦ!,5@CР!P{Q-T{і{#FV[bZ-ګy]FFAe ݷq=PS`sl&Xs/UʖOЌUbۑ4z7L`[st ّ"ԓs?d84p4?Xރڱq @IxF}WVá1SP&=7Z7gY%?r0U7v~> ,=m<4'm_$H=4{sGyx->?hXY -8NӒn֚0z|'N]C|)Fϴs|ߝ%:bU]n;ϧejɐ*+7#,-r-(D޲ [DW" K'}.dv]8&LbI"F629d6^l0>_uR68Ect;i2 '5/7Q 89["O}Z.Nr;j6yPEΉss&//aZK˓h >ޑ };yWUjthZWcr' ЦsJݽh͝DpljSOAQJ@5S{8m Iu_tj_i/r:?ԁbޓ8{NF?vu֗_i߮}iG!V":-FJbn'#qas/~qfR&L}y3ۖܐDXp] Mv\j?"\s.ŝN܁d:EС|' ֘n8k ؍KYvw&wL æE_/Ճ";I:zlrN&CsVaAۡP y}ϙ̣dXsUaSYq9| PYm|䩰2cj݃eqP'A{OƭdDcޗI3xg zy oM cêg1VLx_[H: aus-Aeo2d{5hi^Z]z=" ͙C̥2ReR>N7ڵ+۶mǨQ$ \#Pn:a~f֭#@PTUb/Zx;bʜ89%dіMA\A@ "@ "B@ "BX@Xظ|8]m\JgYeK ^ux>ޏ7r\ækțqyqbo"ıbۚI_XQJӶ P7}N|Cm\*+:w.>@mSAq9~ ˣ?_H&ضm>rG` Mz^5|P_]ӵ=XLGC.yQkwƮ ^'y~HLLf3e,5fe@8i>ӗ)ou:Ot ػ,|NdZY zi:]duzp˰G 1o]6)67+ +#f~=_2wňiR\ҽq&svT兏ޢ ffGdhgߢXt;Ϡ4fƔY8)'~>DϩKz^ˤyV>gx}6B{Z2S1u2k2rf+Ә*WmKllmo2q'kѯ7?ADY˛ z*5pl$^IpӼA ^./Z=e^ZP91zaguĪh__r&bN}rb5'6.1}uLP_-G8%_Bit:Dʧ>Ⱥ=XhLչW|L!GTO5vlD6U0h,Թ5q\Va1޳b^_F ]p O歜r ^K ֏?A+v~;M¯[Ii}Xj,8Ԁ:B:=@5 T 5w1Yplѩ윉]FkNu?4Bc$V;:* \BH6uT\8atU xv"$~IA`ڼ\MehMs Wi htdAa1ߓdȗҨ0WǑ fl_dת ×NlLammxGSB}T:$doJ= kjˆ`'s0 cv<8l8XD&̉;+WJZ+)Nbg %'Wt' ɖ-wڮ &Niӿꍟ:<WY>1k Fczw .y8I^#HvmWHNK48Y/m0ŭ祝C@Ӈ!w2N_ADh{8RkmfiR0JLdؗ$l=\SSu?q¥?o"!/55N[ S(#(v f\1&v687e7kV$ǨiճgW-ǣx<GGXvm缀Do5{B/+M5r<#WҖ* T'Hmgv_&!YSkPaƅe"-TNkøwD/zYD@F4kl%!9*w{gN~oJDsJçԲN5>Ai3n>s33TG_h:OM]cb[̂O~)-{lsW˫_T#Z2c$kNJca=Ђ]4zҕioDsd+>׋j"5]i l\F%OnϻMBظ"6.A S?G!K(mY܍8WQaiWE"(* +ΐR;EQPUx!Ru J)ݜ8'`a0eiru6' 张PJʹjĜ#ȵM3ҭ%u\ IDATn@>ϳp9<{h4Śr pSci6ƽk]Z-3b/p`cl {;S_3Md>O/NU4j9|0=n!t~yOj"pI}}?1x6ǖA0z3) ql #f|m Bvd5g?M[GZwAQ]wܻ]  ZM0m}DSoZhҤMMjkcjF cX'67 68WcqsnX T^gfgؙ{|~p&3$g+D x.O^NK#&m`< sy|sH>IUϤaIKKc`F.+ ON 4[hKTֲL]>kt{b^2@DH$ Ɗur64*.=Wr gcQ"h2n왕b7K8Ϗʾ519wx ϭ ݲG_d~-sï%/ -VlQ_ђOBV  \8c>?˫+l%9x>1w~Õ3d%7wM*gqL/l`fJjptI79{xl&n*.664ذ{̐ L ׿S!B DCoDgJ 䍼ʚ9ܩ]\O|!ő%_?ʂs>/Mk(O4 p )S(q͛Äŷ6'}e2eV.N=fcdKw$ĠD] }4{Ӆy$`Q7e;hVᳩ1CKFϖ2RX~#ikpZH!>ɓRT6Ӭ["`U$, ͦvrbfQ__OEٺ#"h[f1q-W?~xjXpixGu:VKt+2#GZ=ow h񾤔7fDkV n2R[7ĖmCHekxѴu]GuS 6+WknWVጏjZkSvGvHV" ..RƍGrrrD3N#Ӯq<0wٙz#7bkNLm&0x}t?Ht`Q"Ց¡Cn54 cZ[Eߺ[\)))vv{8yl@:JqVu=`l1$40#-K;j=JĚ@XXx.;owٜOuq8ml݉Q"?dӉTu@vP(+ %bBDP(+ %bBDP( %bBDP( Boy3==ozUUWWWWǻoz˼KJ{40!!!jb#Muu*+7\jŢshq1@wN'E^^ϒtE!>x^^A0Kh 6;l6;thnn]+VZ٢E]dct,Op">TcpCD1 F]yk):7';)c֭ذ~=*v[0KP$'''++;;;>q ص{-[4w aom}V `q86#>~ܙeef$؅E/EvlۺmΝ;WnSy0iJE Y=z ^iȲu+i# ,wMn,Wl?E>RK&<R_wڹz?!^=(31ɧ}qJް~_9yn9(6n d`0ܗ2sy̜=9-߲)N)L2iİs͙G;-`|>gY;0@^+^`!әy$3eRRʓ'H)R)eo)e2SJ*L`f7 CQŘNNOK{/z_S~$C< 1ډ菱2h0-eIWS@lnPǞxFÏxhiBCg, Yg馅|r,3#'J)y2_J̙RrLaؐ.--j!8koog}8Wpq?䚠: 1 :(Z bA[t}?yOMM-/?O1r)~N3d|1) f/ye6K`Ro'*$kz@VVj<>N{gk/Oz\BVDyXLO `dD`9t)h\|y&]zgC]K˖_`W{{;aذJP |V!"ҙYND%::1$|~VBֺ$!ZI~?2QUGhݮ_{ HuNM'WWW87gLɶ?ӿy5dEnp0ȵLa&@rO_0Nt ho"~Y,\6S~'v8g{0+G`]N=gyE oB1E8"fTu7Pu@; 3 H6$NI#ݓ";v|M [o_O),( uz;/5 ?`=w``X=\ `0|ԹԷ#Uԉ#06F?e` .?]Fz_&DM8nhȃg3(&(DO 0 @JrmjXR%K͒*XR.i_:MTI]Ҍtj]f;gM7`@ff!fX 8Jq&sE0{[tai g/Q?js34Y'g81+o?K's/# -Æ唔ZH |LDCocff"&$^J( CQEe(PTPT AhP,(?+uqu*?.igY‰T8 ;KuvFDM z!?0Ք̺xaǷ6F<qTEjtM 1?h'HȣMQfJQt tL߯y}/Tbr G33cѬK =})%&@otH{I W=$j*  EhES XXmPv(6+RvФ_PζZ40a\ɐO1@)/0ǔz$J)YL5()SpIA ])EwЁڿym[6݇)ф@.)ͣ_:h&na̞O=uԸ=*`>`S\%MDm%vbB!ޝ&vfwCnMe$A$ P̫ Ah Mh$,ݡM_A=e$[M[6;wΖ1gFNv?u? C0S?cJdnkQv/M6\4knށcyǥQϣZx p7_]`a˗tZ[wg([T!-ep#|i` $.|3l`وH('j%@w[Dߏ2}VG*PTfEoYhV,(NWu A駟Y} ̄.|F3Cg !u a͞tG}߉)wa;{qeK xt>pYI|/M>4O,S=[o]QPA?0-)͞"Et U%j$83Ctj% I䱿]j͛7> ii+mkD$ ("ٵ7i=@RHK˚PR\Z^^u, (z%= %C zuPp0D$IU 44`)|S)_߮x^O(@( WfABa"r}3N?}HKLyCdTi3c([lyWjŜ98?2. <<pΨI^F5޸0͜S:X>1gHD; ƁΖ.egdgg|LWkN} Z+_F=4P4C3x{X~t/9"Ccy>YѦY:zǙalf{1[ˬ/J|=O$(^c/+ح&*8Ȣ?kXn͊|; owz'e|' !az[]ѰOv~fp{\CG0nsߣ>>dNM8S}//({nEŮ]/>[>#N7\dJJ@h?`!\K [o-F9s^R< -.AUT ETZ**V|<ߐc+S0x! aeU T @ZXUm_K'=te7r/nhhr]}{j'E sJS {@.4_w7t<Ht$n{0TWLTnN({GHɎQdp1R|hiuW)vw͠6=[$z^+]@D04y./R3X-O;=,jE '鄝z *j lYӹ,8bą1Xpup.aEƥxڡ 9Lo3%#=6uc~n#DWx l0m&f~kp!flLLj 2Jgۢؿ\fk" /;++ ŧliJlJl Dsyݺ xʋ P  rxiV fx\RKe &v٥WPKhNvT=!9g~<--!|bKo͹⒧+z&aU /yCs5_oʇf g;pf`xCHp{7BQ#Ss.›0w#iL5HփRHQfq2sᴫv $黅A@|X٤et'&zUrIx̥f )* ܡO4~\/QI˩d4EyBW]׫HUU׶֬\boZvBӟYan7baѴ8J3Zgp9 ec~f!)R}/3f:٥ t$YmV3&^OM"EU CZH) % MYNX >"p:l @H(Plb|[8s A ە vbKxB(y3iUUqnE{i8}hrҴ]cww/wM#$~*b {UfߣGt<ʜ֦KU PHBJ(6>Nf(K pZMD`Mk嬬f+s jy$saZ@Xg MEq5`V/Ͻo[Wn4碻bUX2}飅RWpM=}(]hÕ ˴5 tS?ug*x2oP4܈]C d_\ps_R%Щ}7}2 B45t8VC!)AIffr3`aF&q ` &F O { ÞN֠G>oن1~ g0Xr+z$rc tzHa?FLOI3tc!hvVUu816J7^8o]ef" MBV  " *t$`U%gO|SL B  !BJP {\lPȍc;Dp: tR*`PZ"iKid0DQxkmn0HpvfݵޓPTMԖ`8b՘fX_UسUWus2C Ƞƀ*¸JH UqCPV$YUOkllD ogc~'a:tb~id11?MZ=VN5iC}׭{Nmo)2 i['3p-9oSRW|R3oU;s{~Yۥԅ"T,_Ds{B B#co{ͻ|/Ϣa6+C^]$(7oϬZK.qA0^l&sl @0H&5!9VABw1:˰  i_ؤE,I+_շ>s$KHH4뗫+=UΧ_|0 YBQ*J{眚XAh!U HH"M%@`4`"$_{f,myZdxo&]u <ؓcnUdسw/4M[{>i=3TxS kpإ^ӌOjwؾyÆ>edBb}e:-'HCث<'9Ty '9E$pEߝ{nOXۼ~LW*u{3G's݊nU@Bf@񓿳ϛ?{H`٠'Muf;W^ںc|j%]]yO6UhkosmrJ:9W8e e~D8%_MqZf(WW1ap|ks.!M2)֔BQav;Ԗ'HEW2LrU g]SÞn<Ӟ3OLf%G=@["{+PpbJR1ďPUp{q ܸlٲ-wW'g-&׏f圬Ϫy;γ!IC̪nHl=W7B#dO|M0Mf#^:V"CKA|^`W랥{!I79厷?7H=].UKq)D,^/7;'w訓OX?SFER۷eB9ҿ}jkzZEP&ʳױmh(qa|a$RP$"M E'R IHA)~uoЗV |ꢉ blqZl[>[ƺGzG{P񩧝h-!>6bu[9lD):YTŠ IPtH}ٸ|d$@K 7uln逐2߇"AB (B| K]CFZL~񧨥//=i{O8h V֭_p֬l}t깩BHPA~jY 2 AMc- 5 RbkNM]kPCdA fCZ\!=dх}RkwslL0Gzem6 40)##f(&>^-.cPCJHBu(:CTVH0HhZ^ս $YSyaVB?0 vc=38]a=D{Ayj҉ti0(ܵ98_ωlP$Lb(! % %A <n7ԌB:0U"=% j! j *prY׎H>s' A;64!  z6< qˠk!&/Bws' ĵ pSD.'㇚֛[\l6G 'EAZ5D{y3R.y|:F}Ȗ}irLUb4{q 8#C8;~1Hk);;t ٙYy **pK.{HtKfzN;4BpKi"EXcqNOe;~L/vzC,YoݺR{8';.m/ίhF-ƁvTSn7gh UӼ8^̾una(ƀ$a<펾j^6Ǣ(fh0j.ϳz+V9tL? -H!@?|R_4`UFP ΃mmق4{xF8Q_>/"yv{ eLD! pBZ巢}э}?fF!w9:`xJjE٣z7!8e(ۇR(J!uss v܅˖ʕcNڲ}MoXr0M !}o۶23QPЗ{Ćh-hmuoylӻ_j80-Qsa?~Nggz"ZJփeYBUObsDKc<jxԳ+~1kbj@OJ.AjvMc}l6wj~>, 0R,K@DB#r}}=j RR5Cmz(D j={}Ju)+3Th?8 6 CeOeee1WVV3A4k#NǞ@v=m]pY/r=}H]j޳'OIdH tGߡb fvuEqq}.S__y^^*mۆxwq <ʺӲe1b+gCA/IBPY#-tA(MYwp89l ӑzdbx k=+B,$2M6Q^e{ɺ# >(~ߠ%%%hŊ֮]ە3Q`4w,͍БesK͈(ʈ1үe80Jw=:KF# pW? 8fJ)p8W^TPP޽{=K (--C"!!ҿtaW\*?82@wdYŁFDQmv ψ(ܒhtJ x% #gZ9''RJA޽?<*^/Yxlh7AZ!}8>o8{}"̅=M=:1@f'{$~2 pwzӟ4WJ9ppnn.!v܉g}SNpQQNW~nRAJ<_2 L]}P?f>I)b ++򐓓˅W_}֭㒒߅jPd7 ]eqA̓&óQ?Wpc8Z}?>ox"̰lEyyyEss3OkR0D>}vAU:;,GY$FGᘩ;~133, 2339;;YYYhkk;#͛7# RfffW.gtQá;,~q"t vߏ3s=+r}3"++ ---1c6mڄ`K}墩Ae1#08w:;RT"ge?@ߏ3@eRRωh4 iiit?DyyyWԠPY&0%:pl? wgԩg !J)aX(--:raΜ9]3@wdY\k)X]Y;fow|gTWWմo>+Bɲxku9XIENDB`spykeviewer-0.4.1/doc/source/img/neo.png0000644000175000017500000015076612262550403016345 0ustar robrobPNG  IHDRXJ!sBIT|d pHYs E tEXtSoftwarewww.inkscape.org<tEXtTitleNeo Hierarchy[[;VtEXtAuthorRobert PröpperpCcItEXtCopyrightPublic Domain http://creativecommons.org/licenses/publicdomain/Y IDATxwX"C@T43G2SsVjef2헩e{XY*ȑ+w{oE!xQ+xy nι9a9"R 4J9Җep)TՓn`.RUy] ˖ƍ[AaED<"->yZeH1qqPNq"uI:Gyٙ`θyi<+8T\aDDqgUB@I::5iNp8LUnvYɬ{&XU ٞ`zGt̖g72X0 a*l3m;fҿ01|&q8-ꨪ3ۮn0 0t uCO̡f9$W7;VϿ_G):y00 H)p8Fg_fatuXFy֬;PtI 0 ?aYV=ꐌlPrU6|#pugqm0 0ۧzכ\J.F;¢$1~Le3||k!\]&YeYqkccȓe_Gfٮ8$F15X{roi1FJ\a97}q{TL ˗8op!<}[۶͞]G']{|skלfcXy#}>|?І[7ܛz~0=XY|򬚸x@yۣ<@7O=ǎz͇ܰI2Fܯxo\;)/Ϭaht3b#cY=i5O _|kqYR,NYaƵH9.r(ʛeo^y5X-֧Tbܕͧgvx97_2/I,;y;R_*3LI{w/w~|J S\{zi*6\jWCgrziBpswJklYu?Lre b|X4;ɲK@άcB"m;Ӓx=,w={.霛{OD3P8߼7vL{&,]2._r iFB؈XI9GË>;[goe_aD  ;0+ sY9wk;cL HvJ$XhY>-֧AL7!j/2&LVSKQKS",RglF-EvO޿b%X](Nn?;uߣ,xO~$֢M8 CwνA0n?` {/Te"r'ň~h=~4 $mb]X-_~Ӂ/%]SR׿˹ W*cf#7b/?{)[, KWNe=&ʤCk@HM[GlT,u;Mumzj'  עd^tOKRt2:cLm<`S!zO45RUǿ}YqAJ* wOwؗwxw/wjWvKՖ'?n۹.5iq#fؽU]O0 W\^j^>s +/njO4cfÛfTǦu͍" \>;-+HqL[%-A`$p>|țvUDPxxpdi,]߹80n"R腝XyؽU U5E&.&\v,pŮ=W;|#Z{xIUǤ>S"Kjr[M 02BD40SΪ:jɕS0m3V,3[sf;?3rI 0gDd+vreUuLO[zVU\MTUg :wߞ ݸ\ݪz(#0 øaH}>jPx+{2WYؤqrNr/$XaF&">"WD6}u@7G٪KذǬ=x+g/-8B3$XaF$"uD+ڪ @9ޫU5.BySDbcρgS'ZojXF7 akH^-"km@`+(PJUIUO|6\dɦ >+ul6LeaTϱ=,SCU[Ϫf~; 0۾6bY,%5 a")" `7"5O%U%U^4Cd _|_bYf͒Mh̓V襈8˲:jI 0%"Ec$#P{FmDUڲ ,{% WN9a*"RxT?[_ꆑrӃ{8kHjrXe"VU5;7=8dU= #3=X-Y "%HN`%25.t܆Gzc'VU`.v"Shc,H;_H^+L\DrX@Nl!"Mn'pLt`F0/J+7qMĤi  "\19a\Njjsr0I :8z:_ iha6@g-"kr%D!vR0f;30I #8uR8z9Dݦ.ٳ=Kg17 #kY.bfޚD){jrMH&%Wi_6tsuE+;Tuef\ojH/g ܫjޒZ]pk؄rKPܿ'( <ڝۙv%+n+ADdQj$X.b,z7*-njߩVThb`eip8~,PuI:\A#v;mvCDcW` FU#W\H&W? 9G\ǰE ͡[U7 -!TDdq!|3ul~U7=ҋwv1qlp86H{U&2`5@D rX-ؽ]Hmg2EDS`PJUt{tbr{aRM_g~MHUUuN%%(̔ F4bI& nہ_/|cI Pxq \ ]F"2jruHF6iT6?P"$-a,ø9®8Lރ6;8LadqLqg!٬KӖ)TLq`MLD#@7VU~:;gYZ8*,XfT)Urcsi`LUUU}NU #C %JZ;>p͍?^$XaEYx=yYKjW'$XaU:9Ҵ0\kVbz&2 0L78:6]W\"jag`aF敵*xw;\Bu+U!7ĆaDGU/]W,({Uy<==U +xTL u+Uw.ZLBD4 aZLD 쾳dTpuXYBU4nD NW(Pp XiW,my>6i 5l³tKq||<,K ,\Tv;R$XaZge 9B%x"4ל.tƭrX9~%q1qzC1W/{ بX%NQ5lsxᡇ,~ZqͣhXUdMoɛ?/zWʨ}x'YJ2eEŹ: #T܀N!"8׹(k<'Oq,|=GpI|6wo=;]g'/͆=6b(y_!2:_LY0MI铬ضҽ|={FNf6Z؟!m\G8r4?}{/qzϧǿ#gNovZ#YpI ȵo9ND:F^Nq5Y^̙gRurI/V|K!XzBCv<<بXãYZ|ϧhJMKpE-Z>v$|uYĀ(Uck3XZܽ_/喖tё#AD~.s5EQя瞜h+^{3~s/d˜u:@mSٺ-Ž$Pa~[Dێ&~MbŘ]ޘ0V_=Rᑑ y7ڴߖ/]&~괬[syPrU=ksPd~Ϯ~g^#㫗ktl,fw3j=[EU<>D|I ȵz/ʢOf4وd#,Pj?MlT,3^A/z$%\b)dwkmo֞փZaٹ`'-isj)FwAoi1sL^QTjZ#:P\!M]GiLKj9̨.|$8k|E^8 T(Z`~%ҩf LT7v8nӁ/aQqn /Kc?M@ڏeY݃|yUňjL6Tpy˲ET.U_-b|jAI7U;VgM8|aICy==>~\۲jV΄=$XaZ^}zwP~1"eR7Hq4Y8{e !׬94o63mn\ut/%'`OՠXE:m.ZIf']dSp.M[&%`,0r(Q^ߵ>'62)0ToU/"a)tW%9wo|0UIVQɿXnvyjS=)ڨظ"FE IDAT#>/^xnn: AB.` "\U:U,Qfuߋy_w`ҹJ%K|_ұ{wqzzfY*ƽ4wNqaf ^h{ߎ%.!>隆kQLYXƬw2wV2 aj4C Ib_J`;xBe ǥ8LR;<%rTJ#t,:,K/W܏A}F.'" `0޶(\!<˷nJ\ (!z]'^ yxU[˰Wy" ʟp:8ߖ/!Bז!ۡ3̒M(Sx-Vh1(Ym _ϞNLlʙO;?LÓ;ĘYaJ%khL?&>ɫq]Q]~]Ƙvc+Dz/y!a:Si_}qb뉤cSʏϦl3LH#W;1p&$88w4 ?Wyֲq=Sv(ZЏw4dxfw3e\}Y&͛M9D&*RgOOwtJRe(P;tn͐_ˁ>~]ݟ\B;iӃeFgs"7z¾z&-GPRty Gf儕xxt(cz[Ĕ'{2n'!>:i>׷}H~88)e%40+yϧ{eK|r;+K_8@ `7uW^Hܫ?Ơnrl ekVt]7o.) ho^ 5Wkws88{SoLqqک+ϒ8T ;#in'Y jn*"R:&"<}=;~x\׫|$ӻOOJQRQđ2pG7+UӮHK@- p_ }cxprIPB=ω'ШBj{qswHPN8ũ(^8NJâ9d/D@*6oqdb.PuT20+"8bo\wzopn9#9x$:Ћ,+Ih0`C(RH&-K`SÃy[ c U`Έ9M*|/UT{<}=ԴRcū)Y$%kLu+>>I##ƍMUCǖ9kVCfɜuYEYXűpZ0Zh1HJE?NLD I_ FUg ^Wpn)+TJ5 s֬DDTuI øuy l G뗗:,ք?gQIn5A/0sߖP0 #;{SYeJV$WFP'&>F"7ו͉x 0l14t_:#J7m|-IrG:?hU] 0lyዏuf^GUH:PTuK9`/P80y o &0 # jvR+uk\ bbxdX [Uwy` g/諜^aTeY#cbtxeiBgBiB?ub`7\B^aDTueY Cg5;:,#bbxWk= RէT5k:X9LUCE3`D!`° 0lgE0b/7}m]os֬d֙`VUu3 k|ti4aFQ"0r[p5kKŒ(Q0 Z B#"8 ڮgBpj]<"R.b5R<l8Q"PU?0 ;U=<-"mNkwn{͎ՔJH3XQU,I0nTu Ddq_A*D (.ǰT5zP=Ȳ :D E\-\a63"|'WƃW/Lq>󿋁|XA}z_6b\&/&!ȝ<գ0r晛w*M]Ӝ4""c/GUq$LTX:?k~gŜFy@~d40Yad| ø 4]x^T526)"Z! 'kad>l&4ڏW٪( ±:/"+Exg3 ð0tc`uؽ8U[]<f&PՃIV80GDJK{J2j5잾w@|+"q+3 a7,0T x?M܁WU"r?+UuH\p{Tu>]TxGDv+"R4;m `qCwzGTHf}Ue"TTuBswÁ6gXPUwձߧ? pRDfHM3[I øQ}4T׺PDW <`HU X,"ծr]®);""SD73OG|{UuvVg Erv`7`qn->H-HB+"e0+[ tu[*"q?@]YO[6s(#ea"ݱƍ$XaP(\U+O33 zya]$OΈiƍ$Xa0D$/v/Z/{k:k:b#5OD]O;7NݛxX\+Ǩ+ }"[D^5*iƍK𒪮O=?"8v7[D^:SDzcς\*"-T53 E)UMW~VQ재"R{^{"2qs+|$S"p { @`qCp&#O33+qx0S $%ECgM*e<kWx YL U8kN=b|Z[TDID`6qR jtV?$Xazκq}ygmPY~{xx=Mr}~CkU {V8zȣ53\/g7{1b=Z} 䇈j^U+b."RD>^3Z5hH(Tbq3jsa T9ٽȆ=Vէ"Dm`f2C頲KLD nnC|L< q xzf˳BM EH:DE-EF#O>LLD *˶a$r.O0f%W(Dff@<0TD4cIG5^mGUDcu":yfz2˹mW|!"bj^xӚYO߉c9 Lkzyh١DUYӅj̋|wOA:{+CVɲc"b=|6&40Vy^c0\ë /S~,Ҝiq1q ̀ ţj*"#pswÊ(U=Ij]u͞o,"5TuBc^h˲H`)!ZgN«9ƹCw!`rbMip8ftzP~b]q4o6oN xAa^ft}GӾMONn;IǷo(\pf-jA*BBlc;%"(;PUuf1 U퐶Y1omnïcȹn5aWa7\M x؜:A\scUݛ6r}0]DPոtܷϹ{[l'/r N8'=]ȟpc%"DdW^o#ߗwU*ntyAhyثn׎wE620LO_Oٯb~Ը=Zʞ%{R\ʞ%{8 j IuΊ8{!<(<Źa\ ą8H>ÑGHK9ſ?eqs`v/Sǐ`qxaNn?ZJ`bՓWsj)zO3-iس!'&.:ɋ.gBτzV\t'`] L1JDpqqZ{#=y1.b%Xv}zStX4VȆ#\g&zOMXb?L^w`c9@熝 c=r<ſoq!.&b%[˅ !R A{oǸn`u4 (Jg{وy"(ݦFUcUU-`9#"j_UPEL; EFDJm;In.E og`/Yf˖ʻK!PKS 9OY.@yb+ vSϋ3x&PD Jmh3v3bqq]zOM{_p9|}W4QaɿWOZ4D;ϴdU!,0q{s㛏3x!EQIE;L}Ң [B{QAT_t;nnI1,r{+gBNZl < :Df@!zc(r+""(<e4}<9 V~@rˬ-x &2DRy+SBajMK ^§-'kc]Tn^gg=˲/1yK*S'wAoT,tB \eɚ%9/0 q DE' ,U0$hEdfql1BC)]4@R=@;' ɽAJ@)ޏo|$hW*#2[R.!T:T6g[Jnh0UZRJ8?q>fWjV)VLM>*N)3 YK/3T ՛~Lc "ϋHF+#m{Og {Ėݮ(Bzl+< ^}q-vJj^_C"0GY\U^֝|O@c.M 9g͟AjRœ- @@*4tݧSP|&b~yqY*4QUBO_}-Oڵ}/m'rgvI]37G^ofȚ!x{R\H%U[V縞 ʐRCRWoܵPB 4F,x٦&ޙJS;p.UpO~o!_8v]^\.O #/^Ν{C0{JyLULcF8{V~׻s(!` /fƉȃ3 '1U]mvŮWzMD"U  <'" 9 +fJCX13b-Jo<އ|м3ih R#x.۹.ߜM1{6`bqrLDrw1r ϏSj1 xs~rUHsR5gJV 9a2>a+Ζ[m-5 kHp~}/ȢOQAtuY"/DvH[*6;{AU͚?7,Os8EQcO=&(Q:|`}i,4̚h炝yP=&ઃٻ,yKv2E}6a%ÞfZf33){>z(݉=C-[\p`s̶LFlOr댽jU \Ci'f"]fǸ~e!rǧ["|裇ؿb?|6۰]{ǻ4xaal?VZT:c;aO;Q6^ZtّƉm'(}[ir Ѭo|sƴCeWԏΣ:3c vA\LqQv/ObYE~~g;Lx"`;]?{^EwnwB Q@ҫA(,u IDAT`h6 (t.{w%N8KH v[¾ϓ'${freoT+B΢9{>H`َv.fTRԲCJ͔u֙@*;vgIO > ]<7䎓)B<k^5zw=.JTiSQq9‰'9Bѐ;9{, L2rQ}$=CDӀ/=dR> |I NF̤Kw>5in.)ρ"[U'?Og0iϯE&(Oʸֲ?o}jH:oihCl\珙 _|KSfqV/zDZ=ph!j>S,yQ8yJ\r-}kGG 9Kj`Uܪ!:(mkYJ*Elm*ÇβM\?5`RJl*ewd̙2 pxa?BE߿|?Tm>sz5)Gч"yoR}i79w'W* PIY7"nx,Đ do8+z,u1_OZ ^XG@S̮Vsb/Y\3 ow˜Bۏ?]zRټƓ׭~8._ʔOݖɓ=>uRaX@Dxe+YK5VCjE}Cw)*T/9LH/Uz.VqY EdKꂪ$" 1AX1s 8dYIi~4.z0K}UfHn+]LW ̮U@ r4Kq>!_r`~Y,JƳTRݣTuU> i>l4`RXP U "r4>Xh kPIX︈46KI|)o0"50VVv,&uE[S.X ߟ6`:YɲȔԡ|1<|֭uS, #diRU-I*5Zxcllu^ӵ0AD{׫䏈H2:Y; [BU1)k.[$-i"R;KZϩaE/S8U'Fc9&9:501Z^n0܃}'1n\>$[ܚ.mZ{aeTy fܒ j{td¢l;=:׼۽fPI/5^CIQaI>;X66@U/X-?cT Y&D$5FL4.ȅ˷c }Uc 7T;ny;KDSuI\sT<X)ûWO'3qx;I"=; W4 [GN1yW~@LYQsfߩUt35k-c&: ~.f |: W cew삥D&B0uZV/ +.tբVU" # 2YDBwMUZV Dn8ּ)Οz0Lͬd%w13;:׀S@(}5,޹u-9ímiSi[sר̈́E|˶n`ݱ0]# J8!2 6+C1ZڻzaU=<8"֍nLq;y UlurOAE.EUϩjkLmQ`Z6!F qdj\ 4&;_wOcDXE)kD <v-ynqTfTuc3ܥf{0ssÖPՋNu}ӽ펍9|5:O;/jB F;1(+E$%J`ꮶӐ̐-,ͪuucʟFYI;1¼?M1MaˍǑw|n Ӄ&0xUD^u–ؓwE+׏Şw]"2ՒwiT=]G_WWo3a wn+S&8Uk%U lk,}CԺ &]S]LNOVB1cet^'`3?k~+`E]W[0]C֘TTuֿ|ڱ^_Fn'4K1߳'K=XggFɛ$lQ/a "RFzd'+f8̎S''T'dNc:?%bx2c-.^?f':a f^b6LMG/"iTgi:UhpM C9ȕ5~{/p2Bq*wncg80U,BDc>PTmW~ }Tu''ɃyaO5D VՃE$+ T\vc>cV;{0hD$ FCS5} ּ̉Ko!"0T//L wq\} iɴ깂V3b,a#B pE|U=3:lla:J:h?-.lla[~y: r7N'+38I zeP69o\ ߌ/`\U7M1Vq "ŀ6@ȯTQ"ԌN cSk]ÞE%YSTVQvuF` _U՟\d"Cvj-oBLGh w5-XJП^zTNxsWe&"jEL|sJlI.]! v9PUD$LUTug\k䁈Lh P3^O@ZUW' LH_MUIH`, hn-hWa'ݕywhT-S0wgjrq8j_T9f\Kvp:UUG}Uݮ,/aXy3>~mw"@51#HT{";,PѴI""!nF-,쨆NI)3O!@2;wxUSLIK%:۩ε,/aXKCh @ (Kq踟UR^Ĥz8'%!"#1ݱn)&-7h_D10 ODr LQD^_gt9hzyETuUs}I{`TÀbӨ.:&4PDF[r;P xW+G1J,>rqUS k^Œ ^ֻKWD2iya4JUt1N^7F[obcO`{3GUϨjs7P3Zry]U iq'saُIUDя{ncXj?PXc""`_򚓱`}6oQ9pGDJK\g`;F$U3vfb 5h֊7wqђ6Lkɞ)3cyllPL[݉|VH`fW]Bt]a\Hmm`30x cjbDUa"ۤb.[ m*l@D[QpfOm|R ѬF-"llU<h&"OBwW0;DM1]VF IDATe 3=iN2@KȗK*j CEdJ,5jeŇ[ew֭T kCUMmG⋕S]UuU} iUO@`n#6"m]E9wJ, u*"RxDDZHF׼FmG*?{^JGܔhnX66 @UW` x1F$U~ʌj15nP`L75`s@c`f T>}a ":3&zTʶlRye'_Ndr%?bxٗ{""a .WLd&0YDX)Oh}민@L1,d]" SUWՉ".(YD@NWIi;~ϼkb=džah=frKW)_8#soޢ@܎s&^<X(@Ub MRKoSu@U7yЦM,"y,"M\PӖ2H:G073@N`~ R'8kXD[#<2QJ5;tTBȅ`$U(""RTUyۧ۱җ\@SU=5$"0s@1i-H̼GGQ i &H U].{I 'FW%w5H-RbwP.= ajX(xxdiSpҧ}T[!'oz^Dd$kwo%cFv My 56^X0;t 0b ACLlq,<.c@"UD>bI5poؔ!'Ss27G޽XgW;27G&u)5i+Xysн#סƋ{ޜǧ-_B-и6庵gӾ2v;dͮYN 3rLBãpmIdi( {% )LDƦui+Z:qm24CYl|14꼛<| 93"^Ž"RMD6a>x|JYDZ  jSٱ(\Z/ 8j=6>5` 𹈴㒤<)e})1EK(qNa¹w|m{+:r~_脙.XVp7G/ ۀ]gΏ5؄:g'om:m2}Ύȝ5;]??fObT.Q Ƹsp:9}>&~p \0CgLaݮ#OꃷxI a퐑d͘W0ekc5=v4j?΢L"͞<57MD:Dd&m<I#7ΪLZFtсz5^+Q'tZG?E<N{AUUm@)Lna+m7w|M^0y&͞/._Lhx8?N󭞠[Γ{Lb%<6s*UK.șnMZpʕ~75EҳE;BDC#_gtk3D: >ѩacy4w{˺;ٰw*um邅= Gr7bg 9#5۽iK~2ݟg\zz |\ATu=;Um|K,q P ;&Ⱥs{wPoO"^ֱ3w)G|ɐ.3W-q+R4g1WՕ/ݓgv%wwp.\1zl.ʴϾ6X$tF}9dEڌ_8ӭi8Vuvè"x[{LQ"&"ZF7pPʃ ^6&{SݩZ/zN 1c2Op{7YK6FMMmޚAcF1j,:4x<^o*2|4&.E1{ N@XDxNUfh׷9sRbx*B.]!j|spaď![;bJM&_`vr+Dik$ϋ[63."ropp DWRh1 MbxV{fŶ-T-U)|s ~7Klo ]'*3YZ+C8z Јp 3g?]zUJ4g^K'x}XSt |'uiR^d"̐.*UնN}vFӡ fM6#1@{"Hi`^Onv'3yW"Tt@O.ݦܖ"GZ?p`m^thMYT^Tu'3j+0Z`V u*>ī{PDja>$-:ՋZԝ[_:ڵpxLU/f8""avllM ΜϹx>mU9Lwx$)HøkR `90Òo8uI9 fHcUN+LD]ehxm\7hSrxVd[1iJ(ϯ{m#tYߊ_FPg|hrv#ިY<-"},qF`O=;xU,"o׀V]unBye={7PqވbPխxt`Ԏg[A:U5,cͮ,ٲ`^ml\$ 7[jѝT7wI, fmz`˩0m <囍{Q՟0u3L6X6Ǻ[+;U]sl7]H8 B66.JQc~T|pCIAU/." ?]UokyixUmL=qN\!iM,1~3m [( Q=b)U/xJ">+F 2'&=xEl܄5v0+{a%{`jb)}MWl̉೴| gxDDlo,3ȄJ2"&f0Ukz +m SPXg}፱B6AUc#Nie6mF}""lxJc]TyOuR"fxf<U׻^ٸU݈o =`:&E/w{rh 9rL}y=pܱq!ʈgP̅WUN<;q1VTK:V:m< DcmHDzz%70;9U1(@^O ~"5ZU WgVئeW 7~ U{>=H뇜NguU۹vecaDbYE1;>=T } VXQ&"c> fTy+k ȫ{]qcOL͵omp""#Ye#o%:Fo}NgEUukbcRQՃ"2("o&BmC Nv^ "|()"]n dyI*PxCD6WEFk{ UmlHWfZxeҤJr9s9R˾ūWؙrPC066c(,ߋD>X ϼC; WD F'LDZ ܺI;JuKtvm4C owۍçtc@ nəxuEE'}NaX66c:ĊW%"y1)ESD YV͂^x0uZaJ6)+iF "T5AX""c0_Ҙ3/O8 a۬m1v/͙gpp%vpۉ d,ykǮ٘sTvqh!u%fvãXpԌ|U]$".`Kx6k;=p/CvtQo9v3p?b \ePx!p3RS61>`Z]3c1/?糇>Sv16cxQoģzJ"S,o~cmLz{TcFl캃MS6χx o$~A:ۭ^yv@0#VY".&Oo>w΍;o^d¯[8w|MZLڼ 0]D{ILLFD2V/"E0cN2b)3r'Y8(q-\f;hY[/{}Tux-"OT4N&vmO|2rTk_?,D|(mqU(qݕ+ZRaY橛Q@_>ԱHL©ݧH6lòƏ+ᬟ:L2yXTiS `5@D bI;Y)@ZbIHu=L/!哬Jpj)8`^"C62cä lMx}ޏ"RxhyDJU[W1iǬ](D?6)d%{)ӠLTcF=;eX.wNVxx"5 'ctZn#NeXa]J-+{n_JŖ ķ&vZB/)w&*&Tn]Mly#)MY,'+GbEBPAiv1ymrMDh?4.RQ9'sg&mƴTlY}AwTɐfTf~i %j䎓z./x"Պv)5~(QG7e7siNcӘ!WD6+Nf]<3Ny9BX?a=ˇ/>#`0?qbGSY"^x$-1Ѭ@#U {nI0Hk1uߊ)c3U"!GB(U'g鰥|rJfHKJ84CE"Pxגo sDnw"2WU|MkԳz1]ADEz|k"B#xjtMy0A5)ķ&9OfzG*玜cpvCk{n>\!9]>otQ U-D]#VƼ7(`a7B80'k@V"#'lz9p% #uԴ * W\\8as}sUYy˘m6T+ž{zMZyy fm;Ȝ;3OnbՋ1t3ӦLǛ>FDė8|sfo"mvߐRQ";0@DhjBx>(MG- п Wfyp>G-}N=5ꃔ[2Yflf7z߹QHi~C'loBsEQkzcLI `Խְ>U~y29Of7YSZd]:}Fu "G]jFZsMGr#_!?V`1V깫~"w?)T?4 5 +`R{J"R(WlòQK,RvCĵx=f V/J`*DU}ptQVXA`B/X\[o@ԩ_5\rq[:/?aPg=ng۬m]\soپx;p#<|%MsLUUWoTFlketKIIƷ^K/_&nTyrS|^6K\i{- k:_DJ`'ƵI4>[EkǮec(hiŠEf%oeJǵ׸rpt*r_#GQ.;U S:OREu;rq~a`;4sfcK?#cJ0#v)_n'K,QtqAcJJDRruяCprt:r ïsb Bѻ`I Z#cǁօHV,"sgͻBN$Ȑ5_2Vզ밮6eRB?Ý#jIk~`|hNr#<!Xc!CxuwW$O@9H==vBDYZ։'H6%~BtxsϑD.~3aW0C99ɜ73Ej8@:F#4*o*J(B|"Ջ֗|>|Rpx7RG7PBppA=9t_\%s.wG9ARZ!u#gt+Muߪ}m9NI'y_|UMO" YUX_5M8(U%@;L(X`;0Ygy,tqj)GY|Yb#xkDh U}#b/vtUUVHYm'&zH+U:', +!辎K[u!F"gr`u??sh!q /AB8/%g`=T5q'}U{+Vr :X"X <шx$Y SI$FSUwq9"򜪦ȟݨNYWJ7wVre"mT7N` n8p;_[g^p̉lKy*6B~~ JRz6c"zF@w`7 m196B~iOJziʼ#"UuT_"" IfҫK+>>.rL)W:>Q+?z\ ]."3_ZKd{ ܱs}>,"@D9a-1 UUEߡ"2xRDXGHb8яzXb\,@Uh:,)w~S՛7b oa:9MI*-#u)U<\8 xJ60]DK`Y,@Db"9nQb>,$~UBUϩU}_U[j.L^;`4F;Fs1("DG'"5~Oڨ5ns=#"i]"_ˤc__\%wZ7{I߸[`Y,Tܔ}nvIly/@[ͿJUj=L̲@Lۧ 1ϵADƋHw)#"zQp$"5osʽ[5k[ep-ɂ5'{nKKΟu,x\ơBkF1Oii>oc_TխTuRJ|˘|Ìo|?Dd`G 0QPwD$Kd@ɢyyʞ’HI:%z>r Nq`,%pʸǴxFU07^ FTQOT,7L <q)/"Eu,g7qqj?ɖDJfȓ+[D::XK(0VUgU=x=AuU5'Ph ϵGD~DaIylG->i&uJwd%4[ޥE]FY,#"RsXco q`=ąRӛ2FYz]NwL|+`r*dɜt[^pLBdۭ4_NYQqSNWZɒ9}d$I] "xʛYIj V\4a:0LtRy:ϡYURնJpќ草΋@D1(IgȜ1ѓ].ן~QG6n=QyOx:Nn)%6mGsL=^N/|#4,)^)+_:X"")0OY//^ԃAUmC,T+Ft'u8${Tu &W-bF"@ZCV/, #gxpOY¡gRO&00=Y6&pYiva7P  ?e UqrZQqg:X˝3y y\,u!i%kTo̲sy"XD}i`9Uu0j.U ;>R?{ybo<0<c'-&"ز`N4W#{kqcoz^Od@V}ؽep'xKS/φ^ˣ5*B%9!"0:WK1'c/F]LĨ("31k/`| 5ӑo0rN(&@tij?'.n^V/cփLwq&9S:Jw=/\WǓ!]jZ5}ۮ#6-M{QxXS48Yvp;GU/arHRFj $[)zNUn]<ˁ:s~veVJ"',,oҥMEeJ[>֝5wsX@sdq~t ]P^ٜ2f‚A‡,ӑ1CWG-!oXbNL ={pȤD."qڔ\!dIU tDi_"R˦y灥""LaVUo84gO0k8m;ߵ"ݐ06n=Hcܕ;g:>Q+w)x.?;aԮ }7Of<ߵ)ٳe$_lX@e`D.qEl$>'"D$ I9&Z58/tiSѰv[ ki 9G^ C%)?L\'r5O'.d̄d̐ocrWu, "OauYZH&`'|wC[$є-IU VՁ %="\l}2x SI@D2gnkmj1jH'{O? Mp|3wc+/L!R ze_ H雂%$4V]FR@nȖvwL@UO͹b# T޶;"R#TRs 4o̗NUyssr{,Ii-kkU""/a[8=c;>XjC`yse劙WVܖ*pb|$XERKCjdb'NY@JLq\"rXwxi NqΒ*ND[bDU?>CN;2xADvVnJFtMm3%+VG׻9:XK,8b3Tu7lP՝rNN4-Q "ܛ-X6zTU42? |l޵q٧i~uD`ڗЬNXWm%YyXb)4~L2O{َXqU]qbD9)MG`9pɉ3%44K9q,R|U]6XbS]4g;UM{0$e¶Y` xU Wπ$~Ny)H1F SY 2=uWlx/ <<`ݎa,%&_cn$}=*!"8T5X_x h%4X8YbChϦmX}:XNMQI޶'1ۉ!es@`,o}fDUaV,>]lAH!ߺACe,`Y,T4Yކ\L4^`9!-pXe;,^D 0OfPD2z׺;GU`[`CFN;'q#,,>o~i󢪝T轌g,}df@[UebcbGoT:ӒP cHO^>E~"An6p}Kw}CP0 U{nf,}sznZtSb*L8E=hnW%0Đ7Wvv3y$ھ}n6 |lf5;-CiCu>Vc\`Yw^, |4MjTm`7/oILH0^D&߭LjrwF. ۭU:9t]2L_/Ӧ(=z" <H lj:{G{h?& {ϝ8^ML\D#H &ax|R?/0DDj5мqeV/Etd%*[va韛1o;(K`\."4q>e℈,yU5yD%&G.Z⌈D+yyQU}%i??tTU)|RB'ge$kE+H@`wvDdrp;N@cIqFDZa^r&ԼK@DZ`IĈHJLbUW "0pq ө| hV͎MID.*KN;2a,/a,!"oo^6LoZ&ˆp*QGc=1Iʼn*UDU8;6r{N]4?r_!" /sǨj?TDj5ŠZ U=tU޵T&"{U[nL͒aL}<G$+ lh \&|dU=,"RĻ݈S yHXnu," wr&I;!"DڒPUI~c."HZZ1<0KDJy$K:Xa@m`&@*i b-BUU9L `e1Q@+ 51tEHX,u,"u9͉/~${z-|cQ @MC/0]DHsU]t D$գdx%#"a:8 I}|i,X<1w@ LZFDD2y:a(009Zz޲˒%h2Ojr(V 2$(Ht[ |< '"0zR:XdG!캳I`|x dX- UݩM0/kV6`%&gl,:@]YdITX˒,vE %&/$p5VbSTgPd}i 8v`Y`Y!N9Ɉe=yQ zВHP+6њI(#"}#"YE5Y\E7eqJdD:=*"%4t[]$*T4>>Tu>+"K0] EE$Z[hqnSAi>1Q0mv"tۋK^ADzTSoۓHvPUR E%>_%J`M3ch=nqnILZӶZ  EH`20~kJ,"?aN{5拤m$jD$&Uը IDAT >TՐ[G0y.`>˱;dϖ]z)W˖lYғ"MāKW <{AlrW[ED.(#U _1@>a$D}SB~/ctޫf$$"RD&7eU%/qV՚Ѷ>L‡'[֐MP$ K8wWm9trۭUc,/aCD1﫫&ZDd&1 :aVUm?,Iqbce}Uuoڐ>2!"\" ܪ[6Bg#o e%QU~]>v"Ѕi [EhILJ/ݯΕfnifՃ$UuPӍ`p†H窉'w2jHg\%qDf *2W:Tp/u:_:X$~Pկm\zm1ɺVݒQճP>0D鄘_DJ\2'[hÊ 1%H& Nuʱ%$~ޜd#I1hv7:V²XUݬu*EdԜ"rB_i&~Ux>OMe""BҾ@KeI8%31\ک%/X`rP@lʒ Q1MGՀDddtߨt}}ZQJ 7E$J:Xʷ^$Tu5 qO8?m%YRL$3"RhٮEuX̒qphgҤN" eIr+@k`m{!<@ ">@`aKb@Uj3̒xofTױE0u*_=ס,IlY3Ldž.U %i܌6}lNb{2SSF, :p ZD8¥wPjק껲gZݟn@L" $!DQjnWlRDU/Ӏ&"R(E*+}Y"S+"<ͭZ5[-4SҴ~*E$u,IgM MU{٤LT䞴aKbDUj{LQ#`4)Vgw*Z+ k:X )1U]VO5\AU]Tarly IGۖKUKԭ^WcU*FJ Կ*#%q^yך$ 0E.ZbT5i>їytp$ rKLT & <y |Ed & LL l5NZ̸o#sƴɕ{=[FȢ7wopx}~s!W̷?93pԨ_$C5W)s?s&9gv;:XD#0 4W#^6)I"#WVW=k{?}."ՀvgtX冖t Ž=;W>|<֨" xi$=%Ӈi[עe{O/W:"ߝ|F|yMPyO/#%1F>U]mc(1"2pj؞+.j UU#g>e'f7cۮ#NKl9S:|/KdΔkw5#._eպ]/K>]jN>Ǒ6 `ȗ'+L~[(SMaTlu*S 'OcŚ=@lSE gγsq #U,֏T{ E*URd"w,G7?15@U705&2OU7{H% "%09YO+U,Jxߜҕ[ RŒՓ̙U 6~å!|41.7A!22ΦmhLs1l*#"gΡ1u#sv#xdˎ۸1~`p=_9x"|4y_:X G>!"T"!.*"-m3Ӫ%/&0=U !yX+喈H7oZW(?G?ǁçyo؛8hs]8v,M{%s1 ~cGD[S8yߏ} QUC|fV~{1c;}ULBYF)DŽ1̝:35o:F왙UF /f FKU=$"A- "޲K%";ɤ81_VMTWKL` @)<$V+ mŒXQooE$ &*K,?͂.zOF,9{ǚnʯ7ݢ*+-D6'W,E jT-ɦn:d,>,N$8IY֨c =mj䌑Vg8{>]mQ||\_L%V.]JXajZ9/׹0>^_I˽fUqR_|L$7=z@KY&J@TLzD<LIp T(qF-w\XѳO9@]5X|u31?T(~Y3pd`Զ;cdozEtit94@eȝ3 5ЉSgI}V4*+O_JpL[`sH"UILuZ`p 褷zTPu`un-t7<[,8aʽtaEWSjn%n2yHjd 6m?āç8r,uQf雎‡*t 5 Aᗉr`QKw'Oeb]7WB(]"s?;9|ԟ7!q6lrc͓f󳳪xØ䆪H=LVD%mK2`LެAE.]潏gą͝g.ɻ]1o<}4%e#4kXqș|KVf|fG^5uZ |lqjTw>||\ti_Ͼ^ĺ|%KCVg. I@`.(HxD0k˃ϩD/Dd r,N[)zmq[0U#bXWpH׾oybC|*{3͝1Cڨ^HlyS#6l=H(V8wr|0eJ:J2Ik1GOr9*+EHhm9 T즊;'o D˕AJ"ybl?CY\0g/rT N9G cÔ}@J|ݕ"E G;Ok,/u,!bꫀwUuiZ|70Kԑu,{i}gƼ\-"Ԙ2:@~ +B'1#.Ul[\._`URq[U㮌h9zݮ<l1ʾU xGUOy>KCDiM{KvӤ{w"^L&uޮV='U;ՒPU,>>sKD֪j4Ϋ=h%u}^!_۟ho9g'?|8 +#.WU7oeIZH L}[i  0c~h,Ɋ,T?԰)Ͻ;%FxXsǴF#"'nw+O8U" wK2߇$OžʒL*>yB?M^XWCi]sܪT54Q8X"A\Z]yO$dɆr/˗BUv|;YN@°1O;iF]n(·m% >Ux>odI亳uKD\|^q^9śOt_rݕUD|-"o<ҡ+_ZSBCֳn]κ9K$"Kd_iLz5Mx⽏g|_($V9=ֹu91_P)"{FD(_=CZs|SOy\߉HodI:Nj{ |um,b@m޼""dR3e&>>IBr7iөںkD$\ret퓢%8wi+T$-D\3=]jlIZ*}/K[~#XRu#Z?yr'"Z";::Wx@4M"$-Tu WzcSjlI;xg_ϗS~C?ݪw,)l۪43`+çx]UG"ED.].șFXe9 g:#t9oǼI_7l߼f%[7b錩 fK|5g.&"6`Xn\^4+k?yg!ݔK1w7.s龯a`˚$pQRNꓰPAhHGϒ=\wqrW{~5a7 JDx8vj4^ѻ+,ZO'RclXO "" 368w4'ao?M!,4_$9r˦X,$L2d$gD`mw<6[r)8\|HMS^#{g$5iA6OƸoU fTʘ+R,ƹv~k}pn~LXHmLjoe,".NWwoU4뀷4 vŅ]'qYyccbr2vi }nWr-EeR [ᏹ3b,ΝG]ԠC"WXuL੓|*St^&R )Ӥ1.D#.&S/Yݛ̒}DD8HX8¨{o|L|g CŢ~_kYФOW,F8kǽ|w\.>G@)T Ksv xFO%X(zv"٨c.]K֡C"<]0i̞ͱW2et\#X,U[]1eQK޾R!.wh~#g.X<[wl- +ٺX<[z,A<߰+C֍X(ݪaiQ]`Ѓt\=To1?"S֬{kןؿz|_ O E:Lþ=P(swDgTCŢ<]zviwl͜{oykvX5r[D(P$Jfjܨvs>П)#ߥˀb=%*Ve~QQO_ÕK9s_Owa1޽/tõd Ͽ7&f]ɔ͏Oo1{anӧQ#zwy:HSnr>П0=v[lY>|ˆ 9w4,]]?Ƈ?/aټf%hnp{6g^]~L{~?+/1u09<,̡n4x)V̝)z% FL_;b 8_|f1i4O &vsN3U |i{}g}6%k(Pϥ Ϙ%+my g*LMDD8EV\t) <ψ]ɑ-^IǗ`ЉӪGo&0\ Cٷu|7oFǗ۴ظrM?gON'?ſ+xdА+l^'gOGxɣ\% QUJu쟘3s^9߭ŀص_~5kY?Ř{X/bGfRqԚ6CFn] Pisjyig:w gϢn7M&odɞ]{7໯H) =OH ZxU pX<;t8y v64lu=7~S'tU}LjjE?ЬSw*kDxv荎[t|M,Lu(Pue^ϔR#$g-[̕Kn:-',*s""oQnè=f!sHf-8y 󅅄໯iܾ^5mIb%yă 7"]ƌTUU!skݞǎDEx}{XmX,O,bسiӧؿ} nh QǖY' Y\TmЄ?bܹ㎈5TאZkp>JqPNf);/mGq!0 +g 3#{wFC`*Y{zDf.JhH?|4{vq`.?GxNO>{2fbː~Bv@Yr>\ ʏȞ߶ LscA#Q^^cZ3vspvEsEs1ڒ$@u)_.ʡY6G&5RGE"9c++TVN(\$]SNX٪\'shvIxXaa-=TDEҤKϲ?I/WWf|[޽۷r2U\)_+ϦD1wj%KzX,'YF~#k\JoT@ԍܙQs1c'7^o'OPQ3~6O$*% 6YIj5T(p -D{Syom֍9~`6d7?cpnt.] c˅'cv1w&_7("BRexvp*iKn哂c^Ago8.-}zGȐ9 m{㫕˕'ֿWXpl>\scV{.Ѩ]>qLǟbׂ&^,%Nx+屻9lX>?=ut2y]x߾;ɂ/Z{wWUp`* *kK{nE 53j&M)}-0P2VKI4uE{-G^s9y<}vI>EBZ"sᓒ: W,!h DU9u0/O?wJTv•˗]=Evs,sP*Uv`Ǎ"oVѠw)ތ+nyrIIq6)qI/ƀ1߿sM[Lxd*yRS}1/Xܛ['$`ZΟ;CJB,_;͐exݤ\-;ͤSuKTj|(csX8tj|_N~_Σ5|:T|P̬U`]rJ݆)uibuφ%s_ϾՈUC ΙS'Y9}2-ׄ9-b֮aj y~ml Zw3imd!9. !c'2d:A 8T}Dڨqh66Ůi8OD~9\=ET* vvR>Ԥu[.Ş8j}K8qQKu࢔R7Kȁ-5p;RJnŊ+0 2wդu"#Hv]vEKf h4iݖ5\OA=IC3y+LK¯#ר ANV&V"Ƕ{i&C#8~p) qh(V֨g}ڮ\!dvZɿE:-: WpWk5i݆14#l ^NTǒ/;;Æ/ѡkY|(e+ ?5\,̩|=Zu(`Gc_*Vl~ݾ4`ocED35`^xo"m'xaWή|.9Ӊ83 p ݇ 7 cӲEMVNcu'vE W7b׮Lj\_M3!L6kXT_{ˢc:q*Nc\ l߲g[P>07;b~t&;hgk0D^ʁ]I슏18P<gcc˔|t!SvOcTt0}iآ5Ujߣ9Ǫ!9m6?|遯ks27ZEѪ4 v֯g_/V^-J&)vwDzyLc_~l ^^lدg_"YiZ (#KXcEe!D_`V&>s 0E}eXT!s>/ێ k >^Ws~]ΫM|% s@kݗ-:kj?ɳm_Lmu/{D`bO?17X ڼb[[tDYMqCٳmyh~VqgC`XYx9YtB]0nmcJJb,/D4Âq^IߟzCe8}{L/ .2sGŕHΝΠeeY3;_2v,=ڂ[OZj w`/2vJ)9o.uybAEyYe @9V)9'>6"O%)*~Ʃ++|mgۦƵB7}^6˳Aٴ_)]o)0w[xP{3>HȶS"g3Nٸ ë=MKM-LI͍~n 7-Z4ޛI)X,(,XB[Y*9(V{yXe9_,7o)Ͻ)V1ZaJ)v>\k- S?c:-afzy)2CuiGTq(JiYR&~-oҍF1E M*k)er_~)ʽ_y(kXĪO ń~DH]*̿pS]Z[oբ(eI"VEQ3V-(/kT$-5MBӎ52WēGœ[ CE1ZxB)-5aUQGF !vbgEef0=pn4/I]!,D\)`uwa%6-VЍF?R1RIQ՞",.F7?*vJݷi怔ݥw>Bx)o߀ A\*`?ٓTJ7k(ç\X`Z[hZ] gI5$+X8YTtwRʈq!DuLd:t̻fSJq)y$ MӎSJy~^Sa FV}k}󞑊r+?`)uHJ(\jEyx @: M"uեn=ۥhձ yO9w6$qQ$Fۮ$WiR *!D7!DIoZ]hܪ ÃJC) ϓˮIӯ]-ԀH`rSV ORJO +5\\S-Q3fc,K;MNv~1/WB  LRF^B "-0.nT"9`g+Vx3YsBaR&SjA5EQ,X&h܅K]w|<vAJof4wEQ u#em)6q.Ò,HujbSLT7~]r֛C0S/ G6>у;T\T[AUAOai\ATaǦٱ.{A ̺h|^iN;q;J0:Dq=(B/JG m+;vzHJd8,Od_Ƅc-kVS;1ծ,b9K$q &}~]>w?CGMO(@kJr5ϾRˊ'c;fQ"3bJ0)5۹q-%`#k,ƭ݇sNgsת-,[Шx&=)[FraĠXl6L!H s KqHMVҽs$!KEE5xZOj?6ȸ2w]CH[ۀ^bOF!e[$wǦ5P9K8 poLv=eHbRC5l+~'$z7ۅERDu!̑]ӧ#a ^  338t:] @M^Ե/vf{@ c;ySh(LsFmd'Jh}}GQ-µo3;2Qt:tDΟ[Q`rD D-#P&FY-(2rj+tH"BuGWdme\9k"Rarov[hZjBJ0Bӿw"NJYa1>}(qFzKNȟ~: ,W٠(* ס=Ҁo]ˆJ=tf\mgt<Mٓ[N@U xٷB("BGedDylڿoI&׭gTrjW.fhYYY(e@ QU1eddPRRRv;!G9|GɃ a'K1YH mr~)&GT 7Uf0}TΉķEiNKLF 2V+: 'V'*=*!!25~S&gac.[75˟AK\O~>vf5R_;hcvĕ@C\vkl^D.%Q30|,x4]r,XT}ߏKev0piY@CԐ?} _}w.yr7T@"b$õg%K֤8$aiV5ҍSpZ_y(![>1t* 49ٽ{wz*& D||< S׮]qbnPN=^]Ժ @ɦ^vo(<9S3dQ];84Y{-#NLB uEcKwcЋZZj Gn,=/3(Ź*6mGIe$#GNjھ%d)NJAwnr\G`b$4?.S2Gr^;Un96pe %LtO <ܦإtկYZ$HYv~?F[Y:$ _2Ի v| w#Tse^233x&JUgU)q=C\گl/Nc*CR:cplrLotS$*IhR?;B#)GFȥ6Zh<4uViBRp#Ck(C{\DZeH=Ҟ1۪fJdv_; 8,SPP^'$$UU|Vm05E0 $${i0B k[+Ɛz@t6g:ler7>NQJY}}ClZjb6|H!Ԉm|+˾ٍ^W:0F%b)n$1~CRF_! r W6oJe":. .]H|bD ^%W$ pR4-:HL6g^3z+C#g?ΌףٱE 9k[<1sXQڔJJJ h4j)))t6\u"χl&  ]ZRיܬK%=YxW^FK=ILϳ9og"}Ϥg\IBgψak]z̶;_;kZE?f)//rt:17LiΜ9ĉƜI-&U1@Q&YThB55tjU\JVF~Xح&: x=e Hu_U3FdJ ٵv> ~ʵ6Fwqw:1FT /'Xնoղ(&3F5D%RTxh70Fmр&'#oeP߬N:Bl& : . xQv"#±ux+NI[[n[ blh PEI 8blZYAV%44|sձrd[,YƄ=0Ż) :4i(3%tA7%eGrٙO^doQc*ISQ[8Ϟo.Gؾ xuvV4\SzH+$IFhK ry~AsnJLe s`0nP^ 3}3Ǔ`P?WBW~T9ynxz#CN%#'^/!x%(7œ2Vn7GRӈKUλ7E?< yfzOٓ|߹+TS],]9C˷19&@ BKn~NOfzVf72$3x&fE"L;?n0x<:/򟧯!VGwǫy<ż}p T2GV2A}^/;иPѧY.|<xㅧx%Uf ;RlғzdY#O-yǘi0Sfიl>>^]>ylZ+Ml?&q1 ϟuC-)%'C~S>T14&MĔK\7&$1Vv/IGre75%;`_xߓgr8rs!ĘLD՗xkEr}mJVR>N#{*c0va(fk&oƂ֘* P0W5ӂZCUЎrL-=aCph[Ӎ< !琇Q>k a9dHg~ kWBO(ZLG[_I(Sga,\2hFtz<] =5bGcDZu΂kHw)}g Cc?QWeEpVgOkH5U}VzxjzygW\;IÒgaC^B"-8<;)Wѓ3.7TŽ^Y%v#U%W/e+}O\͊*Q~ s%߇[;) }8vĎHl/P"'0=^̆a{-W[f kI)4&ȇ<0v ~Ly|#EЮI3g:~ׂćyfr (9,!L{YhH<[la„ DFF^-h,\cRTT.[L,{d1mDjr 9wZ\J@xLʝ"dahBÍ|XY@p*q_IfCt, a:U^Lqq0ݓbiэVSpRSS]( 999lܸ;5y"cjt:"""Zlܸ%$IF픕 aj ( V~'tv5|6x;cڅx4eRD;Rvbf{{1¤cFo}o>-z#t?n“؄7HѡrHwW4N4O_KnIݷ}o+ [9?2]kl}r'!M=_ 89S M_$^Y~cn*1?h ex1!^6-/> !yuSy Y=uLa㏧n-;nh s\Tc?1anc sO;¯fCSngeaw Հ\?ϫn!+ap?U݌H![dů!%4z#Fvey[ oȐh Dg[=hwz@B@f:1nhTM"ț9gǸxuy62ۻWV8//yQZ+Mli&7w r3YU a?;WBRJ,:=֦/;a)Ӈ4r a4RbirfJP3`5%+.ӈ)a8c;n6 ]9*YIGre75%;jd3-vӜ`Θ\禗yOY^]^Rzɥ9!8@iA-͡iA1iX;]ri.sj@DWV)&_!@L.J#J:LzhkuktPC?ﺮzg_Onyc6U*zYFB q^$%b]/4\?Ea<{@]FEa_4|yL~rk{ /XsxxZ'I*r`qgRX)Hwa5=9Gy4ֲm X/?x;Vzd93ƦVXk(rOsA3ְjk.fv#:=DJ m᫯ְ;}~YΘqo̵4,y6u!PV֓>l|%9!8?^7)liqu?Ag:ȯXǹh xf|䑃ԝ̛pțaz49Ŭ%vD,g{@6}ʼw/rЇ;` wM׎9k@u7Ȥ\Hʥ/݃ r#۹n3:1E߿2z|pn6"LҜ9sǟRl}N&>3SZ%?Ği/r[? M<Ö-[0aW = .dر5˖-;͖=9fHZw?NK*\;&CkjnlQbeI|%E ) Ȳ,Tq{;?IDATf3vO^^E7Z!LmDIMM%''GxNv(qF:veĚmNGDDV7@p$ Hbb"v2!LAEjү_?NЮ&"QԆPU]%S qkB@@ $B)x*׆eYk 7Zůaj#~\.b]"I& Áb`hB`E^^)))DEEIvG+)֭CUUl6:]3Nl”OJJ 111BFCLL Ei 1r{p\buSAEjmIHhC$9B0 'Bf͚Eaaqf?5q";[{>]t&N^3WӪ>3f=az/*6na Ϣz*0A &p#8w5Or,]$)D V'\dA˗˙6mND:GƠ!˙\Zʫ\9o+^6^y5ϚM\/@ 6?/ĔnT>}ĩ>$Vэї™>@.`9o`1`5*bgczr.w/xkq-|DGGItt4qqI]J5q`:-Cuͱ\<ɓS7>+g}x<+J8ճ/vwQ d)2sɗ3o&^W{w˓`WY)/2$,+zqabhږ'EŸ;"sC CnDBśF3V hp:l]TOIU#EDQUQeIF2_%?7y7RȲJ '5ڎH־L2/.p[LMWE{[~0tX,X88vaPrD&Pe~WD8x1tE}d\l?gW (B'cj dpt9Țu}4c<#p1:r!N"{Bοf&NTUScR9{$gWf1rFſ')^k/+Ȋ*x`t:]u>yd/>҇IGy:qNQsi֐5KG 7L#Y{j MJ}$h̘1@ px+zs6}-sgbc3$V+Gf$$$F^Zl&I)P/bw$!&Mʕ+1r=_k>i¤')ZP*$h^ӰaXr%#G[5uMFʡCp:boAeĉY')J$q!BCC[!6l&::+V0rHZ˄@p{Ze4V\Ibb"ES{fxHLL_~TxMv$Il6XV!LA0LX,#  ^j%,, Ij/!LmHv{9!鈘h$0 &@ I 0 ST KZV=I'B1~Eaa!>OLl$a2p8X, C.,* -.Wumj%>.#Q[ ajA\.yyyF#"cEQrrrXnbtں021$'Wէ?*uc;??bbb(5k40x`  т ryЩcg!J:uQs(`av%p .š( %'JKK0Tj)@Ua{w3h\ၚ\z?޺As>) NpkJrYʳOۃ yq`IfWF4|z: ARR7V!ssg~F 9q3?"FZɼ2gI0vgUaU̻n,}ܴ`=Eɷct(rX.] N[|f2Y7Y6Y9?yr\ 5 " D[xLGY2_3W.jNy6gz޿ ޻qVWv:_:~.eŊ9^S1h|Xp fϖtEOB%ʛۄ|~~uڅ3xB4crcnC,dOS*$;]LXGwLtP>{V╔v~ETw'/[z_r ߸_ҼHRAd썓dP$F 㓍.ꀴ ٓjE*0` !Yә}ӿp NZJtĴ//ņH"MGL`]FI*dmL&9@[UUj US;Z| %dSγfק;+ؕFdK/ . GAge}ڒ6*=؛Jnfrz_#ҀkRZ FsoEU'1HYe~GRL1QT|3?+oarIRBډ0N{6Lga&?o~ɛ})RjTP8:b-KKqt$2{QlZY%I:PNQS&f-iLp8'k=]BCp_ugjxKd:}VъPtOdIRO~kG"\vW&5Ex1t">V.diecjF"o\c\1^XBܬ /&u[%cOyxQt Qo[ܽ8hǤCx(|вɌxW>g>(?DNqr*Asxu7Wݫcӓ7}BQ(w</0e_8Wg)t?i7ET=N>NDJ8>EAVTT0Ɋ RqLկ<9L6b5.b~nXus9k{' fʝpN-k*N~<ˇַx\<Ύ9wL>@DT%@P S][[!FrL7=9sǏ FatMx^afb2X`w~{fϞMDxg=jLVXlNj8zj1wrAxr))) }ݺu`iՑezP0]><"wW~9';֘TaG1^S ;w@ pLwpI'wS;#I-O%jZt::A@$ҰZ Nj8  GT@#iؿ6[XV1DGGb FIBBXpZZ+W$11R!!!$u²e;v4.)M~$٠0sl6D~JKKDofnj{nXX^ɽU'M4v;{!2A[ a:VTT& B c7^j%,,GM[;ahk!L8vv0} !L@ I a!L@@ aB@@ aB@@ hbW@ h+U9q0mIENDB`spykeviewer-0.4.1/doc/source/img/newfilter.png0000644000175000017500000004775412262550403017565 0ustar robrobPNG  IHDRNTbKGD pHYs+tIME  ?DtEXtCommentCreated with GIMPW IDATxwtlM6@*P-& (QETTl(*EPz 5nGj@B{ᜰL{3ޙlRPUFC  F`@!Jpx&))ÇxPmFxx8f#FH !f#''iӦq1v܉(Szu*UD޽1l6RSSԄҧO,X`4 *Up*v]JJQjzΝ;ρDGGc2CK !ʜl&::]DD={fægϞ9B\->>>t:ln&4]'I.hEh3;]k6q4AJ^(LoN*k -W)[h,4ׁkؗS@kDGzt>y9H˵qٚJ`}5 ‹Sɞ9p|҉hv2: -8+s#R{ˆ^P5Ĵ!AxxLIK)v}.lمW&}۰8q9#) ; y۬^zJT0xܠJm,)] SMI:Sؿ}`'j;=k7Dٿ~ jnJY'ajvd?s ?~[ch<ybڵ^LH!ۡB`Xeb-݅Uay9.)-kut:ILL$<<Nw굄ïpc bwe[zr8u Lr9}ٍgtu81/|LQA+%#\p{Y1eg xѢ"sKqֺU/P/RWd`& Ԋ+5ԣӪn3;N`alDjTPѣGh4$&&%-V&~w}jѪi8cڴwհb;X ߭+ؔ JX v@ XOp&X kX~uؽ^Ikgaǝ']ۺvaX62D)gt*Ҧ{K*x{ԋzcۉGUUL&&l6pߌ} p210X+?>äxN/F-nlvfV䧓b؊|pfr24z&t=ySP%wL4~\6|RҰUEzyv"##ILLf( f0]ӻku'ur yN<(}-Z=+. ['}Npg^zNl&2>3ߤG>GJn799Pk<ʶtnටp\E(僑L$?ܹKP <\R\5(}1cmsOylOAvN㖐'55^bAUUIII!((V+-+d.2*͛N1d982rLvɖ*&HA~ՊTZ#ϸvK廬ԊRp"RXV.;9y8<.fy 2220LFHMMEՒ-W!-:bAd!V=u%hQ!سdE_\`=Dք50JK#=lj֧֣rj%((\rss ۛ+oO0Aܹ)48HL"өh-c҂Anf.? 88B+U D .)+Z ~ ,q1(r^pS` 'ԢG dzq)E_/3R}t:۲yKMNN炯]EI!E׊pBH!BG!$p8B !BH!BG!#8B !6Ϟ)3p>|&Dt(3ĥ=']:Y?~J…Jg*2Dݶ/*[ \`Q;[ "$p>QLg旅177kw+Rz)\GEQ>ԻO衇tjZлNf-K%uPH\e,rXBwdïr9L r;Ӧej[ڂfhKLū ;4"+ֱYKq!P:J1Jl6\n:y{h5}?Gr0˃r{|;1XڎW&!Xw{c8O*\av1}0[(~QF\g1l^bσdG eszV vrd0i xṚkw2q{:6&k$eяGvI-Oo45F?*!.cdS|Φqx_>By;>2۞6ѯ!m^V717+ Lo9cϘ!\6c -xtK7{ͅcD*f\G;Q>\&%T=w<'k3CoP1ܵ{<>jgt!TM|HXÂE4%#Kui:WK#^o6jp>BJ^hu>t}Op^=*mTsam _rJCO-oˉ]'(qIc!7+n1GbOE.mZ=Ww.n3hL1ޝ\p 3>梄R5%T0y Kགྷ0Sq-IvZrJj}ȄoFz78/na@g]PUʳc.YtVr{6WJ1Su;OGFd[!]K0VFF~ޒp&ǭ6<w?g,\+62Qi$d^`u+^ոB:).Uf橠fk_Z7x"֏#q tuh^q^̯qB bRKm 6Qj= h5q}̬x!w½G3m]"e|&1كӹ0>ukhܭ!Ug C؈l>pbt܋QKSȪ hZuj2 J)R&LvIJǬg&9*ԬM&oB@v5,Y[P~J&߭GHn ZIC)V!#B !BH!+,qF)=!nQ͚50p@)y!n13f̐.'#BH!B&E'LR쏲t:{";a|Z}ڍQoO6 Py.EPy2.5u̬xy 8 l5QG~ NMګ6I}=XלA=˹g+1뻊kY.=+ngҡ~Jהvy7&n!$|{0#) _.#@M_?z WMzIeӍ7\$SoLٝbLx/!ZS{67|Ce8y0,]b u78sy* +CDGH;C@cn.[O$qLuB_ı4ҎĽ;'T cw2cԵ2fvyx ՋoϙaiwZLyx= 9lxnCvǿGy諣4QǝuydҎ0UVI2yPOP'#Ξ#p4YHx19'ʁ 6唨| 9Q4KORS͇yNpt+j]1:P &̃P >è2(Ti S0ptaր21®R GRFĠwo*s{ w(ZѠi9L'N{&'9e,=Ƚ͠ ~pNnK -{vđ4R^>$Ms_ 3(~4~.t籽D'r-Ʉ}T:/{{vaF-x*lyŮ ~h5| : ƨ1i0}OBII5RQP|оb.{ Cx/I)Qh1t9R90cdMICBa*=ٜ3Nu tF-ey%è5bwLŒ*t|SN;kဇ9'=I^7>=z5E=1S8zT'<5S?A 8Dz.$7ԭ%_>*h n`=6rZdTrΗ~²'K)y}>\iGHs|,Ky|Ku`#ϋfnP_5Z"!!SIcѺ3wE傻hϫSy`FZMNrZix0 /Q>!$oj.7ݙ] S;ykK9?c$S`$䃚%?J 2# Wa,EI=ֈ.u#f'#o^ۛ0n0'I78ʗ[sˬf%g6k۶0It[e|^* Fpɿa?ȏeoj[J~Zmh7&v'>19G]݀G{8>z*tzH3sW%v7篽Y%ny،QԩK>eqLqzp&aU^z*2s7ɹ &%y+mZ⫙Î˖[UQv\vz FxM] X^OV<0pÛfL3s>h&1cXAT\>NYsv;_|+=UHTC;]d7طqkI9tmgռޜrF Z̩_ tLmu2WGwd{N 6;mᩁ39bލ4Z?jgqx5Mx_y'caL:ը۠9 Qh!dAh"0=ZR> JFK89l2A뀒5-M'J>{/fŏƛڑϼqFyNiΎ{Ӳ &mHm=$hJiOB?w[ Hɹeب8 j=dE R,-PKnKDۊw~jg4c@7,AuFV+b)qNEt:tiဂ`(ѭGz=cnT[#m^MOo @_/3૆LԝrZ7۾e?g|.ڀZt~l$[S*CKYk%ZwW¬jĞd{5b+iZ\\xyezCĘqXƫO~C 3uh&KǦ&:v0ciO"bߦY67=ՅLs.Cz;>K L]in,M=)zղ.ձ1Y%1-m~8+MdxQjm$'tfΚL7r%.bܛ+ye3οaQ7v1}i<9 2>i;P :$lJ'v$>9Ϸ^zxK ,86#Tϊ/OைGïT\LC1 1M{yc~1<2~"x̟E]n[4-ؐZ߇Ϙ1s<5P!E+n\j A ]a[qCҚEY'^oʭ,lʀ{k['ٸR]^a7fw乇k@~RVe7чfRP TUM Ec-)tUq\L$]MJL6FP:ymc񮜂ӢG B<rb rk9s[8Z)\d&fb)O<4T8*Ap޵?z#ط.h(Z=w>. ֫ YbF*<эwO`$xDk!th0q_a.hz?"}=Wff|̚]^wU#qp4ùYE^nWAWPq C@5tlSnzcI Ѻ3z|6颽z?"[F/b4謡X_ %\}'HHuV)Tw&ct q IDAT` ݩU0*3c|-rKqpz5 խ$mE ~Sަ3sQr=:o#< T=Mur.nw/ˍZt2U3l8c3 vp w'_|*#C;)6Yn;i?X!?fG2 >c[{68+ԡSMo@8]@<>KhP* w2+/ϟYVbZF/\A`oN6"~-(^^^p H[ 䉏[8i?.V;'}=_ǡ\^ EJ3r*fL&|0.M)`EA`„ jNxAl6;D7]mdj| ež?) d7%KM '&:{/}}.ҥ<'S i%t:ɵ٥u#ΕI)Tgf! nXrS!#B !BH!$p8B!#B !u$S !n~׬KEf $$$i֬YY7XQy}< }x^>yxSyCYkPwHvLݳm >eq+pT8;kar8Fcx힑 h9/h0:kdل!0dY7'\R]~ 8y,gdڢ2dredކk5vJ"AOj|bhjIFJs5{ _O3]PaDLZ-|N~n:F6A 3xHY#~ϛf!OEԎW&z&oIsl?Xe]'?{&Rl ];[ō܆(jWpkyNCFwƋ.M@LX*@4x8=TiPܹsgܹ|`(u\ew~`^>x zbæLk݇H-7Mfİ|rK@@@'630 z4(hzԃ2`2;l6g;s<?3lp1Ugdr&od۹3{ 9(7Ez's_űw<ķӽck֏I9Ksy[FѶ~=vVTnq7oʕ#88r1o޼v.1c2oaΜ.EК= i1C|>c1w8yy[* eO'\K8ְ`V)4wf6{yKWקP츳ǃ U:X-[{3K7t/^̡CXr%bŤ~tgEv>ZJqxyt=m0^*2t߆-{XܖͰeۥr8g4AH&%(ҳ*&TiB7 R^{%8F/RrQw4]2jV Yy #湐/|i ޗC)9\IdfGs*\y(r bgEϺkҭ(*.יp9ݠ}hܸ݀[N!?߉ۭţP\G ~v&Kݥ*R)|>Cʒ*lLЩpq,I6 ͼ5\!/\MV{#> g}CaΉttAU7n ]8n<*n7?Bw{(YGj tis ϸb",%Gg7 !:w26gL߆I?}4ux_>ʮ }MfI#ϙCjbrqy<PА)369<7~&V4 qCp@~jsDdǺ<21T'^NUϢ *COшA*}\K>u8&mHhkrSSxTwAgzܧ[85#p:jLi >tJ8ʄ N:V9٣9sF*|1cfNӏk(XhѩS'fIq`ذagu2e ~~~gw^4fϞM͚5)Wekɒ%W!X\MiEQ v=*q˲Zk׎]vɱcǨY&VPFN ԥr%Øݣm]+BtիX,$''3jԨbyxJx ]8='-gɛ(Qv ! Z9^֭[ۺg+r] (J@vVVz^Gܔ[96lK. GUߒcX bժUiӆa\xnfrn5.v\GM2|pZ-999>//5kPB|l l6QQQ[R5KrF҇N(zU9^+SwEEEハ@hh(& //~YЛ9`DՊosK( ~~~k %E BH!BG!nwݷeBV-Ll8HMM%??_ (h$00ł`.RSSiҤ 2ϸxHIIaswߒGɓ4nܘP !. 4lؐR Cܲs"IX,~-8E37!.ؑBBWعG%.D4FIZZE>!tWT;k2r(b& * ǃt^+jJKGs%??s2lذbc0J8h8y,'X[|ִbFU7ˉal95o0s~j am Ld;PwyލjqٙbOO?Ū,Vuzw%̊#sńaL{fg^3%V#M='-+mLo{  SIׇn,㣄yQ\9a޼y :tU  >0sd`/8x s.dM96},vQpסOϦO׼1{? /Yq+KOOg:t+Wr!/^Lzzzw\Zp2w&[9qB\^/uلY%6h`dŬ={i1$hlLhQ5x\Cc~fHHuV1rAx_ƗXn6h4~yj+|xͪdtGr=hPQS4սʗ vzo_n_5 n`2k>>H\nb2q]F}}Zj9Tw޽B\RB !BH!$pVN[|W2hh4tR.qٳz7{CŊK[2p\.Ǐgǎmۖ0g\ x<$&&zj fImۖzIBCCaTP<{< $D YV\.Wzt?BQB(~-{xB\-8:N%^FqѦ#mfD3om+/6nK!Vp<Ĭ|~O=}I9g|t>}6c7U䞅igͨ^*6ǎ|pŖep+y\j6+fA*#st ɇTLo(;>l7YMOzmK5>ݮK<PLz4XI@>1>U'U^6ztsu ν1q7slGLD8Q 3uGn_t٬S;^|mOƷQ?-5, T#4M֣M䞻ki`sEYZF*]-&57徻ӲQ}=6]]x]e'p%ӌWnƃyUMw1|e6wN͚4y|5{sm3o^&Vז ^p~1]*7jwxh76v.]\0+A#\+omIœ۾ރƆ. wwnNQ0>g~3'F fT}j D}~2qM_fy*%8 l4? p;|. HXÂE[IsJIKLYG)+TZkEq$(6ؠ r:spRM#q[d~8& ݗXget570M}2U=#Y**OuRfŁxdŇ}R4O`~"jƚ ;A{ᖭ"y;h%M?7;`Oq(VHNV=vb󧭱 0UD;±5]pÊu(ȿ6mUMI?ȶ;L.,8c8K=]3Igʊ2mZ"ĬE1}] BG  Ķ.ǫ-ǨRU|O.̆<ҷ! -+ xoMCZ௡S!:ul:JѴWgZj$=vF%wq,ˍ޿2j\J}Ww ]{TmŰ1OűK#$6Xb8$'"{qܨdl^[Gt-wc vi*.&w-nyy-F: ΈΓGWf;x:P*eFV@Z"uhUVE,}9צTCv.vXcys ƽ4wNW:|wYb0ĭ^bEuj΀eǥr_|)}aWՌoOŇFLא!xƏF4և:0r,.I,gKSJ=Djfުl,ln+ASBtW[/3eѿ)h%36w[k h=Z#z\؝*:27y{l7;:6o@[^)jՐ B` (OXXE79#߮ھVp8Cxx5? Ej|[3tN΂ !(8Aq P VW7YjH60K r=7?5W[*{|3t[.n~ݲm p&,Ѵ TP_(!edRQ v,oS%on;ØW؀0<_yf頕qblԛBht87xֿY\)rf$wV^ϟ&LطNXBtq7A90LlVJ\:*')%[BWLF3IvvxjU{ڷmwIѤ|vŃD7~@xig*Ygc4#y\,Š̝>=.H,/h Zd1[ckOb3X􁛩ys5<YO2X :2E]{&e8۹M[Ŏ.g20u q$J%)xom_ Qu"4Ƨh"#==UpKJJ :thX,ߖѵl4eL QooĆb͚5QPPP_n]Pybv[D(Q(>GM%2d3xDRBP9 Xg0;~'䥜rt]ҿV\.ъGHHHn(l6ߏf#**Yx={l6Z Gvv6vZ:rT>2p`bcPdE^q6};Um9~5Mɓу!6mLLL ݺuyMr/ HD|!6 dv i=~ԯR텺S^^Ntthbj:EEŶ!n귂c G]UkkOx6x?EoXFICb$IM?ر:0 dYBUz>t_pjYMkyUŰ4O->Ť?~2r?~{ӻ9). ˶t(5躷4<̆9IIP&/cgL;gt;(?xWlȊ\WMƌ,b-e7?9Y26?&_O;V'8t 4G=Gӆ1uW~?~Gk0mm!_;{dgsd>ܸB[.\Px~\*՝ [oԹ弚;pqk"Ȼq??X?=Ǵ{6w />L,vkƪy; h[; rۊ؛2g?xyCl2M?3p*z֜$/I<ޑGx81(*C%[vzmeط#RvjޚޝF nӟNmNjE'( MPo!ܖXCt*1wV}ǩ0@ ۯ {2(nct(el c@B#(.sS6If7ECSG7!UMNYd7/A "Drs~V(>VK,2˱d,~+80[3B8qTE .#x%|sRCAvR8rUêHXd5t\8|ZmR8~鯙>54. ݓ@4|lQ+LTe:!znvpB"14͐ Kc̾s&-`h;IcY}<FJ:ƠaUlzb$.$s \$Q/z 젡:P40Х0lsOrQGDZxΓ i`` -+a> 9s&9XPJi!r>^̴k9tP\>6ftrttMC*gChC8|>$NE/߰p9#5d_7?~g9y4 Ϩ{T7 @ttCCM1'cZ,4(ŎBdޠ4}w$I#PQ%;isV0W7ώ;놆ۭ  ق4_ i{_٧6_Fb=t3Gk;a=4]Ǡ{=?G/ռy̟x#E_ǝrM̕L^6}ɔؓєs>TjMYԆA VbZ2+&"֑F,nQ53QH?磓y+ڦiòdFÑ-Zdݍ8q 5x$V^Mrr2111z7ٌ5 S$V|ҥqCユں%n:^OQ\.fYk'al2p8V#8>G9_u=zT;w+;j!jMW=-_k/H`Vp O_ Η_~YuMUUt]=E~túV{L昪F=Ic`Ǜ4n~ݨiQ<ِU790Ye"vԶA>|*WeYR8]P-2bckp^9ob`ٺu+7tY$0`xrjeeel۶DBBB*=.88vqشq3Ѿ}B;XOr'v:l3.gDIKLZ)**66$gsL&V\0Yk- XVVkDŽp8MdmΩSZel6WSDm< 7%~9Ȩ*m-111n,FxxxmmE[74sѱll6P4a&Bp@ #@ G !8@@ BpA+,q[vxIENDB`spykeviewer-0.4.1/doc/source/img/plugin-psth.png0000644000175000017500000004725112262550403020030 0ustar robrobPNG  IHDR gsRGBbKGD pHYs+tIME )#CmitEXtCommentCreated with GIMPW IDATxwxTU_wLʤ'; յm]Dw/vX#ғIL{$tҀp^ϓ灹9[(?ԥ\| Η$f͚!-HzzT7=F8bw)zK >rcȑGHRy(k.rF#\.kE ,\=zHG襗kӦM# b4E/ Vdf(G K.Ev8e]F(`0^`O>xGuU?ZV3M Awݕy>#ؐNNN jC4/~Y6":ҽ{-`.FUkX .O{ Dޚ9 Wu\j7B-bkUK͠=۶ ٍ/w,qm5Y!:vNZp-'@ΚrItKEU@'G{$9eTwec&!LˏܼNez#)]Idi!X+"/iLL|4bZn[_Y+Ujtjx@9?LMrhBC+>[KH P'{(vѫki쵷ٝ[7FC`LFqX*}HB٤EJJJo`NYi {\b҅ RՈpF)ط;jz=8qFsM[Q aN$)!ХiqeIdLG\ȪV.#*Kپf-fia<ؚ WCTqծ8Ct"qJfsXI5]Ƌ 6eO~9!M#+d 08!Q*!`Br\܌ l "U\C䠪*DQBD4rrrʢcQQQ$''7-QUj"$ fzL 6W);ؑQSG ޢ+0SWF"Y$}Cذ_AJ>)SхU簯{LKwF#b>[[ 2#dDy|ʯP;O1mQxV-M]>˭hIU[էiwgix\`ͥϱuʧֽ4jԷcֳ*'H~)zE[YQ867P0KW xhvV}x;/S 6uA6lt,ӡC|Hb!990N>d233QՊ&F(//o*TP} kGԞ]dǨ)>7k(ɜĀV +(UNqCQ}$=2ƈE^@[JYaBJ˫<ɒf [}zU 5nBK2[dCx}wӎ5/qqox8w5{ f۞<>IVBYX 3pl1'J#uCUU<$ycBUUii>$rsstGħ*&;_gČ *~Q*DIQx._9~Yգ_s]%.t`äfnʌQt 養>#ZPa`jڲDRQj'4Rj z>O y۾bĚVԌ-`^avPi[j묎8!ơ,ɥ( A"|7C=;Z^%2hX?d 9(a0X,hF  ??XdYn5Uh, ~Mltrn o jmbhV;V)PRa$&a"/䋯,Ir 8dlE$`dϙOG]D#UkM~iH淜 krI3R hEtbU^B 7*z[fJ٬q91l||JKKX,L&N'reRbbb~HVp8L8nr>ZmJ\W: :st&ήW\Dqy#.5ށƬ]=jqC4 ј^J\E{$,1i ;v@=gCݔytDX=.SیRS215ކLψy#ZΓL Owl8lr;'b7ջ>6֯#!  F)4`$qYN(II`䑱1XꫫĀ^Dܕ5}bZq:xjڤk@9s6iҤSֻdL8$ce7c4%sSZ%$IN.C8c"[b2I P^ZD2pCY_J9"3LI$BwLhRȄ(Ρ42K.!$[nB>K}1X$&'ڮ n_=-& TBvNPL-}ٜ78ډ؍Sl 6^ ӂcUL=G4Qfz"uS\&j}~TkqNV=?ُ b%1@&׫ޏ$6ʊAR ( Z2#p>>qenoo(r—EN1*=6[{)uW%ӡHRwoNsNJKK ZU|"##ի]t9}x!@g瓓öm=z4)))Mޥ@ hEQbvRRR17 ƌÐ!CDZDYx1;wn t;j&m-4foL( IXv ڔ#3 'Zjx뙳;pjI_;@7;ngnF0~8I~w䫽mF jFZZ+s沉iZrd),BQl}PK+dRRq+?ij.t=kw}_kE`zMs͜6 ]~-]3p ?BEy&08=!?39uD6k5o>m͈c~t:ﻘWWngKyzǫsg$ɘisP"CA:xg=82uL: *(*#Z2UY7^j ~ cLO.\vHה-l´5 J4J+ohc&T]zi_Z-cOĎ*Ƭ[fa> Y_`;oJ/aOv7!ٺqn|K3%٪ ABg0a2j^[_)L|V' v7}O\BZ'xsFj-ԒϛWxy`.RTl1nz3s?3#bJނ,XOpj& { 3'`:O3{M)5P.r u8m wzͺz{kg3^]P]e;m#x ˆ/o'cΑXWص}R.ÒedP4|F 5SBl~:'Mf7RSoږHF\>#HT #pms΀boF6a [bGױ _/?%$Ӝl^ GI\Vdg՗?Ƅ(w {;0Fte hf^պl?c}*f\ɋ[*F,f!Ze2ZYn5L/1f. yZC+Ǟ ]$+16ݑ ` mr%4y4nr[;^^vo&ԃÉ[˽P+ZȃɅW3a7(V>l0H,@@Q2(apZyg" '?>} %%>:@[Er$`ix c<ث:S$g^nNf6Γ"\Ϟx:֊~yY^ȑ)D;`n ,ۋ4YwG -{ 0%Ԑcx5}\`|_[7䆏L/Y*>Ŭ/{YyV|kdk4(zı y߻~=\x̚q[laĉʼnBf̛7S\\|.YD|Jߛ>eEBbĽ3.uŧf"4\ 2:5t&6kx^p28ɯbN%Ca%TV6֬OP; IFFyyy*dž ر#@?9#b@^Oll,v 6K@$a2HKK#** -L7UU 8P%>B;@pR  @ H  !@@Z`p8(ADA{.::ٻ j'Arrrعs'B*>Ջ.]j|N<mѣIIIo Z EQbvRRRvb3!C:DGGxb:wdAv,:CfQVV֬W$I.AvxUp:].^zAaA }-[p&q;s3mbi&@ epIL2~v5OGmi jFZ}Ԓ_]4MLk),BQ#5kyv2/%gM⮏2sD lN'Y5^y=Ϲ-fϫb׼4}?u]]H T W~NeN 9ឨ}&*gy|żr;+^ևӛcq:Ib w/Й' !)B~nz>^ֿ_B_1z6}זm%ۭ21떙0e%?#3 k1y]u3n}݃s--Y0},/Jߩwrߔ ^Ò_\AT+ohc&T]zi_^-cOĎ*vb)Ŭ~|1'InBu,n-fJ٢VCp孯&}+mx;omWFܭD ,c' Ϯ$:{`Y9뮇9 xzTnOb<']B_/9X>YM@`'qu(<>Y(xy|8lgnR../MFegXnf~8ox_O3;Uyrٖc C@y1n~3F8uxr36Ul'y/rb>AC/؁:WLj˰d|ˠDMn^zŀ$ na&;vKrq}oK^=X9~cϣӌ,vtF1rg]C& Zr;?ΰ/ sQ"2ww`1 n!~ÒAtpfbLiN6/_c$`n\3 y؛MiX–؃UWa_mp9ZZ\)íYV 5ƆV҉jƓġ\~P.G%P^x_H'PkoWsGA魌r#HpO#~F7K2q71*uE y:*`=u&A\7e;'d: oQ2(ap)jdGvGOP{ kM/";0 d{wQH3u3?幷pdr`7snycDsMU ъBL;߸z/e{QNltO'Dd'=/3# V!cx5}\`|_[7jM/%X8{澻͇eOwԟ Ggq/*] dGFp,/oV3&9L3>f5sGESꝥ5;"ui}`JoleBo*ɉ1M1PncѳﰾCܷ\z混e^ 8eb@hLx7K/媿W%VɌ|o^&_ƽK wG{b&Գ){-y(MIs";2]>_3ɗ\şAd/DΥl/o2w߼t'WN?Gd&4<;a[DƤh<%7 ?}O'AAf>k @$͜9SKOO=T4/[_yi$Zl3E:VoHe&NH\\A1o<ƏOqq d9f#Y{5};q󌋱5*_*tV[:SQNS7'*3VA[( AlZ)))!h3 l͚r:ddd'ɻ'%| @ B@@ $B @ $N{ZAD-ڵ! 83 IDATkTI@ y] $ *6mbM v@,GiYÇt_dᔖ=ū]߼=O&m̚q p}7C@\W>HdZL/}u_eO+m9Ư.: Ύ薻;SΩZ7$0꫑ zSa Ԡ~+T?2o`ɼuQwT ,ןx6z}Ppz"$ /_|kAo/B?~Wd̵wpӘۘu˿K1B: b*[EnK`-0L닅/w7%ĂdsWpW'bWdLͩ /Ҿ8jeiCۘuL: *(*#&@)eymV*)CzL?+rͭ<5I{kۿ0_rt$5& q )߅m9ҵ) s3[Vκ!&8|>hs"2xɧ~|1S{0_~K_fksqޛ<Ԍԑd~NOYWs{L}y&~«Ks+ egX0~#4ה<~ޜ̍ϼo<sy#{;O?byj |P.~g'sgȞWy>m{\|caA[ `hd0ԿlŇ/Mǵ/yu8-=gsk2t9|ƒj )| ?`SWv]})cL;b|1cDWFIpk xkd6;` OsyYj6VɈGbɔʰ!vrvWIiFtx:{ؘWH3A1Q6c%?Pz[~77t:Wq1Iġ\~P.G%P^x_H'PJYkWblc$ 2Dl%qzGo.~FYA|Ic6q$ڏtb L\M̼mՎurUzLԛVMh ,r+"%Xk!1eM;dvuֱɌ|enó=?3"?=5= \<?Lkl3dȴG@z-iF:g wpvsVnsxLM"& /}W<R{Ws/f<8|| &7g;qM N9s b1lٲ?ȨQ +?"W۵ֿY"WQ@pYdIx@zd]|]HGz# %X(,ra^E(#ڟUPZs_7Ũ d@@ $B @ $  @p]~(3tt$j'A)**iA IfI\\6ބϧZ͚4 KNNvÁt( $''cm)@em t;@UU0EtͰZBctIJKЦH,Ԏh$ɶ κئN,\"?)cElr)g!'^{q,~d dkBf~ }&DT:;XY=GwƢ; !L֕ݗG;Ӆ\z^qKX-ńL1 Α襖8p5ƳBw[HXg.aDBEvNF'EA5;qEa-T”؝u[9DOtޖ@g68`lpwcq˶?)r g;8P'Z*`MF*G+H&svU E73;y.Tٱj-y^}9oT?f -#(IsT (ydN'V'{/ݝ',3{XHRmenA: A&sO" XBvH V=X{38u7*`ЈD=P`}.b@M9Osް'\zEtog T i{۽5~jS#e'I2R ˍ_cn1dZ;45#0vz-#5xKG `M9C1ُz-A_//UG5%Aw:T^ݏgm7,X#*!RIT6y тA kTaÁтAj񖮏}] X&Ν:j'E*sM ɀ0v/dO߳rc C𔅰u8jL$K ]-z ЃiǤk񖮏@,Z}T7ZX)UԙAyv1&er0MP`jTY,i+@( 71^ud@N66Щg\ (ڵKF'KVnQ}ƌDZe VWe̎x >Zީ{RL"x>.&_و='8fo45M Y[Xz3uh z ĝ5kV8t bwÔɞN"7 4sL-==-Dگ5q=-hMD)|X,EOD ڜhO%KV2wŌ [X$tq],N,("X&-=KzVcɰ;qoA@ HЌA|Cm+>$5k!@D~?Bm^j"2@lPl6uDAiڑ04M :r0FI0ljgkI .B @ $  @ H  ӞyQ v&rr<)1Cd# jknIGzzz_WUM6v&;G@ `ͣÇt:t2|pJʚ_p`^w=svƿY3n} 9{VNDVNdddvzܹ tٓv!QW_x5gup%XM$ & N\D8{Fb61tTdME܅bD3Iܤ`zz&5E5yxͫ=~gr?q>Q:?^g{yo1z5?nl+n!LN]9h}#}oyiow!L5': k/?/痜*;..vjwa}N˾/a}{kaOΣ`̣dOL(gъdn|x1F˫qDC9G.ǿ%ڙL(WVegX0~#4הVlXgYVκ!&8|>hrםQk6Vo_s&t|P;O?byj |P {|2~y'wMy3<~f[ C= xb~,јG1ƹ+rPլX8Sz Ğ6Vky$#.M$S*Æّ8%;î1&F1S`݁1+$P5< Kq5I209ټ,cj%䢄 +F<;a~w1z5IiFtx:{ؘW%1f_}9b 3m J~סƵCo$ntmW}{yض=neptɌχ_KH:NSyx#zUek g\o%Ʀ;2˄\A;*ϐ F#f{h@${3or+ۇ1TyA6M|QЪhvd' MBdp8hB٬;@pR  @ H  !@@Z`툪o2 m,˧GmM0r9 A!Ifhl6ۑgτa< 6hA*yyyYMp8M~HXi;B FRRAHJJbС5k/,i6#!!#ކTr|m,G^J$HtEٷo_i Z=܃jUj]{&MbG"INuD^ͬD\ǹMN>|~'@~Y|-̺9{ Jo݆oFZ o~Ey|C z2!ҥKիK.eĴd{FF:$tFyՏH*?[_/oƬ=wp 7rKߒ8z(EyU+oɏQ&mՅ#zݹcLvPk;']tg7Mkw;)nzOx5^g~!őȇ~$kU͙J5EuUgȌ3@0_~K_fksqޛ<B,xV$`懟_>5FKĀ4Y`]GRyyF^k{%B0~J|sk}}&x?/f|߿ŋ :iKZ,<&v|׺wb6Z/&P%2O3aI p)\?;,߸%qƠi@wE;*3yAЈaWwڟ]."it7Wfx͗_~YDwg-I^r &ucgȿ-LkH3~@8Zś[pI&.&fޮ[P IDAT6CeI y:*`^5U]Ӫ!/h~o߽/0F?ֵx8Sޣ :E9.c1+!VmOi-[h*BU]PUFܹa*y3i[lcX9ύMEU54]Ml3҇/~븻9K1Gŧ~J}mt" [2ɡ ٴ5?LW\1.e` 1@ZF/‰9FJs)Ald0Zw[yP^1{ Xs"b?cdf+8bŃ 巯d\q`wΨs(t7-NJOx_F,Hϊq ?]:V5TMCGGCBMa4w-'@>,^nB\{O ӫ/!uK_97~8 XWC**H\E^_8D]c"@\RSSx<ߟ7bkwiWt(,[k.Tm Hb!))cǎt:q\cXU)g2s'HC7Uq@p? p-v\U*`^C֛o"gR0(iL&$4 2d$&&V~[:R0#88,BCC3)))dffR(BVV>5jNzz:8Nw+Z*SUEFFQQQfj(:D^^ PՊncXDp8L&fs[cXl(mjC"d۫֌,AH A ADA PO{ĺb-t vb( &f3uKd]bX[$4cz瓓CBBCzoÇuՊh1֗._Է'I9gd<@:žuNku]oE'ŋ$$$!Ёl0AtR%uQ#ݭM^ݺ4bY>2[!AAAA-"4M#/*N 8Nʺꬪj5n|| d2'K}ѧYBzN[)V]H5Fy].&M32G]+ZGxrj7/:iz7SeDi̜0>%$Њ|__~x/stʫ\4IC OʮTV]ʹݏ1??a3>7xnR _?E Py V~ZP9kcx2j}%,FM׽|R_ö {㎯=%8I/SOzly49/mMe4TozT>/Ykq<0K{D罜}),;θM;x&3ͳ@!<5Xɣ0mh :!A&~H eSr1is S65$kKTv4zs'p3%|2X6 "Ŝʻ V7JI1i*ϯ;]!?ɡs81~ͧ|Qϰ`h#ӴzWm-Hۗ)k:` 'Z,Mc=+hy,y/d#[_Od@}|sZ`M$ %5ֽkϐ/ &=kj:Zk+ϥ1mrucr۰Ki&qc1]Eܔ@ ADADAAAHAH A ADADAh; Bs}J'LIENDB`spykeviewer-0.4.1/doc/source/img/filterdock.png0000644000175000017500000004622512262550403017704 0ustar robrobPNG  IHDRCsRGBbKGD pHYs+tIME 5լtEXtCommentCreated with GIMPW IDATxwxeڇ9szzBz(1.* XP\~EYt]˪uUWյk/kWtH(wJ2g?RNs_׹ ̙yyg~yޙ7Jvv )fΜ9$ .D`Aئ[y嶧1<*:n e2-.3Yu {'~'5|3Iaӧ^L&b#g\|D:wIlr;xe?Sf2{'`40DԊ)UUPkw;>3&^ڪuܑǜ=FDZ#>b4a6k_& rM8Xpop=W_}=hW)y͔i@f<<2vnE6U!];qWCi9{LToa<(ɽO}Ea#?$/Ǽik?V_ITUpZh2\c9^\Z3~ӂt&`|?ѷՍrȜxj@I4uwKu zEA8͙KҦ=4֊K c @QA{8T+L+Q/F9 9; R`Sc43(:j@4A=pf@AE8>˥uj.ܨٱ-Kx/wҋUSk ˷_FK|Bg^W{Sݿu3i(F_3ĔHU87y')u ؛g1@]N;;w5;sG^ѹK J-CԂp~K;gANb iEFAD`AD`AAFAFAD`AD`AAFAFAOh%QʠAN|iA`[R" p # ъvYvm˦aZAuԉˀPjۨ4x|Z#x(#'qAھzY2lc&?X@ǃ('lV;̚/ccE*8zHJIzL:rT'0 EQt]o4iæ0UΞ 9}>)0u%( ǎ zQZ{ŀA1%(;RAqҞ#;Yt=y%U`KZ06,_ւ#T{&g.j7269.zmYfS~jj*gnuSW;FP]n sمPfmUq"v]P>PI9V\{WG_' *gn緽g~;uO0=/Lphw^@ cIaz'峽* 'hak-;1'AױcjqsE`N/t5̝Kǐʶ9F\jd {W %ߦPbOv>Iqs&WץZK$p6UCi:gh*RkjH5]. P8NZ\t/^]qp(;6BKG$ X(f^# XIbu>G\:VMiq)Bb2h|: n9-TU%..U͏,w6'#aCI3K|cCr(Œ@ =ś9/IU , '!yY4g> c3FNQґݦ ++IjN'ۍ=1e2PUJpp #[m~Μ96ZXV7AԂ  # # 2y4Mpp8$ZBUUl66 U3*AiAQQ!sޣU F1:u:#DD`9;bܱ0R{wu[>dJoD`Al7Di Y`Ĩ0,n^AR|$% Ms*EQ9${i8J6,E9Qvv7rxfP4ѝ᳢t+:Er[IX}yx]YeD`FJq!f^3~{ ٻC9Eo/R-A)(F*f\ngw_ w_DŌbtk?ee}8iLtr&-6rg۩[xho_FB+<Fѻs =F뗗SU˹`ynك ~& xbPR:Xyvjrw3_OЁړ֗Fzad=i2Tc F<yDDD,otkwt+(?~5s'x߾7~B߰~L? ~¹owϟfcK98k=$^z-ÂZ+_ͻsM\r]|\:(`:nÍy*S0q>?v[[><PAV[Iu)N>AXz2X :-Տ3h]!Kros J»s9?,̴69;]xuwݯw֍;ZͲۦ)z_gQ qʧ?z_a ]?Dk6:~׏~ҙU%5֠j 1uSXfB _jꛤavh|wSTcHЛ^!SfIhG|A[ǫ:hNWDf>2 &;pUѝ5˺OҠW ` f_wSp<~eywB21y޶) < :&Zގ"o_z_+ :UK%xFc l xY^UQ\h8 7ASpќ$pۃsۃ99ɱ$ќh@;g KKy%5y*+K(v:)^ OaU،Diaǚ2kg'܃UQe![svݵ;Xl2]_2y2]-@Qs^{It qF9,0n&5#)Xz[3׃H͈F7V*~nr;OxC2s}x{`J&QX 1ݸ}'%cjZ1p,mM8n+HJ {7gv,n=?5%ݯhTzmq~`Wh4hx)s\;ߞZ]CGػyGQ<;^KrgG\.; 'نfc|۔@/EGBXh8SF݈&WFWd6_b\P.0ak[%ӆ':̊n fIbۦH3AD`AAAFsSztrشiSAiu2`zɆjժ6dٷd1%=se_.F9 BM<,b1|=V嗌qNT<OCujYwl+,Duc^DΒ;T_:Uaz*f*ǩX%%7!r  x<P\FoY.aATlbB\g""'g)V"qZO2w!_ہe /5%#ޜBu9hxz!1jWNN][)0b`P1w";Jqx0V1k5[ 23=±(,`5l-8BL`B 킯ךG%tg0Mf ~9+…9'=YĢ/?G=t ոpY56vV6c?Uf\%N`zT@tg%nK~`V/ ɀס]9z4v_s2XxS֡)1oѬ-ְ2{/tt.xb[[h:n,gpzK/r˵< c& 7{cYr`"kvJ OZ_L2iTqa` (%$>=u9*7vCjn]*\x|#0m!wO%]}i½ p W&iƆZ0hYN 瀜M-^m,HCt66UնkpĥQZȞ'DlXUSZ\S53 Vo*¡i8YHBb` k BawW- 60u&N˚-pzTfȋI,R*Ϊf;j*q>֊g-70&/ӞF:uDVVVFE~TPtw7o8HQ0ZÏf#HAHϱCfaNjqR{)411Y47V=."-HPFdҟrOѱ6P dT2llQv#b̊uaeN,ǒҧVy΀E, G[vjch$r. ͧғ Y?e_YjTUd2aX꟦ءЫd'NdB7;b '+➼2Q DK=OP %pKpB*= &P %O& "0Ic u$WJ$x  # # ,*in֮]iiiXVAiu")+t`=GO^/U9ZCe8&ĥWR8v)E`ZS" LCqQ.q 3"6,XLiwѽ芡k=yOS]WYqp M9=3ʼ|;<_E١"r/:$_ t,ihкOގ*bOdh} #4:Awb?V6o}LT_PG0y@0jn1 J(raɰ  M׆FK*mP;4%Ajj 5?nX[GH^$l^BaFL@m5/J'ocD5]Orr~5P,č~ך_:ѽf_te8;`Qs[`N=m(bXs,QUVyƶ! OsۓW7i$٬Z.k'0؁ceњ~×=(\?>b' (ǦNtMV̫P+::#wWuϷ.uᕧY56[ISn8^ DwЩVV19'"0y6~(YuTk=yh\h'EytJO§Ѱx(&F )OMl^ OO1LJ49)"0{6m+f݈|O#s27v}Vgcq֗ id2,/iCILk^`呆R~xO:w?fRyQC|ju஗F1>:UKKTi1ܙUF+m fb|l Io)QAF2Gy_WIYq똞Ǧ0^Whk#xg|8i,C1w[#j2㉉k)[ödĆK95ΫMzc:[qOkYC_̲gUzH,~.6ڙ\^L ٴKvKkbVwKbO,JMз-lv홏y6=|3l.-Of?o).To|?7G~e\eYyΛ7&_5QF׏Q~;^@{+­$M'pm ,=ry,vQ;0;n6;ʁ/$ -ޡf $!ΒAݔzu 0yۺPŃ19݇)EdUy ]Xs?H+J/6!2l߀όkg^IGvQ⥢E#݈ܿkf>4hxOOSsJŷ'dxDϏ.A'OW[-Y4:y(/D?F{k5:VtwQDL!]8Z(4KxTs2[PsP2c)[ù|7c:68܆`pKz IDATVWsSX\:v9Dj*_c53o/-4@sƐESsqqSavL&U $i)UHݤ}+Odp:%gp N8}nɏ5O@0??>Դ[)m0W>wƴfSJ0]\M 'Lټ#5^C)-q6=g#xt㾾- $ ғT#p{jWd FAFAD`AD`A|Cf]uדKYy9^MLJfE/D`6i-̟?(SRjĄ xqt Ӂ3[Izz:l6ƚPz<É⧟ռtKND`$3s!DEEb`zvV+ -Y<:OY`| smSa&c" ݎdh4b41Lv!** 6{:7[u>4g#N'.0^l>SQTUl6C\\n=6^A@D`:S5XBHH{%x|֖A-=͠FUU%|TTTz QAFhEQa߾}xfUt]w^bcP rZJrnQRRҨ^^JJJ薔bh{u ӉKAs# sf06|rJJJ4LFu4M˗>?6 Eiklzr]d8tzuBƣǿ r][Y5z?qTT PZZʮ]ؿ?؞zi%$1D`:V&c4GXX(wiFk~|}XmvUB,m,T _RRIT_&)b0&I-HNJiPf 45 !AFAAN;2^ēWD`N' Ef^斎D`K9Q<\ҿ+q}0> IJA|aei] 9D%tE9LzvьKͼ4O^&y)O^oXW&JK.t҅܍GB8GA޶*5%dᾙpAe2+"0TO^A9J#ܐ@AD`A1@Ӵһ\hVص- Jm躎`o.Vo]ʝh/^ Id@DcZNZ/.dKBϘX5uZy|eR`px|}}EdeU߈v& q] cExLXo . mp79E;s2.nv/-y1&5v0 ~=w΄h'|LWA tlODb eBRt֐'zd(D?)nt|7q$9.B;f2z#| fPwB<ÄDp>N=9?>ࡱY^"9U64Lxr}3()(ūXpyU"y/ ˉE9ѽݠ![C׽xUw V?gOxZkPyUe(`;7->aU*DŽɏ:<87rI8WĻ X,"PXTDbP,]{Ez K2(,MDPfs[f]kZ3]>3t7Ș |86eDƅڨ,p!-|U֎{]57{WGB9/KxvɆ 13vN4bPPTUl^#m$5pk_n1 $2jeDx4˚Dv#K>5jPyAюRwT?e3aZOr&Zλ$y(2nDR{d<6} K.$:*F&; "0BEn%8\.ODF#fYAPU޾)`AAFAFӏ ]uדKYy9^MLJWb'm%'g '**䔔zKj xqt$"0B3[Izz:lp駹x5/ݒEdJ23N\\!!!@@@AAAGzz: 3⨪l׶>MtR:W+]ylظnc20FL&vbbbfÆ![;n%mIw]<y(0^lFUcEQPUٌqqq޳]۶1g1l8v1eسIbJBBBX, M!!!TVVfL[2YOpQmﯴ0lBW 9 DRk ( F#ucj87]y=CkJM>, d0+TTTz hT/SfvǬܾmwqnD`?E!66}zWu޽{A12{_& rïe7;믉%eQ^A<JrnQRR+C^JJJ薔bh[I+(vi8tNv)))AӴc2]4/_Nl6mVGԿ$[HGAwS½h@\A~ ۪Ȫ8!++( ]v~K#&:Ԏ- 7-AD`:T&c4GXX(wiFk~|}XmvUB,m,T _RRIT_&)b0&I-HNJiPf 45 !AFAAD`A8w9W4MvvMKK;L 0ʠAݽ"j* $= "0:Qx<57'0d7saAń=0i朹uSBK0i̩((f5', kùplz5G 8$EбI ziN`҂ ?3!I4X[UƬl)<@LtǢV.rH62)!bڧ -4:b[a%ȞٓpbRq.p57#t%@uSd۪0 KϘD;2y@9Id֬YԿٳ'pf,]-Ȱ`, J;y1KFtp ?Q]nG0ZZ7 oJC`G.9Ýy~!s H4*\mO`b? n */c 륬n.wE3.FԐat+I9-ٳEs'MAd/fË="i籭2d%ДP, }·3BM[<݂V:;I!TLtKr~leB|Ubl/DK$/A,Fkp4T'{B23$,#8E,sDH\9ztco1Xψ Uvdo3r`0c3ecuhrT ™(y%1D= KP%acYr`"k&W9zp n~z۟$%, $joN֬ˣp.MYV@O50$^Gi!{JASf^/U6EsjQ6 f|L.v!#Hs]jqEhE-H+(wzh#$';cW5cXÏf#HA1~t>YL8C{m(0$cxwA\E:Jvvv~`Ӊv7o0PUJpp;?|MvD&tKĂp2[m~Μ96ZX֚"x***V/׳?C".pHg,J7!CIۀA1:+Rc8#AD`AAts^ʕ(,ߪ;EF0p`_RCD`guO9˺u5$#R"ȑ2 DHH;BBB4hGLky0^W}nLsܾ?巣Rʄw9&t l# ٗvC_压Mtl2_p&{/ϑDҹ 3[\Aա?89,w- & 歋N5?ٶD?U %/db`XZ\1@?3wu~A+\tTk(m *tY>m&̓W56źd̤Jv'4q ]Mp؃b3~:@9?u +}Z0Z]s{s$$ep3Y,^ӆי׼#H2-eo+X ~l#ҲZ1󟼚xbbo Os= 30ޝc1_R}WIc/1w>Ӛ|{̪`C6\-oGd啍Eg'>rc(+ߞOGk۶87T?LN[l,I/϶Sb"0g1o O7>]#_x"ӵdg+;qV\|έfw}F& Q|_0+@%1︌.Pl]3<]R>oj8դؔ&Ku塾\;< [I\i3~m#PS.3i1l&)㫏rjm6"0i ָ1[q>w1{<A1cT(X|Mx*O]ެ}| }:b- mN?<ߎG~//[UB~2ۍʜ;y{k $.̯P+i 5 /aj[G|zȮTvCyh =1/ǍE[WSພXEAQt4)łE[Fyq%;5gS|8I%y櫹A,{.{kKĐ.DXT-?m]vsi/?rCF5Nʮjޏx˝<ҵ-DPO{Sp<~eywB21%ih2?㩿}ȒUWSc>zeC}Jٴ08ң7:mʢZXֹ{^OaD16]KLy+kUoYt>g4şW,+,-?t/7RՆ4Fޚ<~y%;/}'0Tl'sNU v}̽"51^ϼY52"UwM bq{N3q3 |2k)bبpLXV+\LR.E&q_tŒE15-^\8 VǸv"~z{%䢤7]FC]T)MƱw"m,$&2d"<ϫzmh7 ŰaZth"lV3#FD5D9|>751W=yF7o^Or45WXkqwV t}>j4C[}YQ(Kө _K#2V+tPD,N!~|k {$B+A^AD`AA4 Á@Zw?l6l6[; !pPTT(.hwQNNdd'|}AiF`|@q5^@l+xu`ˇL  $iUPX+( _Ce*#6ּ"7P UH~KS@=ɝddqgd/sW!<)!S(QyNa.*)Ϋd]d/-@EQkUڱ ̗q0&x,u:>H^x^TEw_ Ͽ?1'F5zc|PMNF?/#ظzyrw6<眷d0 ]qw_LNT(F^LGğxhz֙ިnA ԌHzǠP(F7Vk5q A1xZO^Ɨ2H-e; IDATO/+Nj|vϼ!SpF x5y“H5 <]Nυ|oA#a9G. I'kko k}qgC^*\V狫4_Tkǘv+º ʇΘ*0'oII ; ZG 뭟2= ,, AjOSjæ7oSRRb]ocIq9^6}{R՚ /zcO Y~ %RԽuѬypu?=p%rB@$HPT",RE+.*jtq㮂.x19\"$d2Gw |y=կ{^+:D3r)("[Or!1pْډPi1[f{.BX"^52e kOLL$;;D0z{0ƛii+ kx@B`(;;j'ɍUPG=Y[]~ "0 EQ@(\`UP\T)="6R]xҗVTyy-lf3,ݲ[cr&pzm|㮈( h}|*i曯^$%n}pxpkgضg!.\Q@b&{M;=xڑ_ӆ~UyK).I偝 yKwd뉌}{?ֶ1om>ˆ;غ6"4_D73r^u6 "0 ]AǍWwݹ-OJ|ԮGwnWw4ɫ;pDӥCk,x9[,=Pv}oPK0"‚Z5֞ڙNֽ͚b7u}!iit#ފ &aam܄wpgrE^Lm_# PZeQ&zKEkZ*U$&GYQ5cTaZxpe&Ӈ˃}h) Y Џo??0B^yib}?o͸}*Ӟ៓_9?@,ߙ=|}U]q `Ȭ,LU|xkn@7 JAAA s%%%,,CjKTU05ND:*:aԖ ,sr͓ k>g2~Ju+[8䐒˖-#@];şMII yZQLLڅ>p<2. HgKڤv +蠾_'WpI!AAFAFA1M#GNs/0' "  # # ͔xlIENDB`spykeviewer-0.4.1/doc/source/img/initial-layout.png0000644000175000017500000017052712262550403020525 0ustar robrobPNG  IHDR j$bKGD pHYs+tIME6$kttEXtCommentCreated with GIMPW IDATxwxy}lǢ$EI(Q-q-ױ8'WYn'ȴlɑm5RER$:@(ef?.@DY u`yss7 v0 _PP vYX,@ bu0H$D"[,#IRH$$0 pTUH9@ @l"`?QU]$(u]555׼͆fttT@ @ Xx|Mت_~5k>׽D"aaR@ `(Buu5^/TU%cZE @ s)x+~׿d2)6 @ cZill rp8D@ sXdYf* @ 26w\UBz9 ,Er@RHmnspp,72֭uAKV8c$+1t|I WT4 p<xnl`}# f@%}D^iגYZHd&3T02 gtb&ᎅ 1@*5=yeQ!cy@ xY: @pɒ7;^MrQ%}!r=vhdrO@Jνl̑l~]Qn]v:m]( w1R병 @ d|_"23XU"eG3 Ɛ@ 0p`$u:I_NyCc!5gYȩ,F#>6HY=!6ϸlm,'{9m

ȱ$ Crtc<r͖|fk>ey2c>^bH PJYWj'd2Tp0I$: Y6IdY1GxPGY#*hEAU- <:X&fImߏituuQ]]tww#2TVV.Kk5U.|]!-O@+<ۙ Ù8=A.VP+2LӠU9I1{M(?>&Bю[~7NH;؞/9ʁ_?r*N-JGR/Et'(7LnZJm13;=pttINF 0?!|!Rɡ4힒?w;RdR(@!v{FvZz{{FbvNyy9Hd. k`_C}}zh ݽʊp$'f9a4 >"䨛r7]AF qpRS#5Ou\ac08S=3Ͱ9HzWę%|dYL*늱D\= Kbp,hx,l(ḯA@<*B'~ϴQrGс1"$I<--- a>rsj^0mݺuFTTTO$A$e/ ,|7W ;r'~d LNfHy]QQ$Vzfڇ\j\/6Gj?NG'GHۧb]-Y3|xV}V[Lhcph UBt"z A-L+\'M쑦 cܽ=Wl.+FhHR2I?eJ-LL5šeޚ g,e$GdpZ[ :`wueM)m ̗Mҟ'lŒ̚n81'TYKVɩVz_9F$>ӝ]V:G<ijSWkS"9>gJrr"6v6UW@VZiscL.枱p:ˋm۶-/GݳgÇxJiXVN'a!??tx倈(@pb$?کƪ Q ՈT6WLhV /a̐-Wny樃6+-HG\J2J(&{rS]cYPk:)NrQ£ĵH|#KeD7+dK6 DS]GAYRt ݵ{&3lY]!2::z^MLL`۱lVONNβ+N!6ʵk)ť&}lw K, `R&TDaRrS{r$ iض\ tqi'))ٸ퍕5&&PruY )-q]ǚ`0>gE>&ϓP62LPQQ!??P(D("//Myy+}+_1nVcEU+,Z@6\'u1?~RɖZ7P8cH_yk ϲ-Ax|^X/[; SL)g{")luɳ^[*b@ LiY-ۧ7pTF)`q@ 쑳hfv@b<8o Z\AcL " @ X"f@Тvwr!IBt`Ɉ(X@ @8 @ @8 @ @ @ @ @ @ @ @ @ @ @ @ Z$%>@/?Œ,}WL}/l\|{>̿T@ Jozc/2_|/u(v4H;x$T˛Sc'; * h{l58̝{=92DT-W}V3 LJFn^[k|i|$c W_bI6.N[^s#[Ovt>F`q_x%[2t{S> Zox-8|-/hDx*8}ox #g{C(ۮ*B=_ICS4bO}7ש~ EQ94p[~YP/g?e7SQN||)}{jr'p w {b']yWKF| ~r,?m#E}]Ț?} 5W?sw-sVq8pogj F#Vv${_] ls,PM|]_D}ğ>eW}]ka罏}Gy[tW%b^V&(^6j @ 8Mv'_=/s7y}}r =R^S;?yC'z-$2B׽A_HXF8uno+~Luo?y>s}>v~= ?nz~)~p<<\(Fߡq|wĖ|{ Iz|뗿vSC]Txj% _?zZ^8П;0?m7xSƝt}jKן?ȯ0[sюC,O}E;?%ݧK??|~}]\UDVʮ}t:GZa6~BeV(G$J3r=1FCl}uR0@b:~~e;Vbs@7;;+>UYa~j;*^"N>L(/g_vWSy|ݼΈ< 6d[P\5ƛp~lrӻ_|IvPPElv>-TJ HNjv7bma4 U!뢭gdn-EQgoxI}}3o l%Ɔ>{a|T)NvOMI>;wpfL91_ڂȋ{ݜE%Js8䒣.ONRKٮ 0܀&ϙH'2_|úo?ɉ||G[6ў2%s~W1?03Z/;I&_KE~!ۜbv&d[6`nӅEv,O9T1֨H@b#%yuΧ15@2ug3ϸOF|>ps9v2ʯ{ccq C#kgKٵW^c =HK n!~ F®u,#Bo`eeiU)g@-7ʮ}'~wO{ /Vىj1}<{t$_NK9m7T$F?QKLi?>H(i中(tN0)k+].G<_c[^T+UlpW KyWn_Kօ(zKS>I?%/MjhOkT@p94y>ׯ4!T+7s`GfV/ǾK@\lC|5UX%gu;~PTƑW[KYr{>=&r3]~rg7rv6wHqlOͷY^kiޱщX|_?Ӹ}|hGwR8wv>8~տLY=f* ;yKm#x6g?]UJ^a|-w԰~$?=uDos2!(x.O/W0>[\c\ABŎzMlRpa{܋"{ 'F%J'܀@  Wb)!,xx'Gx?HUM%%3Z1!ax#ͳ{ Sw6V @ ,[ϸvUrsٶl\=@} ad|;H{|< @p"` @ X%@ +@ @ @ @ 0z-5)WsjJ(Q9HK<aQ/qD- 6v@RMuhjj:]'D;"%euukinnd яgbXVlQy:jTDF@dhNss3HS׮]7{y-tuP.c )\Ԙ*k׮,(--S?74ehL0d@X!3u@S[r/LaNkBCC---ihnn`C.]2e/p%VӝK2Q; ~.iq{ֿ 7J"P|˷D[#ke[QDg +rIps].z$ECCpQkk+$Q__?u}q$]7˃jEe#[J /CQyr$s/ds(sc% @a?A~g 0<2fCeE!iX ͆fy7`eeHKR-3mI$H,x<\., f~l6EQeMtp86J HCFͥvYeIZ[[b+׫ϮodM5Ou]' 2>>nϼܼ R(###LNNAj#;;VP=QJ`kimm5iuzKK^l~N7lfr2&xHL">IyE mll\ Z=I=;p8lvl6BҐ '!nHXɦ+jt]gbbJII HA20 l6Vp8_8qbʮ%6>>~V[t]E߷`Y#X,ΰ)6 4OCzKYIɓ'3RY[f322R@("isϲm?_ЍiRq(۽?=\=7 0>>֭[QUCp8p:gPT\d:hq::;PUk.MK" ﬉%XgV{}}=mHH-X}i;'T+YY."0>EEylx9 ?<{gn~iiv IDAT~adlذh4 dee?8W\qŒ-+آlٳgϼUeSY,Ud2iH]]ݼ6ܹsAqZ5[/<a׸o>u l㱔<6ǩD"f/U> tXv-%|)[4x5ͲN0 ZZZٶr~?mx<mfdggsU{x饗D8ǓO>ڵk3b1:DUUd2i:Dł$I(† 'dϞ=P|\jN$@L'D[[۔jogM]mSL6_]| X {ؼyCã7㦛7\']kšs+hHƣCNlJ蠭Y顦>rsseB,8vX)uuu:ujA[֮]ƍg&544D]] TWWƍ%G34{&dQu 3Ť]Z#KxB?]Xt,"O!0Il U1(` @2t$t0 t 5l#DQ ?>c!ܜ2͛F\.֯_O<' bgh4J}}=]׉ٳ?i4MСCTWWKV"uV$---fE$z)sUƥBp3P^Ij+}%I h`u#UWWq y3$ 7E1x_kvЩ祖/ƖWZ8:YE"cQ'J tcekjts݋,f'e;v, ϝayyyra7-v!XN BvIˣ'HӴ%5r:p6Q.xTA+Sr9jإ:dUUi; 7R!G-IK: A2 z$F$D$H0JP"/Ó7ݸI$SIiu}:hͼbTfV /@AADh4:gH$dgg9S3x=evǏi&!.zJ8E1&I]]fzwL\W;u]JWjx&6f380LcZo +3`S[H//_|l3im>{[zNw):ݔ5Ei蚴XUUM__Ȳ|>ٱcv}Igb,˜ڵkFj*kEE%P\\ j(v֬YlRzJ`űI$ :&HcXҤFx\?QK~_5m7ib(a BTTTP\\lT;X,tvvveeEy444D,nm$I$ JKKu.茲 RSS;]G^! X._%v΃;::)d^OE*S&{9vL3#.~f.X^6_Wm>c=W]u96w$E7 kڔke 9]NFFt*++Ff=44Dww7fdeH-qLG~~ [%PpY.'Na>xdfYBEXN8Mrxu2.uJ}. gvq:;;xlrP;r҇lSb-o!X  j:U>Ev$Rr@I AHXR " ˒kU։LoQ YEXcn$C( &r(2Ȩ.ĭWw#,59cX  dpd2i.3v;6t*Trd+j:g?o0nł&É'̽)*@cV\|RO ip9%jjjXD%$ ɩv֮DMmj!`s +Nr󊩭fSgO}i:$4]K?\訪jVUX,jp,)x! TUell"sqx ^/;w<tQU!6/l.u`.$\/rB+Ûڟ%X)5M9CqxfLNN_mڴ噰f1E\+[n#yV''HN'=ū #A$6ٶd[bmb1FfAx @Kj8z$`h4A8rJd:r@ٽ{َǵQ*#T7>F~~Ë Kڥ+KI5ޝn^ ^0xYL$Z>ZH9ZEpRa|,u Eh 0V\`N8y;[]JمpȲLSSk֬\&;_QQX쬎JG/E,#gdy%X QRRddppмyY]G   nݺ{f۵`qQxVovo>$ƙ$:). CLU_@ ʖlKwTlHeNSSmf:tȌ̓TU+`xx/1"V 0tcɶmСC|RKR''p1! m#ˈK2 ⯳^SS3;]KBY^H3dts2 JJ 4 a0ƽN,z axbN|>fTP(dny<3 f ՁRJ祗^"pZN{)F 7`LbtăC&svW68@ríĺtcZX_ub؜anS(δҒ"0pxƒTzfR3K!+u\3Hi&sXGGYI9X4*4@ Bbd5tuuwuu!5tuuM [fS%\ɜk{g2$(b׆3- xBG!083 Ī|>Ӝh9ٶH/bP__?#eoo/D0?gHie$.f:ηcQur.x1r4g{7~LETԿpgζjR]]M]]ccc8qߏ(3v-crj-aY?u9C|xy,AzÝ b YQeKϮZM04bgx<3SuN9[^gSZV.Ib1~?6 ͆((bZ\veG/hd2I"fM;q(ŋ8W/r.sꢺSTWWu 0]]K8~ |J f7+ rG껦%I&$t0LO8π`@"XH/;5(2b1\wus ٿKZDZHT.ΞT^u -sfx%dZȲl.KwvXVS@Zv%Ijjj13ڐZz{eqecdWa(qNwul#1`L2@g(My%~EJ!,=]hmmEQ***p\$I\.^UU&'')d\.sT '4-567ŐeEQ|X~=LLLۋd޽(O 1f'gggS55Eػ@;]j(lذ:`Zͥ|$ o+?5jfc۶mG8f׮]gԮ)iqx1āy/P5GS#J`l3 _pg(oxY9GnNǎ+$˨, 55S3IsFyyY0ȑ#\}^3ߗǓj5S)bhQVV޽{]׹2t,X,V+n/<CۂAUi\ח:Ȱ'YZQ ga( Il6yHUKJ<NJU0L2"TlCr'32bHXkg:K\=ׇ122_&قmCIGlCGGXV=JCC҂baddP(H}}:@f+xe2 ZFFFxhhh`ӦM3fA>ҝew0M=sAhllngԮ.@8_棉ɒ$\foL7ET41nL $G(X~7:80 4dYfllBdY1TU5Ix̃W,FXTTL5 JPUh4ѣG9r~N,aXPerx<Xe ,]zFԃL:: Ω*0ӅRl56ԅ/15fE#ړI$I"Sf"bL0M#I E*qKߡd$ᝳ"aS碻x .93!s=D"(b1>liݎ$IQ_/-: V_VY,ozKO&sR>%S6/}q&ͤFؾ};ZĮ ȡڨTK'A+1I fGڐ%$IZ`4H $Pb'`iH*vot:zL&7_ɲL0bE68^/Hp8(TWWs:::NJ`MZ7#C*@VV"gH!_,\: kl$!-c|a$aCh0{c(߽$5EuY&1=ec{i'}>S؈2! yY({r@ NӴ%=YF|Sv*Ѩvּt>RNfii 쨫crrK,gՊb3A<gӦMd:JnICC !\lA8-R3"=Dee="l)casm{iYBJi7lUųM{MXkY^D"Apl Y ?>cZ{WRH #Īv?ÎD/BrRh)TJ9Ns V0D4n7yyجEӸ@zd0WBzK-y)}YVS45kְsNyPP۵f|$Ok -!E%*2j,蚎,qjR =GbNJzz!N}Q8eee,s)p8ڵyō[/駟G"0kZM'Fq~/'|dgn]P/s7B}e%; 飈=== M  ii/R6[|ݳJ"s|?Ė]XFcWgt.ZThf7{dpp0k m䱣R~2wx+9){VTJJ9rdF~nyD"$I2m|j3{wwP]9|0wu,W? [bp8Lss3}}}DQsw"`|bMM4668l]u`}xyncgj֭[gF7Jn$Xf̂hF__[nepp'|ZN+16ߺϩ PliTo0 ~FUe9~8=߰UUͽ8N]'Oe 2tҸ"ڹ{"HՊ4Io,3(N,vl!%^a1!t@RTTTc^3bjRHEY"#儆UKdWzOȬ^e-6 {zho>;2G-5Mp*m-5y;ILjPȩbm`-WU_ķl[NMM)\8`O$!H Iv<<.kK7O044Dmm-}}}lڴU(2򲹖uww388H<GUUv;Ŝ m۶-MXM/dHr > $111A~~>hF0Ix~U လ$z{>oZ.Cw:lV㜿IZ%h`e-XV4{Iid{ *^se{z仐fTUexxkRP0cƍ477* V_8W,ժ꽫2Pqa30F7nB |>[n5G c tcv璡:cqONvwQTǿ%F6*% (+zU@k~-XPP?X/Q DJ@: !m3? I *<>IfgnffgsΜ:3rpGD!!!*h֬ 66_z+lj'ڃ *艍+8OMa5fNI)^~=?og@D^9ԨD[PNf͚UHo %% ד\`C.D?3 "<[PRH6l`Æ `6_mPAWhW g@X,O>t ׀$''qSƍ0 HJJf OlPvwP|:"rP\CȾʋ$%'L*Y9=) 7`8 ɸ~πWB .rW jꝓt=ȷ}>< ERt 'BkOO0r7+g@t|}~ ֈW;w=T}BDDDDDdsh((\KyD:'e??lߞw~^ƞ2nt7yGq׵{گуy뙞߅^|~%_WI qgu>&LCc-"piCh٪u^g2]Alc yNޒn m("":Kb^{W=Q_wѸSVYoU^5+N;%Ge^YϬvۓi 3/ _sn6`y:<</Ȇ<4W|&qsѨ),Rv(Wa 3㙕?;"""bWv ~87\x'֏ Xxޫ8g` 9 F=E:ֈym'!\mӦ/tsYQ<Ƈ|9K̉cK<Vi O<ԗ3`k\)e/֚ ٸq t;%uoM';g9XUFII-যŠO|,Ff%l|UlWb}dx5ȁ"툖<Ǿtڐj?KG)|Ӷ17t~6&[|OaN"s;p8=DDؖ0?Ga@1\qyk*NlDH:thڊt:a3#JNzc<#b| ƝOgh;ȟmU+ZuO o[xx 2V,F 6g pmdڛ%2 "s|[mDx&.9:c +z<}N^Y"&5]csXV`t:#o^XɋOsS\ZMw5GWsۈ~D .礪Mnnn驩S+HDDģ6Gq̔issusx{WƴoPquWď>țEgwBp1.fgHӞ ^ N=q$sqh>Nhhl܋SO"c|äq3(;ёf>K~dasb_7CO~O^.!<i3OYz17}vW$9l̊⚧^cLoӗ$(ڞNq#-  駟ꝷk׮DFF֘Caa!Æ ^I=gj,zC9Q.̈N!$YŶ ٵP>ٯ?ɳf]`͗B8?Ռ 害Rwmϐq@LDDv@ @bbb_$2d| %X ν>)$yd?aWro#6tjPؔGZ1߲(alJHrl*bkKFACxb= Cw  Bl-CD<ځ`+<%2w1c=Ĉ`w[+0o?ko>͊Ⴥxd@h@/sW_Ri8gӀ]BJ^IxcZú6K?:9eyIwc)|ΤSCВS.9ch xi};@ҷXSdѾ`t; l[omqvP~7);糈y 9PڅKb֦X.#v^:"q4`_:"Xt( ηBʀP5|m۵֊*** [Vriqκ &`c3}![m]QCDDa&i38f1=Oӧ34깮m%NqO$Z\FѦ$7zlj|Om^>ΌL^|InV"ۜ׌NtR64t, T1D4Xq1$h" LG'Ɖ'YJM ;C(t'|G")^\M o1L $scX'wm\^xe[} 8,HɶR%Py#9ɪA 1;Ր8QxUm%[YtU|hK[OT9k%Syyߔ./{k#w",(`>4&:ؔk{>ր@1naJAѪ3XoUXm:!dwUf kTz3*^Ӳ-,;hoNpygbDD`۶H+˗sF&E~c!BE3cȈ$Y47;rAˋഥOp y!y IBs˹؁m <{%"/ߴ]kJlMk9ٸt -ZW5//(y+sP)1@p 6$m\$Ďu[;#Gsڰ2Z$.NbF4 :߶)ߗlܱo^vD5B'sIڮb]Ow&DIgdo2;tf CsDS5*> <4H\x װ}2V}'^CЮɻ+0Ʒ~9ےNm,lȑI4{+ѣɩޡC233Q21a[!BIi=.WxmW Ax< [ܐBBrjU~jk6*_o `6oU2HyX6f,Y_9€rsw<2`WgacIhI]\CDwdH^U&%~+89~p;(+ٛV- :>1?K(4X7U>.. +UįѢw{bÝ˳>̍kY,FIФdOwG,KG)|Ӷ17t~6nR?ůޒBBV +>~E־N =Ͻ/l;o [C]GCm}b˂/"LId|qnG-91[M\G0oV8 |q5/C:k|Y33^]LbQ~71L ]{/K;~t:dܹ=ȮUj, `J(W@})m4bO%?䗤386Q}DD~DEEt:z}3Vut6l y~w0v<;,"ht1gp<5fΟÈJ"{JCz#"xЃcF6b{Lzh >ILϳ8OA~O\J0bIq?;p\}t4/6vj[*F{{&pZ M9箛9>odžW'?lxn}M%68H>;GJSƒSx˘ݔ݇2:"Z]]Wm.PO:k^#.#ڗ2y/ATbK A-I3΢s Ÿn_O#шq|"h:v6K;cJ]c.Ns域,rw[}dƄP, ZVr}Yqg8uB?p,駴²$d+jA,{TcR;I3֯}'ڃ :D=_<_epwlƍAIϻ'W_ IDAT&k߼GKGx/X|x>,WL^%,z&yNks7p_ <3][ >r/'}6|^s۷ogٲek#k o9 e)ׄ,U4Dm~^XZPq=zDDDM:^zt:qݸn\.Ί!7GeEQ?sd{zf:Cvp⭌觾.:w1 =."k낵wDSg!K?s3. 29I->jԗo5mQc]|n,l&hM*"ΰa?k@MOg "":ǘ6<4lTDpzr 7Q ^A ;ϟqYbZǥw]Nȃp#kZF)GbC*&I-?~6o޼cW$ w;Q-@=M6~1wW6FDPr +ӹuiʡq׈޷>G[*ve˖A,fpudn]/̐I0Fl{@5Xy̟w"ZIDD|eVXAnn.iiiuQ$$$ @DDH"##2^/3yXOޟj@R-hֵ'B~bj#nEDDpB6oL6mС@M6_D+U9ۗh v;_DD> @gԩڷoۿ6~@ ŋ띷SN՘Caa!Æ q9s搕UcKFFv(S*>222*:Tm,Xڟ˗3pZ޻wo~YYY~sM4~S]P, \ m)"" ""E 41 FmCix<&ϸ [WQuU4 B~.s=|6W6n1i{U&S ^b9/"r ѣG3`ѣq:Q21 G,(W@i}$>9Xu}/M7dg݄X^-,"rR At @~;w^2 lll+e]em )pG,}o^НkƞKۏ!e{#kO4=1'mڸ"" ""r С^/LҲBBv2˛ZY&!+Xʢ'Qټk(;8U0@Q q 7N@QE]'O\|um_!el/L2a'$m~<RL,""""r0b_Ržሱ3lƏz 7yc/>6Ao6JDDDDD ;@\$%%1zMNNuaI4]bT -R31p;ҞMG nBlQ9ظni޼9@4u*7 Ӊ]]/̐I0Fl{@jp,~(9e9˗?Uyڙ%s68p^C ~J ]mZWmQ=׷o_ֵ[\.zZ"""""{'11D9 h$t˨DD0Pz*;;SSSٳV(~/wN:z׬ 6lX ̙CVVVe^/""""r8 RUMUٶ͂ իW2/_k޽{kL"==}MJc 7OGKDD@DDibFb6.W݇r4xm8NYve03h#~,˪ 2TYW. amU>.c}R~[B_Xuza-sqvzu/"Ƙ[tEjBJJz^s7B]RRRi*2ێEo_ǍAӱ#ǎ" "" "" ѣG3`ѣq:Ny3dbAA3?X/PBIY!e;()AH`|ǭsz뜑0_Ӯ7rsom%u׼Z24V}Lfm3H:?<7cgҥ|IjWKDEEQRRRkj@]DDt:dܹ̝;=1e4L?@)>ž (P\V@o;ES+ K[ׅaw{2|"FVQ8Zr8b|Ǫe}XyJ2X:]|}ɫ֦4nܘ\nn۾};7QLze0CXe[XI n[1m 5yib nVd\ G.d2 }Dݍ92Mńh ,"79#hݺ5N/baXņ 8餓@DD5uu2c6E(hrk}+~*bބn/>6Ahݔ>Ś( ,U.fQ:L~x>L0TLΛZq\='1M")XReTaa!]v%66ٳgn: V|ƍ,\FqqLkwT""rr\$%%1zMNNuaI4]*~#S.Dj󉈈@¡4jb۶q>a[ٰuU 4XLÀP(Sf41QLІAx܎p1c0iҤZkEv-+98 gڕllϜ ""n+"r,2`8Swg]|>_E0yKXWXʺK=o ~aEʊv(ZךG*?TBp=N#%9G iC6=K專e<~bG.(ogSxѣ0`g8zj?ocLL3H hJ()+l%e;(PR\yò59bƬMeh.~KEߐ5IN9u {,E7Q$33s0w\2338XI 0EvP+W@qYžSTOrKk_хX&}nc+[ۘ4q/v>6&\JoQ Y)=?DD""rС^/LҲBBv2l 2 Ym mf%c= OqD# O*f>k|,t=TapVIG۝L*>{bw?DD@DDSW'ɓ':_]lۢWHiY!ۋ7L,;vyبɀz3>蒍 Mń IM˨$jv{K3{'5V\D0&X""U>m_Ҋ&W> @GzGu<~'B@`ջ:L'?"p^C ~J či]DDDDDD\߾}ˣ[n#{bpHLLjD"DD䀠`_F5 """"" ""Wͭ1=55={j'xzԩSwɡaÆU`Μ9deeX "" ""pȨl.UTYm,X^z(c 8Fݻ7~,DKDD@DDibFb6.W݇r4x >G#?sS˷/'=Mԁplc٢-ĨxN'׏sU,Ʈ!Bmn! )Yokח'%M?P4/~w NOMxlmX9ua Y&OiY!!;e5I VԂX1*w[Mջ"B̿}- =HQR]'O\|um_!el/L2aPOq%4'isz4"r*9 b V ڹmEDg]y;amm_Do> @G'veFu)'粶ԂP)[}N֏yp$(_̰q߄,r}+9/a{HYDpr799a`W$ wYbT -R3R5tiO>";mܻ&ҏ}յtr:2ٯmo^։mjni޼9@4u*7 Ӊ]]/̐I0Fl{@un-tײ>1 qkӊ(ȁ'..z;zWeۦuFs}%//n]U^"11׫("" ""wILLԊ%"""""Հv^ۓ[(^&77Tz$"" ""P`0O?T]v%22 6lX ̙CVVVe^/""""r8 RUMUٶ͂ իW2/_k޽{kL"==}MJc 7OGKDD@DDibFb6.W݇r4x'!Or雿qW=2""#598N233zXI `cc[!,;Dȶ-;elP(H7eЫ85uϳEępҒ3'."^sToE8 vꝰv}Ƕm6Q/ط@@_#Xs{y;£X3yaOl/# \݋ EMpZg%7}DD`E̟?y7o^g+i Tx1jSKokFyH9~8gj,z9ȴi} IDATӆ[neUj###DRnFe6 ,W^5X|9>z1=++ݟ|?qgpLq]"cW2(ɴ29>yysܱ̜=:+a@:(Ci5 p>5a[ٰuU0 \XLÀP(Sf41QLO<݋~ 3yuwdv〄G8(3I&Z+(oY٧ i}nW>s߻J`Oq.k(nC?%"r,2`8Swg]|>_E0yKXWXʺK=o ~aEʊ|O}j )Gte_k~~kN@TўyXY ûwc35K__eyϑ .֑cG|F~r߿3AJJ*\Ew۱Dždߒq,ωG_c\i'GN=8Qm_0tRhULKF'ڃ ϟõdL:vڷ޿kE!W^}GQ&~lK6ɦ'@%!A,gg?<YNNCςA*ҷBz;; V$L$&"l۪q۶plˊTo[9-{;V]DDu'-""gr{p=KDDDDDQ9i,ʯXnY BDDrr ""B(\ PDDdaHNNz@DDdD"ͥ[nb+"";m7/L ޷H#6mk׮+|ȮÃiNΝϯQ]eDDj9q())!--M!""{DjeWDDD۶!""5:~(>@DDD[dA;~((kq)lsm\16om͛w{,K]DDR:]+ CwxKkM;DByOYY[:87~->dfh}ЃIL+H vq4""C[ށ.g͑Piz3=$ xq)Æ@CkߟSyYvHyf7o7|yGRR91 ""zzx\@?C8GhN!@RFw];9<}P} |67x:.`> oyqkB@ 3~r7_/s.m¶rta x`n\.@cu{z4#++'\+S[~Jr{^ >.r}vkf~noԩSTԩѣwO`)teг3|!#9bȔEMܛpD4%/1_Nd'?8ng_>*4ȧc-pbr*'?`L+Yc?a=@Lt[%;C`{P1| sesx[A9_An/7`{ϓanr6Mz[O_LWmw|gdU.Ey,#.^G&S(KF?#|v ^ ̣N׫SYxs'7L}XZ W1g}a)\WɭH[5[~8W<}@Dbyyy|,]K_#HG]DD=j0wT9Oyq&gc8k*^Ơ1w"zv\՗j\tpۃ^gr\#?.ѫo:XGLb[:t?doŠIvl.=3XPOd>+3shv0 uv^] DmC)OۏP dƫ_eG3)2@w| Npɾst8vjT4;5w/Sh7˛CܒdR.h@b.zǸ,=M:01m'Ȓ?au[_<8}ޟw*/H}C&{'VRvVKD(g}W'*_դ H vMy{`cHXXBt+'x%]wRbK f ɕ.71)1g >v S~~\Dnt(*mFj5nsE[vǀ|08"[X\~ݕd|>4Lx⭯Y!}NNb 7.cS4n: B|Cq.n}n9m(_7k*Ev;A .-,|T$havg/a3u[{N 4|Uުa&0ama1$DQQ^6* ~ "R x<wRgRRMS:/2|gdEW:퓼<+| ncaؤEMd*oq-,0bitzE]ėn$<LYs'p3PSxGYVÛe}?_?ZeXUTO!ǻkpll(mHv#޿˫qIuʟgY[7k(+L 15 Dzqp+,lVZ2|DDѫyhѬ-7=]93pW,W$JX\|_v8Sw[@B)`ŸՋ¶,Ĺ]7rOlp53}iv6'/籑y^dlZ\`qkQBj@z4h^?aҤI :T%.52j(zچ Xx1 "::zY\:eNJ""G|zp}_|m5Mw}-[RN~cǪDDs(: "fCrAxgݯDDG;w.\-[KDDj@*R,k&o~x@DD4qgwһZLjv\Dj˟}""r\.,ڡ g2QPTV-T带sm}_AH%I 0 Ϣ) 33r;ZV}7k&W2edߛ>Km 5]GTЪ7?׆Z?*FMY Al\D'գqdEaG6eai}O!΄HCKopxK!q^̺&*BhUm_Ϳ7O97'=S[J$,=k Ma4ψUo o[+w?_ٓcUrm {'6DݏŁ8{w¬:O:IN;.G~w/ꗇ22? '߀ʍ4or g'gWza0P+m`ނ|uJh4 ѩ^mfoh]GboA v~O&6RV׸r -Os ;ӈN$L$#zËEߙ1w5 lZBqtN5)\0m17hҿ'u:n&vT7Ql'ӡw;X\m*rInK|];@$|&`FHk@^̆D%ѨUZԍƬ;6m&l~_xӼ}kĹli}R6'53}!Lh^dNHYs3ky>OYiX!#U8fӾ1 .Vt 3~6iG[=94_07*ߵw1$eӿf~gKGaVl[E.^фoM/8!m…p5fA​\Ȫ3ShrRqPrXLS@zhPl&S-Re;8U^NHiXϏgĸk3'dcZ{zwLSySkt/:m{ߛHk)sO~*q[8%˙:m1zp|h¹tt/VH&v&,~Ö3>m=[)Voٕ؅'mRdz dŔ[pwtt~]C>]I)`G"D!im1t?fOJs D `!%xV;$)-ōq}Q4{1%X&< s7r\tx]N~MbWKyKx34Z,t˟^u!2} r"48vz^+b )f_YR`}vo|󌙱2<6FA,bX:_XLnDpEg5ci Ψ?s|I4 -N岞/pEێ_fwChS<'Ӌt5H-dHd;^)@BA"c7jY~ bMd$f 8NQ]?mxI.>۶qñ%LlJ7qH[+VE!۩\ƨ=ecc!bݭ-+XJud8JVh&#vi٭˗`ɬ%l 4o݌:~(^¸&OpԈ*l,%^zmaY.F=q لsX[ԈVPȡ}\ .?pHy+EEal\UqRCz,R1vZYY!"`lcD-d|"XI pM _+,gnfk3zoWb7u\3w4'յ^gVOTq?y\sdx>*3⥆7}}Fy8Oq?X,{dݦ pm= (+cO-ōS:~⽧Â}FWƳ odp겞o#6㥫X|aGwKc$GE6-dƀʏ2y4+>,& C=7N~XY>cr*α*_GV?]B^#~7K#'> |E}"7(haK FH=5}ѸRvEAӍ˨a8&l3aXDZ FpGyR5(tg߆{vP8a1؎@\JV4`+fd~f,a j$ƮPqp%!%SjI,M݈E$IUlޭ,l:~R~{]ʗuuC|ݫN"Υ>.WGzs.L7xxHpcqKmqHWb[\u27OaE$^ 8 .O-pXzoǙ7,WԎio d$1Y1'_LϞгm x+)Oz o#ʝ-еb,Ep7L w3ZZО_ose{.L3gK]7@:OcYx\6-㏕y$e%lg c2xcbY*?MRx"Szsu>ʥM|1>ܧQl 8{>=F?`xIOu@tmZ[,c甗It -8 /bo? dcKΤyRFt}ڴiLkaIj܆q1$ߙ;-=&f!nKx=D'wdk$ujE=i!$6Dt߁YÚbu pxź3zf@>K͘\ufrq'fR/ލ3X0zj~5ƀ&qPVԹ )ۦ@'.=1ßCMH[463:'syfޞ߲&1| KJ*_ee0Zq2003{:hGT|"Il4wlڬ߶Q{Yz6oZ'/vlsu'Рy{4*_IN;>N,MuILftl%m< iݥoOo%IRT{ zWKu)omrO Zvq.rUPx.}a| EON`.+0]>Ԅmڒ[~$m<\/=t1/nI'˩ ﴧziy.q}>&y}.(iѭo3q{8qs߸i;>cW^N 1.]ZQӧW ;z]ƽ7%Lf07qkN&O rxK8-$v -ϜLQˡdz%s~zLz]t?W^.r*.ARۙeYU;`USW'!(#̖K5hVAZu d?.ke6s:ADjCz9cH㧝19q^ 9A%,:Fm1 r@Dw_W94MBfAaa!^F ""rxXf `.kj::TN!R[UC8fڵ @DDv#66uֱr?v*T]>/Dס.~? ""{kYdffbA.#q k>@DDjR>ҩ;9ddҤI*5/Bq""""' V-56j(H-.X""""""""""">KD,DDr\\.C! QRRBnn.`PiZ0 |>~^D(**"77nݺHa67n_~!99@ ۽oBGM}`Y6mk׮+|Hb&tܙ-[`QDdٶMii)iii* ~?HDDD`s˲!""m5#Ԉ!A$QaH>֤>lnNWD㉯LD˅eY""r)|`<٧9g}#rtQ9CC@3`"?y }ZeՊc/zq+PY"،,Zǿ[Uyꂞ4ʡ]kxsv1:u rC!C>X9z>Jhܚon~4++2<7v&Χ.{u3v5BxP5ŭٷ8`ǣ_UgO;jcY4INnICz8q墌$6jS唗㇥ h<ѓ9_e@ }/>_marFDDDDj^]DDdi""RTV\Ill,.KDD`$''3n8Gff&i`B8>.ިpyt|FPH!;|/kY~ݯ JJJ0a5"&&FDD` ҠA~G WDw:w0M[IQ!B 0 Ӊ"&&p8B^a9I\\5zH BHBB * } 0*QQQQQjΜ9{*VZPDDD@DDC]DDDDDQ J%r;EDDD䈯Ȉȡ.X"""""rȨDDj%uQ9d8DDDuQ1KUrm {h.५y\ԫK#2 ~P_CD(FR!^;W_ߙĐ朡V6s W}} o<ُCE(""GftgerKv k(G*9xh~<;Pq ց|/"""WeU6j!k,]_~M؛p""NjzpVȵ>Œm G_[Hgs8טly6ưl6~y#g6<6+/n8FDDd/[uÆWU#{2ϫBG+'O3窟Sx So˫g%<}/֘Wnj @ْ(i^;Q9ȡQ㥑uGu C_DDFq=UPix>#nه.R%s'=V n1_81`[oS8u\ySz_!RQio)mP5po8 w ş l*o]0vkvMWl 1.~5 !?gw@DDBJjq"R6SHɠc/raCU"""rmݱZ."rŠ/>#BwŴԞe|'q,J7-b/(x96jK#A' &T[yDD:?IHkF̕o$:1_Kˮ*/9<.YK,ޫhCKG=SO9 땞4iCէ'52jԨxf<47Z>gfgv(yn?t"~ ^fęu@DDD}%cǪ#Gxc5 @DDD}q0^Cc@OMjɎe^NlxaFc>AޘULUw~Wѧ9Ek,W!O<,?/J3- DD*epyqӵWpѹr?P@ysՔ!V},?!CpʙqߘwxNq7V6)&}.L8/rYOX@E3aI*[Z5 ;pəHK81W>Y8Zv )x5W,""" "G`'_ˆt$lL&^/U4o̥ý??o=̅v#v&VFŬӺZ^.yq=hhPr -Ȉh2`킍MRVig|:"EDDDDq JjG\f 3xbV/^ʺbw\}5r'La/WCEU?_ń~Kg x̭?5M8]yOTP>6@4m1vXDDD@DpX&FEL iHv\wi~x> ?82 3x R&X_ ^gtv/RBiPIOPJxbi (8eXZ-[wB"Q]Qw,n{ry;ݧ?f.7K`Ynwr6 [Wps7mEܙL.i1^ 63XSVơnTʯme:xыHixͤ1|{L̺nr7~rxgS#2u?iE9DőcZVPkPx j1❯8w~vq͈f?s6YHػx94;7-\>|.Sripls (߄r̪'rhM4I ""rTA|\7Y#ysQ&{\-~ԏ=q snjG7P금7F;ie1_vMӵqOsYQI61MXGÁMpW0rx;q=rLbV8y3zUNR Y19g+VЪȁ5jԨmnJrȿJMބǸמaTczw2ǤoflT""R;DDd/ض]4Ls빛ya&e 0 I}ȣĂO 99_步(&n3jK} 8ͤYO,_^b5|3r|4|jf#_ʀ1|p͛ '@-9r׌vjBM{G)Z8so?lh>ߏn'pnv6T`-c7)mڏc&MBv(.tr9r$>sJ␉?j0|q0š@,6X,GaL+g+|ȑEEDBw;ܷ{`/PϽeC=!kSZĩ Rb{y vv.[`1ߎ[@~D(];jϷ>q +Gbv$ fβB *b9$ewhԄܙL_v Krs<Y|"h-9Be^Ddovn7uݫJͣ6&w'V$u9)n&$O$~t4,1uqlL  3i|cKFMݺ[7\9{ܷ|}p#!&&LBHjf,(oq\x<|>_ĕ@3..)t?󴭷M?;~-lhKgY8LZ#G P!"""""" """"""""""""""""" """""" """""""""""b^B!fϞe[j놈(\eܹ3aT T]qMF=msJ?hqܛɏ}O[됮C#f05m 'ۀȡ #`qV|f|49BXwh i}̛Vl( /thߘx}DD@DD\$ M7ij>V3I}3k8&NNV88nWш"=;{p-NJ6<7un"EY67H"" ""Rζa[[͛i8CȮ+&abƦӤqً)3[X<f,H!azlN'ySٱ&8'":94.gXN̶l̟"'mCJǓP=`No㫨fΖs@6, [kmv{k^~koimmEdQ } '9$$@y933>e-gTGed܆E޵,BخXdtǼM#qSr|RL wyd(L ܱɤ8 xe.r6p2)~#˛GAnJ{Ll|^ 5IYɘ5'G |r/Π$܆ITz ;=nh=8S),$aғ^~FntK0 <9 Ȱ(?ZR֕F 8×JVLK.4f20h3;)]AP%vDD> ,arLΉwh.c-z-wvJ R0Guni~⌎'h0]>-3VX7-o|q~XreoalA, WQm4!bـMcVVoMYu0A<1ZZN7a5ν4Y+8MH u(t駟nwЁ/kK;nSf00[xۏcQZ݈u "h_ӝ{_Kե5t\D-6qavEhn`ěX o)Y4O堤S}@:-|vI3l물Ddm#I9kBTKD3'6ێuBOq9 bSE<l_S1 Op^2So^ώ6 ,p'b=Tl,6_ķW`x@u*À=jt= $d[4-ap?dJ+EB4TQR2+LrˀHm)Τ]Y0ua0 e43λ""8Y:S\\|i322:=_Ó΀\o~pS&2լxN_yH2efbV-z5/7Eyo5[K{$h$6o W/gkDyMF7;a|[gCn1Ó[5on. ._"2(u NEs#ʗDrr՗dvaФQsxR5d$;%g̙3Ǟ6mZ s}iE;wnOֱ%線@`0H8>524Պ8\.ԏٜ5 b""ry錸8mXOh>DDC ""rBXx)# FO-\r&㹣@[BDD.!""""""""""" """""" """""""""""L`tBlri熈(\1tP 1{-n6֭POd {y>lg^[1~&#:>Tn䍅u\hҮS#K^cmfS.p8ag۶q:qZT}:b9h\Q~#%SOf> ؓذ)ٰ˩ Cbjw SED@DD.\8>@چ|zZ)==DꏱwX*;'fض9ш"W@|5u,iqNu_}Ux^@3rh؍;={葔|օֶl SDD@DD,:0Lv4mZoMLČIw8쪢cUgj69?"Gƌʧ;񒵬|N_2odH ;p+W`5AKJ` XMxmg:ehSr ]N܉\7nIZm`Y*I*x]w&C'W b&J bru`nޅpYTo_.;ӵJȠ "Ķ|ꈗ±۰ۻx]KVhn69|MB没DJyvvĐoc ӈ:l^'~c:Ӆ}нϦeG/C1kBW/fuIua'1y3n>YF͜FA)_V1kh";Hu# a#0W-"""rh0fϞMII &M9g_-]AV-aMM.)d]+DfN%=m‰3#M*ҕ9ܟ)w>ºxs365j ^\f7LNᲕ7juu`9$psp_N1K~wr.<O DDC(((&)7δKXxێ2&ɏ?XO٢r7kGک u_|Y7vF;xo'X\z6xø> :}Mg`y \W +XA?!w*QfkXƸ &X:_pEhVN" 4meݔU +9um8ݸZR8z4(g٫0Z6}#1H\wjNԡ̸}Kg>h'>hGݲ2h7Al KD@DDu2۝3tKèu뎣۔ L8XV7busvo82itrui nalFh.sтx BC]+"%+_Yl =p!ʖKoMO4^_O6+DU0njP]}z}p6к-n a O6@M0icV# >D䪠&X""9Yxv$3_z @f`*)f#MCU𒙟zvT VP^g;ܴ;72dcz jKFKP ǶTK LI&`g%!ۢh ;\䰝%KPZ@(e?>Yah\DjKv49r&:Ț `i,o?V nI?HPCGMM;$ 9Ilvo&>1:ڀDjHejvq_ ;BlJNGDD $==NtxC 2fūP6pFJ/{4װjˬ 8})(G{ZB#0 G&ycz9K^ۇ'ClZ7❕Qܩ ߗ:r tFNHys#uapIݗA ;w0dp.z>Q$$; &(?{J!#v錨 Fx>*øbV"a|&@,#)[>zƦEiKҡe}e5!w27![E*a̙3Ǟ6mZ s}iE;wnOֱ%線@`0H8>524Պ8\.ԏٜ5 bke4qԬtW Hgi# |:]?G=ܧ!""RKQ]5b }ԽPDD@DD3/i|&O[BD櫇((ȕ:ϝ;W[NDDDDD.0Z\i p0 mtjX5) `.|)6i!-ziS/N EDDDDrçHSO[+rVh,w?SZ TEDDDDDڲ,T0PRRiض}VY󨯠Jbhn1.hdTB R}-p2. 3'jjO%W.IG0b7f8Na~6"ӵl +6֎ \ٰ͞83*n38pOCG70,+=Yq8D[12.QtZxٳgSRRI(((Jc;7$k"q0cpE`;Mغl&A$To坵UNnI18u) vFh3pnjN]X ,&%(S?}^?{7l2ΛH6kصb1MdԦy<5b263}8ɽ2f`GpPTTĉYxq z2=c,[7`ˊT7ZD%2|`z9(~Ij\PH9PS7Ճt@-K ]|i@nvVQ7&\Kߢ)9`{r>)Q&@AٺhTbg|򓛖#*;qTmu ;eQ8&B /gwX4SҨi Sq!/okض ] ևpxOQEl3oRc:qaD,;l?U!hnpzpp0l"\?F֋YC;ҟ~`֋yGSIv\҅o("W:?N_ y}Sظ:qҵTˢ"-'nƋKˋG)3`};1!""ڍZ6Ǿv7f`ƌ· 'NkpMٍ~ax`>O~S̘17pm@ |X8|̘q |W4o%g&7ݑg~YOm: ׹Xʪ#2o)ǎO%[A*g`(?xڈI\Dcl;ĉ8N{kJ86! V:, >jwEԀ8ƣ<0}~?T^]ï *]țx0F`{ce/sZ za$4||{,>uu~5Ӂ<3IsNcqܖq"W$==N3 Gf篢63~D/b zfRpª MR|Fg#ֱtKlFʎ!h\CdYԅ 2򆑒uFR~IKg#玉u vR ;x*$1&?1MS[)8NP=/>T6/|{;{r2L[K|쭱u=&u ~7'B\nygܛ{t9v5=Gs [;oYH qC*Fߘdg83K (yH%ʄ|<ʧqG#7Jfe$cFN7()n9\." OM"˅i?x)!Žp%zf_:1o iu(_C ֩ɶS[GIdh'1/ܙL+hR7YBDD>8X`_ҥ[-ˍxU{&El`m;I5~|ywWsIq8/ϯf|m:?j."5x=pV_/c~ç\>Gn>ϔv'ѫ^z]|?cDA}G׹#@ bsRݳ+K}Qdz՝JLwv'tc"n[kl2\6 &:7#>l_%GC#̞^ʷ%85HƖYܒ*r.p5QiĘAʷm䠑xv\U.?I;xϹ~w:Neؔ8Kwr" 7KׁNc'fzh -edL 0|YPSYWȝ7c#SN,v_;grv4g3?b;:=&9\ GٷItz.d1;Dm]OyCEx|NBMmTa>p,֚ C+D}j-"PT݋:i#Bռ/d4nHW_L_Q2j6x;Ev5X+  lXʒ?WDkȣ1zCu*f$:4'iLq jʪx;jrY|oh^w|gż}-t/ _IlŁ'VK|øBUrTO/^Ij0 v>|,q+pH =ΤXm O~N2fͰ7|JO-y1$8^_/k%%K'bԮgUǒ?~>U;?ɹ>BԼDj Dwde}#~&}B2.lj-uSxH-Bݺٹ$`g+Қȱt>U8EDDDwM|᳽))z߿cuuؾ/w3M>31x']@RIgo֮¶MۊrXdٖԇm$ƸpF;5.2"jzXż__JMwʛy`~v.=@ M.cd}֝ ,g/r8{S_>VNb.M5F~ /""""לh=kIDAT-?1_u gyě̩_b_ 9!$Y*iC~Tz !Oie͓Gꈘ^ gޣ=qg,s=GHqSpDlw|)TqvY/ w}:͝;믿^Ǡz}?>?L~8w}Mlf~vHsFgf(|ǃHgz71yS&\ `-[wھ}"""""rj C0,[N=ݶm֭[u,đ%6e 3](""""W]DD:@ZBG8& çC<ۼiQnA| Ga`{s?=""""rm çH luʎ֛]Rz H'Xu*hfo7%%%mۗ$D*7Ƃ\j 6 ? kzR]spW_̈́CHY]DD@DD~-}^ʫmu>HDDDDDp8(**`ĉ,^~+~NоTbs6 ""1 j\сD= .hze7}2ӍT+/c`hsFR{Cā 6"(Fc\=DD3'KN5CuЍְ_/4 7CndD77r%߻7 ;7SoA""""rs\DGGE0$ jE. sn#n"{D; m0|Ir[̈́O03w `Qi#\"""""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """"""""""""""""" """""" """"""""""" """""" """"""""""""""""" """"""""""""""""" """""" """"""""""" """""" """""rmpj;w6rDDD@DD>~]w݅mWr?Ovv6>Çӧe]s4MmFffRkἮM """""ՀqztvYQ&toYY!j P""񤟕DDx DD @T"""WՀ\7-kK(5?}ϗಧBƽ>73_""""VFamlXCRHp{"'nߛy\`& /MKDDD:&X""gܼw(9owھ=>3bGhom<=:۶,כS,DDDDD͠'8no, Gp8J~01M'<%d6d_w?W*3_06֦Ex|NgzR'= |;_e'{Tȑ8ߙE(z_bv5~݉8t\KDBO.Oˍm6>|iV-c0OAݼ'է7{2sXTeK& ݕ ښf&X}<O0/ " >=Os/a:DD!f71 NMa\0N~uj+,=cﻇ]{C?-`UH|/Oekq[̚`w|W(i@ ?>ӯq>7v_Ȩx\QxmhhS4õi.$R&1%m6E2X$2濾š}|W&a⧿īiEG_wXvwtGkP|l9[j"hlpI\ܝxG}@l \1 $$5ܜj^4lL mD*dFNj|95Ĵ~J==v#e """""mxIOOlmp})ѩ$d¼7y0}ִ\lE@5 t4WZ [kS_H_o[|@l}S5ҝWx~s#vVKI0BP>=Du .brh]Pd|#?h' ~fh.Ϲ)NǶfa7Qi骝Ҧf |O|$ [r~;SsMOe$mk@8;}_7x1N ٌw67v5@DD@DDpLoO1W_y󝛞߁/51w?Ɛ ڽwϼtFieɌ{׌k;=A%:f#oMnȸy҇}er3Y}(aܹrrYؒ+E7|n{eM?m^sh;__,Zu։>'Bz' /܎R:lDDr믿^[M. ["W|,[Xb1L{+**";; 1 jBi65Yxh:.cf4':,]SN ǝδHqTYȲ-u\DLz*dɆ6]#!aw(5^QQF`j61@)ٰ ݄Ū5 ư%e]ZcPԁۂºW8jt^]JaÀNaQ9$Y m4+JK)--ҒjB3yRHRdC+fwKY('P%*FJ}u- oF6Y.҂*Xclb 09l PS+vjcMعs'عs'SRRrx=ۢ"ZSv:U=ϊlYb$7@ԇ73gR|[ 5f ó3Bn vbEq$ljN6b`݋xk7-ܟ۰g? 8ݻw),,Dul66BS\\L8>wIzz:`'0;IYuTH_.|DG်uggP( bؠ:Bwz1w 8:)G'ՖS 6z%a62OEIk_L?~逮k9P0 :{#, p$d(2O^ي$!1[&;: \&bı`7A>82H02Ċ *bCƁu?1[mCh@A+4M#(޷j5Ma0tT-݌Y6:Všmk:#Ə vd #28{10s7ߗD<ʓ<AȈV|oy&9r7i(q?fxk4vV| aDj&i.+VbCU{nLi+se 2聊-kA+>!c6 I'&+ub|5bvWV7-ap20K.~mX~1Tݎj:FHNN`q@~;"xG"wPqZ,N4@ 0NFm" o-4*kF"Yr-n&I|<#m TSE?A#LK=nƞFQp٧0GTocolɤ%a&`OeֈĵPp _j_@ׅ SB6'HHG6ԻLBzGR+vҲMf+H|bª_2VPZߊ7;ҠV3&P^4;IɸlˏT%E5D0-bs=SZ;tϬ-.I:8:(Dvccyu1$e1BZKJ E$Z@Q;vO.] SS[OT;XlnO~5\.IxEl?Dlsz*(> !~q$QZ/ ?.}yi'42j`OG(ǚ maiIuݔQS8=i60Z"Ԍ#[l Sk{ӵ B(vH ADlADlA[A[A[AAVAVAAAADlA~Wz xUU~XNxɄtxM۞F47RWW'+ڄL߾}(b+-%%%[I&@AhiMvv6PHV:JAA'|2G . ##$>:,2Aփ4 GVVT t!|> KmCQ B1HgF^A:&2lt9e/ ֕/kanAtA~lb 7|kܖ[z\y%wh \p[o߬7=OɄsybaj[;\䛼[O9p|q /ϛǼyx}_iǑX)JrqJ3> ޻?))WdZ\>3>7ל({z/O[ǑdT-1&3@&i{b ق'ý-v3`P&?cmutly3`Ev8lFO:n%DmHP Q<鸍zYlgzAmP\øۉx7k[MrSC`6*ȦCԎpwonͿCT-|{>L0;=dj1A)>) uq`q6-Dٮ'ҡMB1`6)h10%e7mq~}iI4~Yu3 Hů pßR5K"v4t5L͎,XGG";_h_-!ё7ъɬGv}ĸ)ƎiLdtʖm퇴5JR8nX2t~ o%5*w[;/N o0ϳ2@O.ͨɬ֎|=`Cmw_{v௙uvi$xcG3nN`GKE9uX˞)ƯH;s 7';^ᶛ1K̭̿#m;8)^:n&W'ʬY|΢Y{;Ȥ˞2>ol0ɡd< fONjj t!/SNΟ?_>e(^ 7(]o"ox)6+ B#XL 4M󑕕%!]Hnn.>S0EЁ t1gyo;3'.9#(_=xy6^k^܂a Vŷn^{g~:8w'/Gl__9kK-13 fjegI==.-͔ԳSbBԶvȋƨ9;t!V7 t~mq ,oaٿg t`|Iq׵ﭡ<`IęKXQ9>0#ۦQgSUpB56Eyv%7=6gg m)mCDtX GD88ۘy6nŭa˛΍10y)=u#ǚh 2l&yAʉT,Vq t^9R^$=+ cywǂ!b֫0osq  ^u%fr{0vxdxM{ J (66MNeDOb`Woa[wl+Vع bۍa9kgx6?n ~%7=²CL8z 0?&ڶ,h1Jo(]WKŰd+^'FtLǤө\[B#qdl exYIfQ n%Pւb Ό Hڣf 6pm!JzNcOsq$;}eԷnozA)٘m' Sfkp.5]\>3>7ל˨D#0{m[}tJڐ xqڛ^ijV=An2:tEG%഻̹v놛Ѣ!MGl<\s)A)>) u1d@5ܝ[yyCi!vH=)+Z!Ow!/-޿?-g{ m7⥟3Y@$hoCaT{= yTDitcDr|]yC<:X{Oej漰 ] ScK65ߘ-NGY" IDATEzm $VLf!w%)7,cg:{ 9?>87&zx[ [Ŗ⬳ҔˍI1,&"g.gg +0?+Ɨ+.wd3&rϱyjGҴKoι&U3x-+dt:?fcP6>u? fZ^O ĊN`GK9Nv c13/s 0=yO=uJzAmfΚ5Kϗ(zO\ sL)[+[Ɩ #m. BYӧ*m#] /ԩSiϗO,v+䦠+OdJ]뺂lElB-R,]Dݧ{^~BEUU[AmmT t!8N92"=Ll^/+D4Xb{&W %fۃ0LvYbH; аj%77DElin#FA"6tJhEl{  : ݃> " "     b+ b+ 4k^j#,]Ҳ6%Hg̘XAm+K@~~~jƪUXtc'- O. #|7KZZ!^/ƍ;2k,'.9#Gu̾r닰K-Dl|PpvZeFU=*uo370Nz~5܍!]<!$Rt&^x!JYz 7 fڪahZz eϼ9$+C!aSN#[шlL&VLZDz'k)pefUq1Iq#u>2IPꄶz%tnE?+2m~MA0B[&ścǶkX@(|xZA#YlnpH pؑ " " "   TA#*IeBg=RSt8F4SUUE8FuA `ziZ)~***ptj$: )))vxB"?uTU,nVǃhL 4M#cۥ2 q8b1 Km`0H@EQ:%"=t,B[#jKzeUP*kdS}>UOC=V'>~e*r,m >7vLKKK3?U4)Hq.b2꣘Y'dz%YSXC̚LqKto֮'?r2 g2>!;`Ġ$ n:q]}*X3l-}V`rTo͎ǨX9+3iܾ|J^co#?!5)X7b@A3V(؄j-y6l$h!m0Hc1 儉Gfi4-T%+R#jt58?* kSRPÇ3ϋyWxBn.#W0R8jdF$Q8}l-3mG9b;A$|XdNܓ0(Flf F㭕O;^8<kئsԔs`W|V#r٧?[ c߰9g8|W{  iGy|3痿QCmt#7b1ub˅XS},'b1ix-ErG꺊6P&*"qYLA qgVjJ6kڐ HWȐ',['֌qmJE4lK}[=^C߲> F AňNr@{ GxPY9|fIƄcNfw[=dF&ʏS}#[{sTc ‘'ʬY#K?dU$ twT=2GD6 aQUU$n ))v7TI=4&L],6z?v3GҜhDUU+AݠF+v6'!A{KvC b+1L2g/]-tjU&p%+]dp`4D"Ggu=ޭ]躾wG]] "{s8eogsDN mCPw{    b+ b+ b+ 隗KM333f$(ViADlҥ@1j*.]ŘI Ku>ƍv?˸q:_pdO\zs6Gpd^/m۽}_ʯlAzpĉ:n7 s8mw=Ͼ%9^Ȅ4 K|ď.A)@l6cZZ[6|=/ d[U>LLh>J6iQAzؚ}d2aj1 ?qywT?c Wݏ9\=Bh{YTj L~țW^+g /^:,G[ͧ1٘/LﰼЙqӌ؆ͷWUygxe!~[c=8k(ء {n/Lv_嵜 ;<I4YܯesOR\̫cRu>2I9^Am0ꄶz%{n#0Юp@GΉk7u,GO:-me+[S7_;x4?/$h߬7=OɄsyba{?VxmY]OId/ ^牏K w},HYsc|^e98ۘMe}/k/pg vdL<-NBp)7m̮o7wy{f?Ŋ=aX)~sof'vm ͼxs7^\:lH[aln=_0uT֬ JPϟ(rh&_pQ&Ws'mŚnJ67c/m),cT #sZ_jW8z 0?&ڶluṌL6cJ9m u;>X.<& c.Gܘmyzu/$8*F%ńx/}}2A$+ 灞AӰ/l3w"xbfp0L<AⵅTׯbcn|c>j-f}Ÿ2G˨=e?\}cj-=婷:J(`dBtL1`f Rq@P63g#4fkDЎ^Eoyc4c>y:ӱKA #TQtO%INpbkEG:???bv7˾wr}iW+ vpݏq@f\y;u{SRENJN3 eCdfJƞUQr Ghl6u9+a2?ϙ˳<3<óҼjp+g2WcT?0Y{Oej漰 ] ScK6Fz1.Y0{v 5\OĚFL7FT*ו՚/85L<Km08ȮOY&b-,yoɿ`\// )9-MkW\_?p?΋j[oaR+|L8Y_~)HgsBZ$֟ I9e"Y]K?k32U፛.ciޕ<,6o7q/s+9vll' (f;A75kV G8qbl# ,n0lp**Z >ey%f'ae]3<7g)}-rrsF1 Qۗxik63Ob[YUM7ǎmR.X,F FV'n*"`O”?̴ ZAP#?ʙq͐ǁ|<\AVAVAAAADlADlA79z xUU4M*C:  UJĶFTUUu]*E:(l6^/h{JĶy~ 233q8᧎AJJJpx<BOUU#++ [`4)**"%%b+d=Mӈv ABX )b0 :.FQN m#; V[oŲY<V֨W ҙ 2U}:SOS`'Y%,x=[AbPыIoؕ:X]LT?JO~)09N_پ0)i'qIV- l2Rf@lۢ3i9Idg_dHĨp0;3ElAĶ=)T??ުTʥ-Ea4 ZbcMu=2Ʉ#} )ZC@kh1v +n,Q?;5ˏCtv- souRlLVcWPTkBS0ՍfIojA hzf4zYQKSNg׊!^Ųw 7AHCoW Z*NJ<[Ap@TTu?M Hn*my4kJO?{VZpm E !C+9BM]|@PGPMN h73qJ_OyXC~UxSVDlγUX&-'p8} F`'_2-.52i7&2 (Vɼ5#6O}GON7yCsۼ@ʘ32yQÔ_n|^.D.6 [~̟?Vb~ IDATz^ou }sZ8)H 3gytkC﷡tmaި "nf+/>0oЯß%Ia!LE l /m@@n<[E`|Osd:$p|37~@8IC)M\ŸAMCpI 1 furZ~r b6~vjȪ~g5FM89<=?iboj;2c恥}BؓsɱT^ŎBGR#[((Oe! g8m≗PG)|v91M\#V.j6IO|v8?ѶC({@dO^kYx|ax?ْ2i=\4LRG+(_߁oӓJyx@/=o汭~)#41i{߾.:tC?΃psǮ)_y:_^uIcHNk.9dž/g?_r4tꎖ5y5Ky ALdUqgq Dqʻ ̈́{~պɽy&~k7oSw4ّ*rFoi!lAFf|Z %2,'hPܶ3Cǚן+8/6S{?- BMgN&SJO'2,+HRs3q*V"jCCr$|yxTUx/CEk@dGMCp m[Sˎ߇DS|mdqhF}N!EMM%VNTi=ۆV5]USϻJ9ca.>7^qp,&(!S}xOJS B!Mmjk~JsU).hjo,n_90R©/G9;HkGs:6*(Zlaŝ*6<#C˾ǿ7쪵˳ -`k/=&P=-I[cH.0Կ+x?Dœ6l%bۙ颱0{ABЫ%^HIT }g8g|V֔3)bKvT$EiP/ d|+̊B[9ȯ|Gپ0,lNgw!q.LK?`v_}Ρx'VVRcy+}f~$(uK9u&pq}5hL3|wR$XЏ xc>Fd͚ĭ?{Z/)\O%4hnҧ~o>&ʦ0 A .!??Ŭ,5^v|-dvM@Yp'9֫ҏ \L˻A.0 &r@X.?_AijAADlADlA[A[A[AAVAVAA\<~6oAq%OJL`̘A07E%//Um6 ;vy䎕^ #2~xbbbo㩩J>׷_v^Ɍ}6>2FA4"X*A0(XVv9UJ+'> ՂMV+Il-X,,l[bf)Ͼ] a$opY !_b4Xcu}GsӨIGeqi_o$~[^Ex^Mu`7^{~|f,X N =ܑn6@d͹Ɏ}l?k#|#ãX"[Sr%GNS/_OAk>\Ɨ˭b#nM|iUF HRl-dk9FPQ3谖uGV0L?>tt5&54{7I1- [LK38%.n k`=fz%ޚ4TEBp\AJhyl;+̍ ]ǑzSQup`IxF^PR^%w xAU?%%RK{֍9q~smD$'51 ^k"*/ )S'_vzF4nx(?/ ؈LY_юnM5q2>AYp׫f׮i}ph+ǃi=z[@&A(t1 \.`UY9BU%tp(J FWNy/+luo MJt٣vթ|XMZĨew/I'\bۻ*v>F0y 4keOlvw-H:%Q;VIJv5}G^dtkonqi8t!*vcT争L3TUTEMɈFDlkƒ'{0l-OqI#3i/U ~gդh/Y$ٻf7L:KXY#&23kl2ev|UYw6 m7U!23Bj Zө-2n`}͟>:b8m"Ouo-הjn1"F` myn)=XKXF VU3m5Z J} p;QkiDddA#`YLR"e@F$O>!Imdh_9ܨjTj+pY#pSwgSQ232gFL9&,)C\\N@wnwl++Ϥ9 K|| &0D[ͦLJlnsqs'RBehz-{/慪vɨkHK!{w*E3jq픙8U /e^T;u¾F{uU,xK]tf:EV.:F" FƖzH˰Q\PNc~Z2IhniS@6HXZxo]p[$n:~N -}f  #tsMYHsR,ać7R\Ҁ^sK~_u2vX<+XQA,Yseˎ"j&W]r]y_Wk8TZGPS>TI4pkeS"E;[P5G\$'8ElMSGut ev.Zpx1..gؿakp'f3~h U-)GYUoPR\߉2UW@Y m$XRznt:U;qHXk9 c`%ntFlZϪwE6f:ã[ QS} i Lv3p9pB3//O-\x eG4f pw6T (q:.O]DEEQUU#yˮE͝Qsb̶MLM|5MCl/0pEf\pY.I'\b+>AV]V.-ZZ,҄VQ?SVZ#<<\ br4 ߳eknԆ4Ok&>OV.-[P(f;1!˛@ B+b+gv{UDb " "   ܍  uǟ(.oSUQUT B+^ |>g{( N< b+z'.cLӤbn7Gft]>}v WM8z(=*rLiyTt1 \.`OB^>sš(9\VZ!/~ zx-nR/Z*ҳQUz;a5joRh&pem^ ӫwk1i˞7V"'ZFEwjC%jɠ#Rd r02p]tK_cmY뙓&hmNf*"h&uxdD`Q:Ev2 b!~ ֒34 0)l æ=o{rA`դh/`(e7v+]tb]tlj|Im]ƶ,-cVXΎkulzAĶUL#tj d}h9c [ J FøY8zI%PTLM-*&폧kW}p-?=N}HAu2p ETٮ|kYPs;1oLLϱ`-a1XVaطFk(hj)(1lwaj{)(ig>PC&Sಀk #?e'e \w6?F."ֳr(Q?i#8ԪQxT-.HO%N@eLar&u<`2m8VcrKgsA:y fwK~&c[`]}&aXEk8797$Uuj6EgR"{9\9ԀPt/K*v>DkV~Im7/TMNF]ER\ o%־S -YwPldǩex)Dxlک5ګje[Elwз=BoyW732!#Dž jL9Zqǻ hr0;^46CZr+sԒIUU;8-謫HTRw /d͗ń'=Sw@,TEqȊ٢Hۉ 4盟N 3hGO`d xAU38HMR Nǣyd[H~mrj OڵLF_Hf}UW]# bve)N`Y\=g }|r/F{Ag0s9:^϶Sq~8|ĞfVk[_-`[ڧcJjEH֕ED@j'eXT 7YU`'o~f#Gom'=WCcuo-:A᧋j*\ZF0ϰ=0iT;c*F"zz;Z̜C`euU лn6l@km~K OJ:y"&*y]Eu D9*A!U>؜Xudz pEQdof}IƺP8)FǬVM̈*r|ܾn\BDzޝ8w"4aUL=|A {w6:S"u5wOg8 (v7Nq &pzJOz-v~h%&+Yc0|YuLnk4mb>#Btֽ2b΁ fkڪ8,f aiuQQSoz+bĭSZiBԕףEt2 aNA̜5ӄ-aDm4C FrlzDaIO*cӦ4vF|x#% 5N7ەYc`GMDfy-; F_u1G}t]O-PiCCNP^Vo,']߱IDATeD2ծ:O {`n]CsؚJ,O_}Vf'9t-4P+ˎ#Vҳ㚼s}od;44s$pKxgd`Fbo`p@p ٫PO4\sxR^8י;KX'>Izbq1nXdڠhMe;Kgh8"W˅i-K-''^w&6\昦yD]4|"p!hJB!l6ۉ )\Z[A8أ W&AAADlADlA(nA8P(=DpxX,ZVZzTTT>EQp8w[A륬$\.aihl\Ϯ*hRgLFH^b{  EYsMuu\h SUZq)JtF> 2hgl\[dC"T HelbڂYk?fŊ숸1)^Tb=7Vwl$;Q7nc_I-MAc70Q!;c1Տ﬇TEbx[f~ ceǩ)XNj6e5 e &FHLjyQڑr&*7EVbGej ڵ:6&\ń1x4D(5GF'ؠ_BIM!6IA$,ȈOYI'$"x ױ丟hPZ,_ ̹!V)b>0ΙO8{9\&oTŤ 'j{%]Pn6:uIq)xOZN/4o'l~w 5YɸvLv≟U~ZAvmSOq7fC-Ǫ @{dҵXNE)tnw ErQ\ 3i(>ߓFFDO`d xAU38HMR Nǣyd[H~mE  %PKee>l1D;0QGڵD)#IG4#Bt2;\(ұJQWcXP0 5EaW)g|pZY‡U̞[k=~#q+sZuh3cz{#fO!n K΢([vQ01bʋ,]O-PiCCNP^Vo,'eD2.f9 OUoΝ]SҨcRixG&SG%l0mB?1[,9i*E;?WGg&b{y'ї1'a,YÒ=uʶ,]ē9bI]f$OBҹP7l`m]4lA%( S [;\f娐18C[_Ub\ìhNf«I!h@mM:{ ^y#?CpTčΈMYNB(Lg!bzpB3//O}*e 8gDL؈Duy $**;??_ Wf G \kir (=~ [GxxXp\h0 \݆ɩ 9i8Q4M|> \ZPvbB 7@DžVV466)•lADlADlA[A[A[AAVAVAAAADlADlADlA[A[A#Å^Cut]CtM:|*ZVSYYg:(8 ;qO{abN:HO`Y.:t^Bxf $$$1΃0 ][֐";RRR.-LDuhui!m70whzMp cG0icl b+mo+tsy[MBa ig+\fqѸN#;}|:֦|:iZnqDlг RwstFeg37n,#tz-ߖp ׏ܹ[\^~9u 7U,o:&qE/8=u7p[2[bzccV-:'_^MeU-酏WN޽p.x~ii8Ώ5Y׹$ \qnϷv-O=_>("rpOxϑH+ 3Ffٟ3oV4lSxOr>~WOWs30#{k5ˡxǀsTo&0|v|r##׏ 9M|,{-#UIS)zn6y i~FHA. ٶިcK]_|U\97lv} X]>G,Ē3:0}oqt"lRد]ܫR?)D;۫(J/-TsBw7uE0LUr"? b+gNt"( ;βq3էx/]juNl͂``qh7uzrH t? ؔu٥MޭѽoRU T"[) :_Tő11'LS1kQ@&b+D8g#㕥GXSI%S ^!?T "'WF3<쟼y?J0k6ʺ` 5-J#g -ru#IA4ŶX GAQu~*IKv~WwJ&0Ox:Mזoϼbo|ߛC?,>f{Iw8] 2l& )>{Ol = 's Ƿӏ~W1zib! (4_d[UbXЫaxugy=<#H҆䦻ǒ0p ":=ALko膁[04f!|e6#7{npܖ nBxr!Mr1,#LO E/Æ k jǏKy6ԈѺH+zgwmu ;ώmyfR0ADevw!777mt '.rasοxmmrLuPtخ_e_nm{mj%+3Moǔ6Q<[`0('`C(޽' (wp4 MQQ.( EEEvOa4 'Cr\w"\JaA<:BV\.YlӦM#%%EmSTTĊ+HMM%,,ʹŇ~/aܙ麝Yrkk[Hjj*k֬VNz"##qm10g˗ZWDFF3` q ZV("!!AXXܒYV+nvcm%A[ FFF)[_^@AVAVAAAADlADlA[A[A[AAV"M'? =֑IENDB`spykeviewer-0.4.1/doc/source/img/plugin-rasterplot.png0000644000175000017500000002354712262550403021253 0ustar robrobPNG  IHDR0sRGBbKGD pHYs+tIME ')tEXtCommentCreated with GIMPW IDATxwxTU?wz2I$/%dWTֲ ,QDDXbʊ"MDZ$d&?& %! <}ܹ={(͌3T @QdYf֬Y*>(%EEE ,SNE1k,u BBB"jA1ŋsT83fPo6^/ADI 8Ne˖ iRF ˅jÆ ET iժs'88XDF $:U:!pwJ8! QỬ)K CH -л{st5y,x+7xYpbtGz UEmm\t0TY-_m_!65p_vϕK|U*9rmj8Weۛ8z`-·S" xhj!V-e|(h0Zhж;:7"T'~װr^幋$iwÏ(olp8_vp &uwtI w}Nr#7yU]aMeޯrщzƀQ?#Y+=p>bwϽberR;erؼy3)))*Eir!d/A1%'pbhЬ%Fdzs6~@o忓R <|4#XٰwsporD&Xš@2`*>'oyOބѤGdI'{ |Rqq`G,Z Svmo"[)-vojj*Nkvq\]Ijj87n$--KJJSNWOI_~_й=(R] XUGKκxk]9HZK@H # q^CQ ] Fw 5ƶ"Hqc1 )7УS/l҈ae9#p 8s%gk }J.3-B%T/d9w4i5 Lys썬K %d&NvV-dݺu86l؀( ѣN /{Frr2yyy\8e.*mH׃8<ܳ'=.YEݒ-g6ʛz i܍1zNQrѣQ"~}Q~=ydPCOCOP$I t>${sVsx* 2 Z<v$-BֱO^VyR)**wެ_#PgFFFҵkWG)UZ;r8t֍իW :Ds6#f\6s2 NdԢNDrldI]X+KE8g+}~4jG}D94hm{b.[IۖڌeϞ=t:9;wҢE FcՅS~?AAA4oޜP8߳=WXRvbp\#I'WǢcoZљsjvt+h",HSW)Fz@!$>fe|FB"0ni=bGr8.\r}?˰[M"~[ ]ezCp޶ ܁m۴4f3f6mڠ*;wrN&Mj6Ell,$z|˿5J*Eׇ.7%?@lD~Q!]g|V֌Nm1{8~v .Dhǡo(rzn;0Hte4#e`IEBYU^b(c |.$=G0q\ :muǎu撗G6mcǎU:&4}tuȐ!d a# ;G#&ؤDB'GЄe x⢌rq\Z ѶBL^Dž#;B՚g#,X=‚1HUGNN^ɄQt:sv3\^ฒsD4QfLz KQa.YYyK V:(w]w}'n<a9Z G B8@ #!@G p!@ #\Zt"YeYjjB8u ׋nx5$IL&1zN-t:"%%͆F#*@Q222شibZl%z ';;hjrBGrr2999*E2J )ن2rܓVr9Zz1+ZƶTW٥O?Te湆x<h OtYD駟xOksY+>: o̩/379 MmG?VC/2l()QZ"v+VТE VXQn֩nf8E5bNux-G=U;VˁFIŌg7-+7?ȣ7굹,۞x*D0(Pߑ<ȈNh<3e4Oelf?nI[Hr`hs?0#*#{b N1<#hb*.n7ً?,# 7`:<oߪex棍w)O3CitU>#66h 7n\RqL L׈v.D`7-o=Ԇ&wR˔|Py&<#QwOO^ac!sV*}G`&ŋ?ś`ɫo<7ufۓyd>s~js1mh,e]qVCnV/֭yoX,yzQ OwuvKraV\ÇYtN[Y㄃#?ٙځ(? d'k~8@rPF1%b@CԊ!1y266}{4҄VkI2gk< 7d'{jMҗT;K>}CA} s *+[91>RavXx1Zp7=7ulNhqj\8kh[trf ^hs̉9ΊS?L}'br3+Z̽Yul["UUϼ%D Quyť%H- j2xǧ\,UU ~cgxgr1gZ2?NHp$ILTSUEPU0ٯ(=I 3x3nb߶կ;Ox14E&;dPIߘ7h) r8lfSdYQR!bٟo#8<2RPё&:yԁcϴyh±oL{_cbfX5#;33hFq1 .Jc"8#f[DS?&DIT3re,2zBhh($ 5񄅅 <!@G p!@ #\=,x<nwoh4L&FDpm e_AD>nG@,fGn@J,$T3 ޑ 9(d槁V+1ȏق3v;Nێ-l+he2Go.ŌCy{2{\{$-=31V" V;]0El8`ǣ "A[n?rW6ޥ:`.Qvs*3< p1Jj[<䑾{ juZl.©pd IEtR">Z H:/\qgᐧw H\huMϵk 2{Lq"V fԾ8 Lջ7SsX~vfro|6ۚN)aJ.Mcη;tK"sӓQ\uu*.0ϰls|g*;מF>~F}_2_ !t2blπRuO9rL;Z+CǾTrtѼٻ,Fv#d"M{[$8GGr8f4 o]sYEQd8̫O>/>6^"Vd?p5;OANd^Bg8 eXukFGRcvPd>ՃOq\:d xfNͩ?)1}Xgmhef7Fۂ2CѨghm>4]9\\g2d!Cf V{ng+h=8VFjKKH+z{Y@DDUEL&RgBҀȐ$U(*x5Z[!(+Xh*@p G,r\S'@!@G p!@ #B8@p-#,p+!a+©W SJ-p#7Izt/~Շ I&q5`{ žýIћG8p [^.<{xsTOcl3 S5k+©p1 [6xxuiy?/+Cm_׷\"sr x6!,p/VNb{#jr~w݊|3tS9 cL&]_\;Yb{rKSsMםIr?rsa[78׊+[?OO%_O/JPhhsJrsχ!I^¹,p+ xB63׽9J\eW5f ܫT,p˳mD6Hw?d{h_$+rцT}68 5b[mgm86ak;ww/*r{}o5[gi1~.+.a+\RMX p\'@!@G p!@ #B8@p-#,p+!a+©W Se@X=ူT- \N#,pXپPW MS<~$r'T.nM!(}b+jKý -m=e&s=Owx#x=7x3SX7^h1e$+NýZ#,pO[ٚ|[_ >DZj5ǼO|Ӂ-Zc8Z7ƪ* b+[m0QaY r@:$cRN;=l?YfF$TYaє> 4KD.h)pRMXmlng;uڠ?#;ow"_*8 A:yl$2$k2|cg;Zj͓VT*FX$ka+\RMX p-~[Ї8\$!@G p!@ #SedY"Z"֗/֗T8^ӉnT I0Lc61 ڞC4B닌uH DGVK*ߏ$++l6+(dddi&TUj.{6_HOYK㧕?*Q1%,dggB\\蝋dj4őLjj*f\ᤥ 4j8Y("TgI",$NMѯZ3WN8rJlUfr5W| %a6FT&=kwwTkX툫,ˢ< ,YTUEQZ-$4tfג3VxfD劣ף TA<8VX5ٕ}/ⲷ"53H]SݔwQ;sܗ$T493֪.b :j WAqj,CI$DO,uL8K@qqr[<<6tEG2nRO{97erG*f:uKOVhPTgī䭣‘9~ULג-_{))ZzA\M7quDĂchMo>g^*sW5q'Aq.9qڥ\PaKx^4 ',݇?9!V4Ԕ5Yc@fv{ӧ[W>)TX9z-Hjځ,$830s:hL;w3+8e/ՂxT&ԚP3QMz2zڳ3d&3t:Elv:nuzqԂ>IDAT> `*ŝ\l棻Ç^`m^qP,‮&;;͗}<tck"Hu@A_ y?Kw$ s *D^|[c}=yib(ZtTܻ?= $]F_/ZZ4d{%Ix+/%^{}$&U $r* } hgFRԆ5VgI(R$RxC¼8!ΓUʋd_ Y)2CT]Qf!VЙx32J!-5*;y0;7x Pg:_;5MNFQsƂAB(Li3q/z1wڭ44IW\4T{qƄs)J6]t|?;L;< {kiν!WU RA+(Մ7RpNf3;Sހ0^Z>⊶M $UT X YWĶM,Y}o=][YGC';E 1 ?acfOR+$JWʯl%ωԦSx4?ZǾv'~F{s)28ނ${8r Rx*OШ_wwx2ٳy9^}0E}kqK6^YA95cE" "bn}lŁ2s.N8< =2#2P@T?xiss9_s _qT#ri״p~ ﺖqkS`.1Q"]G ._>~_ cBdqfN|yʾI$y 2ZO'"70)'Ho"I>FޏcXHOO'""BOEX,[{uxX%eY$0D\ %b] @ #B8@ #p!@G p@pAC T&1$IENDB`spykeviewer-0.4.1/doc/source/extending.rst0000644000175000017500000001740212262550403017006 0ustar robrob.. _extending: Extending Spyke Viewer ====================== There are two ways of extending Spyke Viewer: Analysis plugins and IO plugins. Both are created by placing a Python file with an appropriate class into one of the plugin directories defined in the :ref:`settings`. In addition, Spyke Viewer include a customizable script that is run each time the program is started. :ref:`startup` describes possible applications and how to edit this script. This section describes how to create plugins and how to use the startup script. If you create a useful extension, please share it at the `Spyke Repository `_! .. _analysisplugins: Analysis plugins ---------------- The easiest way to create a new analysis plugin is directly from the GUI. Alternatively, you can use your favourite Python editor to create and edit plugin files. This section describes the creation of an example plugin. From console to plugin ###################### In many cases, you will want to turn code that you have written in the console into a plugin for easy usage and sharing. See :ref:`console` for an introduction to the integrated console. Here, a similar example will be expanded into a plugin. Load the example data file (see :ref:`usage`), select all segments and units and enter the following code in the console: >>> trains = current.spike_trains_by_unit() >>> for u, st in trains.iteritems(): ... print u.name, '-', sum((len(train) for train in st)), 'spikes' This will print the total number of spikes for each selected unit in all selected trials. Note that these lines have now appeared in the *Command History* dock. Now select "New plugin" from the "Plugins" menu or toolbar. The *Plugin Editor* dock will appear with a tab named "New Plugin" containing a code template. The template is already a working plugin, although without any functionality. It contains a class (which subclasses :class:`spykeutils.plugin.analysis_plugin.AnalysisPlugin`) with two methods: ``get_name()`` and ``start(current, selections)``. ``get_name()`` is very simple - it just returns a string to identify the plugin in the *Plugins* dock. Replace the string "New Plugin" by a name for your plugin, for example "Spike Counts". The ``start`` method gets called whenever you start a plugin. The two parameters are the same objects as the identically named objects that can be used in the console (see :ref:`console`): ``current`` gives access to the currently selected data, ``selections`` is a list containing the stored selections. Both ``current`` and the entries of ``selections`` are :class:`spykeutils.plugin.data_provider.DataProvider` objects, refer to the documentation for details of the methods provided by this class. Replace the contents of the ``start`` method by the code you entered into the console (you can copy and paste the code from the *Command History* dock). Now click on "Save plugin" in the "Plugins" menu or toolbar. A Save dialog will appear. Select one of the plugin paths (or a subfolder) that you have configured in the :ref:`settings` and choose a name (e.g. "spikecount.py"). When you save the plugin, it will appear in the *Plugins* dock. You can now use it just like the included plugins. Try selecting different subsets of segments and units and observe how the output of the plugin (on the console) always reflects the current selection. Plugin configuration #################### This section shows how to make your plugin configurable and use matplotlib to create a plot. Your newly created plugin currently only prints to the console. In order to create a configuration option, add the following line above the ``get_name`` method:: output_type = gui_data.ChoiceItem('Output type', ('Total count', 'Count plot')) Now, when you select your plugin and click on "Configure plugin", a window with a configuration option (a choice between "Total count" and "Count plot" will appear. The ``gui_data`` module encapsulates :mod:`guidata`. You can look at the documentation or the code of existing plugins for its more information. Next, you will modify the ``start`` method so it uses the configuration option and creates a plot if it is configured for "Count plot". Since you will be using ``matplotlib`` for the plot, you first have to import it by adding:: import matplotlib.pyplot as plt at the top of the plugin file. Note that ``matplotlib`` is already imported in the console, but you have to explicitly import everything you need in plugins. Next, replace the code in the ``start`` method by:: trains = current.spike_trains_by_unit() for u, st in trains.iteritems(): if self.output_type == 0: # Total count print u.name, '-', sum((len(train) for train in st)), 'spikes' else: # Count plot plt.plot([len(train) for train in st]) If you now set the configuration of the plugin to "Count plot", you will see a plot with the spike count for each unit in all trials. .. _ioplugins: IO plugins ---------- If you have data in a format that is not supported by Neo, you can still load it with Spyke Viewer by creating an IO plugin. This is identical to writing a regular Neo IO class [#relative]_ (see http://neo.readthedocs.org/en/latest/io_developers_guide.html to learn how to do it) and placing the Python file with the class in a plugin directory (the search for IO plugins is not recursive, so you have to place the file directly in one of the directories that you defined in the :ref:`settings`). The filename has to end with "IO.py" or "io.py" (e.g. "MyFileIO.py") to signal that it contains an io plugin. If you create an IO class for a file format that is also used outside of your lab, please consider sharing it with the Neo community. .. _startup: Startup script -------------- The startup script is run whenever Spyke Viewer is started, after the GUI is setup and before plugins are loaded. To edit the startup script, select the "Edit startup script" item in the "File" menu. One important use case for this file is manipulating your Python path. For example, you may have a Python file or package that you want to use in your plugins. If it is not on your Python path (for example because it cannot be installed or you are using a binary version of Spyke Viewer, where Python packages installed on the system are not accessible by default), you can modify ``sys.path`` to include the path to your files:: import sys sys.path.insert(0, '/path/to/my/files') You can also use the startup script to configure anything that is accessible by Python code. In particular, you can use the Spyke Viewer :ref:`api` to access configuration options and the main window itself. For example, if you want the Enter key to always finish a line in the console and only use the Tab key for autocompletion:: spyke.config['codecomplete_console_enter'] = False To change the font size of the Python console (effective for new input) and title of the window:: import spykeviewer.api as spyke # This line is included in the default startup script f = spyke.window.console.font() f.setPointSize(18) # Gigantic! spyke.window.console.set_pythonshell_font(f) spyke.window.setWindowTitle('Big is beatiful') As a final example, you can customize the colors that are used in spykeutils plots (for colored items like spikes in a rasterplot):: # Let's make everything pink! from spykeutils.plot import helper helper.set_color_scheme(['#F52887', '#C12267']) Footnotes --------- .. [#relative] There is one small difference between regular Neo IO classes and IO plugins: In plugins, you cannot use relative imports. For example, instead of:: from .tools import create_many_to_one_relationship as in the Neo example IO, you would write:: from neo.io.tools import create_many_to_one_relationship spykeviewer-0.4.1/doc/Makefile0000644000175000017500000001100212262550403014415 0ustar robrob# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/spykeutils.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/spykeutils.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/spykeutils" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/spykeutils" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." make -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." spykeviewer-0.4.1/doc/make.bat0000644000175000017500000001002612262550403014367 0ustar robrob@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\spykeutils.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\spykeutils.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end spykeviewer-0.4.1/resources/0000755000175000017500000000000012262550403014230 5ustar robrobspykeviewer-0.4.1/resources/splash.qrc0000644000175000017500000000020512262550403016226 0ustar robrob splash.png spykeviewer-0.4.1/resources/splash.png0000644000175000017500000005527312262550403016244 0ustar robrobPNG  IHDR\ dbKGD pHYs  d_tIME | IDATxw]Օ[T JBJ `=&i=۞ncC{llLH "HBS)JR{'}-z|yDI=g%ϯ?}^۶mCtww7iϯEg-?/?Yt)ol> H "~:Ewh$lէݿ{Z/ 0Wgmߕs gEӊg'OKOubc+L*:",>(Ju=(ohC( 0E 08ux-{mB·k">&y6UpiC[K*vo-mW{_ԄwmA[#126_)16HA>u4a1vdm\_Ğ@îXfhLQi"PRZBtvg۶ٰq]]'u'nhr@1G(z|^4Al۷}qcKYYeee3zhFlQŀƢ1O{ igi| P_~=b֮߯e<ꪫwᅅHcoRpژ?lo܎4"md 8=W^y7~H$5r_FS|%*"}`bHmNVm8P-KbkU< LGR@(JیB }M!p12a OʴM试+l') XcDeh;ȔY'1\ Š.\RYeO" Ś!u6sKSĚSY0id8_A?-/4tm:vLѰE~lN"G!Ćѹ[R) <-n& AmUZE1!%ks_4Zm̂Z^E9M)b;f\ꮫI$S|K7r<|N喇a؏~L TT*E2qwy\yr|D!.\t:C}C=vⓏ϶mXf 7n4NT7pTMC+@b3!skRlk Y1|dxU5/s3E1R8N0UeH ŚsJ}HrLpy.شnT"\ cR y\.HD2I*bpp'?|=}iӧs;P::z>Qh](T p, >QH{ϭ͎Ra"-d`a\p!97nd߾}ގ84554r$SϘJCC78`uO=&ixD~㳝K_U+V~iӨ1-kx8&P1~<%%s9⺮?EE.F8$S)2 eee<쳜ᮻfpp[0a|7TFiHKvsۉeLINX1]gggA{&vEEEAm-3L*@LDk$JeG' |-"C+g.=L&÷-cq='o^pՃ/sײ`|9Owb3#h pi 1{:~8' `0Ldzpdw~;>xٳ@J,k>|6{9?61vT2N8@%sŋI'q~=j:Cc\~0?cMNWW՛/_)---FaWly6.C )̋x )%fܳ/,T*=Ø1c< yynwݠ =dƥ$^br¥f8ƍ7ȑC%[Z`S*ŸA 2Fr8+&F< Hm;$(-uH%S̚5_z |;wR^>߬pXi913 Q ~矒V@ALձg7l0yd&Mĸq3z4N",aa[_9NX:[ɷ؜1u Z[[ؾc*29xw%gByQSp33mڴOeYn7{x(""p2,Xts,}V[ҭ,]BnB)mI[l߼y?z8'9X^lr6qa~ I i]jWxsrgo1JP*hɷ 0L?(ݻh" ?|9gi3Ylo]cر\wu<Дu6H&s9X{cSb@voTW*BVʿ$3 P34 ηTnGsƔ_;t:T&l܈λЌv\%Sg8Q5;;H-dTڛdhP9!:w54Rxq";n㬳Ήq|?|pQxh]uᐉ3@Bz0bkO BAfd^./*?մ_"1K.eϮٻYm T 4 SRZÆ\"hMbpLO]UUNd9r٬>>ٽk7K.^+"2Ey긕!Ι9sbl۶-[pĉv6ǒ3Ź!Ca-PB70 \^jER5kx"񄷸KK"Lպ|}cex}̛7B5tvvfIRL}#hܮ 93~fU lT mzA;taomr^#xE6ޓ|w>պ:")EI_d(aYbUt]JYgy]-[xVڱ5zzz?}8q²U/lysLq[ZQ}4B[I7ƄeQ3ݿ0kR8J85nۆ:.ɤBP]!f^28bYf5?>@"KqpNB 8 DI$PA9 x&0l?ϢݟJ \O)@/~RhO*ATJM)³G'Nȷ-2L=zX|%#&DJ0] DJ޽>\88~yQ~96dUŗL&mu;GJרfرO* ɯ`l*Q*{\ "RO0MBt xP}N/3)w=Fќ}&N`۶!ٳﻮ ZS}kleT<"y}`ֳK .yĉTVV}LIS %%%FBf ER&VPaNؐ??񏩪[CCC5}G_<_-5JE A8-1ElQF29sy{g(2azFNCDkr~4AƍQE [ r9(} :EN\6%?c^ݻqI޿zQ~@"mm؁079>r4AKèfMI&MmmǏS ɒŦFԎ͡C|R"=$I*Ne3qy5'N`Æ Iz\gLIQ hx\ߚȄ,7e\e,fqz23U+QSl()~%-yq??))- , IuuMll!AzzNRSUmsa,r.*uLM LbdCh3qF86NC ^zX0,Yʡ+c<24) UqiZ9{6&M$L@Om-c֬aXGRo:ɬV|$JNLӕdu'?NYG~=J)R J18 q59g28L`8ži} a'Jغ~̡HSŴ!>d``d2III)'hG<쳴:Zj@s'9>D4Y}*<ȠD_FFEm^_4HGtř약ȶ|jj|׋1׳sN9OA[L&MĪU.v9ghPQQΊ(`6ϘHx2lz{zXp!?uu4kEW@ PT˿/υwF|&y8531%dM .[FQ6QQ7))cr<= Kg1τ+<|xk/^Ϗq=iIB"AWc#/o-L+}QFl o}i,d-LYwo9z( {O!TBRi,k.ve&*ѣ*dIV'dYw*3 ̑9OrpY?k<~s$D_2 ɓ;xl(yAn(-ƭo}bժUȬY r<͛S] R4K<4DS% BA[lz.-EL}TF^͘ի|5yZ5}/g嗓f=918HR0]Xy]Ѹj9o׾U9:a."tZ>x7v:PK/:% `A^x3+Wn DsytR6o\f͚-C%Lh5:z+ IDATXrXTLIZxhVe0[*_4OtuSRZ T d IN&'IT>;DzQYcS%`, >+qDQU`͜&HtYҙ43%$I4*@VTPсv]8e xi=ZpQ]ٮ8VzG$'ü,?:`]Z>{7lmd2I>Qd+lZׅ!g{{uXO5k,/1jhX@y#Fҙ??:* 2H%LI e1}d6rL&Bل*HZ&Ge.V**ʹ{ yٻwQ?̝;3<'t|$l!-Pd=9WNLO`ESVzII J94cR\`i J)J3isdWނ!9B4u3+u% I^K,f}--.O>)en!lHO6/4ʼ '1 ;RS:aJ@eD"rU@[,A^eBeDO1; EkRj2dMU;TchnkQ ՄbJCDaLZ5uĪjj9/Zdv%ɐLpT W, "<މykRJQNQ 8w˜Uܪ vD Z n SjrHK8yQ88}!عcsЪ0׭ x1LЦƺ:v>yʝۘ{:&4e @Ѫ*P)ݡ :Y2|*i /uAc$ÑGd2d)ټKVD$ARR'Oz̦HAb;;Hd*od qǐYkyޖ|>{)H*Bp)HIT`Ӧ-$m H!DE~Đ w|q$+PK6Ow;3cw Չr˶`ž icȭ'dci~)?I5ժN$Ӻ5-Ocv^N ef&a19TF1@ai#b1:dD  q:LrЗ(3;HE#A3Qr"Ƚў2?1rkl(0j 3QRyyv%S6۞M}hvuH*E 㺋GS~$ ]Usɑ#z͛Zi/y~:x3rév$$I4x$.++$NԍEDH1TL\NgFIq4 %:~wQI>L͔WVqЄ()qVʎwşQǙ`ym)B)H1)EdE,=sP3,gLm6 Tsqtjxogw28 Y=C I -[/ 0V$T4I/'Lp\sz{ldj >ֻqv2 rfV={rc:Wu,u*K;XG !49x5qGæ6dmF$ dnao^#EJ*u5"LZ>DbXI]keh)&8:}uW&º1OC~|ސ\)2:A(VQ;-Qb˔7,HPH Bf,1TZNU5MFUUGm`Pq3*ΠHQ҉xK՜P'nWxE8Ju I>J*Ih'D;3;ژ,/bga"pY"L~;=ֲQT7MtwwS__od' Hb~GSFšTH b0@bbpi*TT3EM7 m1S2E] w]wd̈́ڙ,)aM4cl@sTlŊ`&`?Ru,cN6.yu -tᐠBWPO=/e_t`q]Bqf,:RQ%cY{ >aJ:v%B(bx hcM8H6+ʊF=KsdӤZ}VLI.i)Aa1ovO`SlhCѱ &֎|9-Ha6}S]QZVJsXVZ7 ҕl~:/a{$Ju9L lZ\MLlwwqqIJ'B]A, m&qhWȻW`z +rp'f=[7䱓]B&mKk Uq`oiDjsKg bW7ؚ5"׬f[f*L$^ZBfF+cBT`82 "1]vMnڠԞ#UԘ2I1Y%O(֑I&y|8Q8CW6Mzם/X5NzO#\^ \6ܩɣ_b:'^\pNw9u-G<,djxc[?~;2y v}і dL"}eHCDK& f!nI 1֨TmEpaP<߮_bUr+Nٺ@2jcƖ0T|Eia+V똋Ɏ#e)OKCu|p7n +V,k|XmP{=}BI&jBXX aέSC)PN槀9PZבnqnbP)alS&?/2L&R(DiH ."L% k $E5VU<^0"TA 1I Ac(R Zp!0W޲y %_\r2CijLĨ+ίc^}9uAS<a~CT|G*bر(%<܋T&{)IٜBk. B㠕9i'CS" jU-#O((\̻\$aܸFx9o/̞=8NDiflkBD"_2>1!p2hX;f"q QD*A PBP/j$~6@Qv2;Z'kB@|/ӻ1Xs]P xd ՚z5^Wh'D+KtL,7IBf̘c8c$.]ydR0ux6P^u*idRxN&q{XD{\;]/'2!5{ɧaYTVTXȢ`G쐰(zg&QHgx԰ E,ͬU!,;v~Ȋ,Ȧ&j10QU!nE嘣9ZiV*0Tŷ}zW af%vf7~ɷX"*v`1xK*дֿ\)5Q#ʆ1qDvo~vOIjmf֝^s[@GԪZw &gH = h+&9`֥aL3S3od=+:11s/s2kM+hUDɓ'z&O\ !q:Ou֭up"^|E;3ojOk ֦BgᣢPdD -1.VR(haae#XZ@GbpM1*̛ l(()ySXx5g²e+ϓΤCAP*/~c>WYre5j>;kM$mTE}y ͟?D5CÇ Aads08_iZb KIi J@th 6ڮWhėbn+21\ìd7}_!i1P>橙qT,NASMĉXnWt3sR%DIe'BEGlR"sG\KUqMࢣ "RzN4A\.A̘XJ/Mpk<#̘6ӧYR#i%3C̟X~ϟ_Ǯ{kq#rʂ7oސ!^Q{ KI9aV,za 3ӥ%a1O,C,߄pg>6! 33[TJ袉m9*+.bB_J̝Kww7O<|0CaNf{I988ީf(^kzi,An0h0cʒ [K vrܿĹ:Th`Cz!W<5J =m&UUUaWXql/},u˖9R6?<*tLKH1&%m o<0q">RFvX2Qē%Jէ\Reʠ-"Y~ݼ#F0gl=0A+"A6^6ۏq<$5j&c {NkM. 8Ռ$-^sdiuf;u֙r EL|% *!"Tӵuկ~EUUU67 yӎ4 /̐pL0T<4LmM ÇW{W?1\}%77 #XxW'yt`B)'$MeE)R(KF}+<ݷYә=k˖.+}%iְ|yaY䆆MӚ5ygϔbĹ0e)|a7|/b*QիC]v !W{{;3{o-uF@e<.[hA c}5Yii Ǐ;Jg|."QЖ|{㞞*G4vxʆUЊ _@Sc.<kY˥\ĕW\Nccinc)R0Ӹ[H&t2I/$]zzzxͷXh16n/|sA)S&eپ};pQfJ'ظi#SNeTVTH&( ̎4j_(Б xJ.₅yf9U1]YtTI(`C7zr9>֮]˽KID;4-[EqFUE޸ic[gNM}7Op?L$|;P>-BHry~,.WS4mO!gv=Xk%%lɨQظq{/2s g ׏@)E )^&<Ύx{*֮};wRIqg3 7#G0bPJm68 m3H$Rĉ. ƤI=kvZLKň C?Pa6f*7-/~\rI=d@9 !{-:q,P~wxꩧB3g\cƍ\ve&1 w^ŠIZlh/ZFk̦1 5N\.G:fhIR,~un .}{=.]ɓ'7ohEyḪMDh$$E]3q,:j7d3ڌ^1XS)ObbzeiK2mcfN~AX@cC;$0IDAT{.;wdue۫!xP|>Gv0K^q.D5L;I'2uT!ꢩѣGL&Yl=%%%\r%3g,+W$s%GNIMvՈwb9IMMMK.)/8l=ɼG*W^)܏~Cfx$LꫯZG/0 Cf۶mfs)ذa#!"†"s֬Yf~=)p]wo߾"m|;X:~qSwwwN#="#JfXG|f=.=0JKK+}}tv(::'ReJښZjjjdҧȳiby7OII #Fu]ٽ{7> uY̙3V^R/Sr/ՑXۑ8a={6;v̰U5˖- _޴iS]v1E&㏷|fڴila\r5ynVR H3gZ /'ۘ1tttD6[k+ׯ㡤bmKmZOm(K# /,NjWQQ7CE*H[;͐1#܈V":,h2҆(--eXi)#Gm˫lD )Eyy^9Bss3Zk۶m?)immeΜ9y.]J.+};l,Fi~#I(.bz)|MnFD KvL>ݐTe)޽#? uTV-ڳwO7 Xg'(8ZZgaF-,_.7"5}Q6iℐ@ÞGm?^rpPia &OYg i<`PXF9y~;і/:hRЖPyˊٳ"y!gHy;v,|\.Ν;wf͚E[[,]W\qM7`!VI(,v,{n*++yͷ K/ ĊKSjgOݾc;wl糼:`; a'ٴiӘ5;l__;嵐ݻwwN"a%m?tCSLs Ѫ2#*3qq\=O3Tpm vJe$!DIu  $BJ9~Wv%Ne$J욖F\ץq1ydƏÇ/~5kf̚59sxb^~e#/'V49ӉE69s|i<˖->8 G \)^+Ӊo}=%P7bFG!"Iʘ1c>|xG>b]ԟo=NGCd d!j زVix&b!QYP,&As.Gg@RK(24s(8g 3MH$\x,]SZZʘ1c8Î;;:u*---y^zer< "wBxL_^V^Mwww\~徼ɦYE$Jm7n\Q9ұ2*f͞ /ؕ\~ir[e\R)fڸ4+pG,}9_vQO8>UĴ?D}'oa}UZ gjX0щ0FNci{\8o^;S#GѣG~;>C\eʔ)pXbXNzf̙3sĢ.C]~H!/~Y(E&%K8t谡"Ç5Ν3O=ٮFaf[[DS3O'JY&RBmoooM4?+>ET['!cH361TLFi-FC`G 0%|x(> h(sS62wb!M.(H@h#)A#G&Ʉo̘1tvv>l6ĉ=6ۤT1K1}DԷ .TD댖(z" &mk5`o[r_CYN]\yŕmkIckح3PD̞3',\"ad5dߑf]]] }CSϝ{&=ztȅwWO$*.sj͕Hkga͚5g{{{Yp! .>7okf1oZ=I 4I!UbUhTR/>,l\ô'u^TB$7y}5{S)Ki{ ᤊSN峅Xaf.Bww}qj Sw#f9yVC<OW7n F}8tnӽܼ}K垽_WJO٦nO1U-3U.WF['4)v0~/]xٗ 4𑝨xoj˳8w>YւmM+/ev$mUc,+!gOIG@0|b0 Ĝ,VQ8$lrDid䜂1'|,hB2ÓJzP4M(ȍiК-᥌ȢTZ{彰Ro[A+үɕ+pVfRnCCSc% X62[Vb@oÔWGE2ܥL= ; yGh&@y)NTjG5:W{$H7==0)Ɲ#wqI0h9<`X'6C4v&:c˭x&m<xͤ0ͷ&ݹ]$-2d<ñT  bafxNȹlw4la URQ97Ǻ+Z#8;!"ޅEBh/={K~z(-|`޴fENzLֱjo` ݌=Rȭ49j 2e%5X9[T|T9kWAl dvX\=xMŠf T{uO\یC+GuS6Pcg[[Rx.C VZe2i8QjYTؤT1:I#(1m ys| hy=1g },D܋ph=T c WT.8+bXlW$"V1w[<#$v\eH{LJ3TOT֌cf7[An*`U x;ܓ\Ms,Dձ.qԢuaݫ-@"7)g5 &k YW9J^h&$-fԤP3[|x0aOd-p#xÔe/xQnꁆ^%:'@b\S5 ̪t6O+Exrܞ${v3ߖ'\TmڱԂtf2-`UXSFtb_$_ȾR;/@&nxdd!X҉cNQkhgdߣ3&oSϏra]8mR~= -竻Hc= 2٘F'۔nߗ{аmF`;7(tm燸$AE1' EI)UzhJ%T*u#];\)*gziNx.>Cj_f-\ԬP-D+l⇈gW8ҘV˕$wXyMRSC XCb?xY2+ަ?(. l|#nWҬ' [5efP<]Z %3ψl;!pۦMe hn1uear\ [s]K~Nߔ5GM.ͩ@Wh#säL69oR[ZdnsW[쓺R#.:dsrw4#9>b(zhT ;OlUĦ0C [RdȁQSAzڡBkxRHN*F9&D#SK7 q{ {$@/N]6r)Hwok>W](JN bV>A/ۀM Pl#ZY bQcܖLZVZF -QVQ^X xK tΑZ^5 >/$$ _`m>kڿ~׭[Lkڿ~WlI_?kI_??)*bKUIENDB`spykeviewer-0.4.1/resources/icons.qrc0000644000175000017500000000222012262550403016046 0ustar robrob icons/restore-config.png icons/show-folder.png icons/filesaveas.png icons/remote.png icons/config.png icons/run.png icons/reload.png icons/new-plugin.png icons/filesave.png icons/edit.png icons/repository.png icons/help.png icons/info.png icons/appicon.png icons/edit-filter.png icons/copy-filter.png icons/remove-filter.png icons/new-filter-group.png icons/new-filter.png spykeviewer-0.4.1/resources/icons/0000755000175000017500000000000012262550403015343 5ustar robrobspykeviewer-0.4.1/resources/icons/new.png0000755000175000017500000000053312262550403016646 0ustar robrobPNG  IHDRw="IDATHA0 DǦH\ˆ=ʆojϞؤR/QX+eY`gffcD4a۶zPU`*RJPU*q|YCc|s=G @Dι[.̥aqfvsP>5,[tL._/R1ndlK(ǣb GĚ>gSZP:f^9W˴J-Qn=-QMˀZmB /*!zذÇ;RsɯU4S?IENDB`spykeviewer-0.4.1/resources/icons/reload.png0000755000175000017500000000255312262550403017327 0ustar robrobPNG  IHDRw=2IDATH[l\Gk'cP1E# (7B+U /}BDj!<@B$$Duj"jjK]]ݳ{.s!D|h^ߌ1l>q[;_>϶uQ-ywV菞?sp]ՠ5o~莧KL|wTl}Wc ]wN< 9kkil-Ж1 4LGo䗶[("؜CkĿ͗{P#,}eFlA1햢ըR0e>zteα@`aKnB6 '^8+!ZGkxa6 "PjJCч JbW֏8;>\rb;f8>p{a!˸tsYB*a5a{:пAΖ 9]AAbPrUO l#J{LjMWX!/2iw=Ńkj(xal](uw2w8Ez7@HIB&\yn8w>P1BSox2s_']̹pDž xk3\FO6Vy{;>q&c0+߯ y"E kG[Ɓ}׻Ni0ʌ̾>K(ooͲYR5~Wzbwvs+7hϬo>|2깸(Q&'G5!A w Ͱr\17̟sg a&*a0 $z֪?}}ohRqmv+_<DZIm eULNd"P-0Mб x'*|Ijgp|a3ޱ򇥮2Eхg($Md0*4Àj5ЎT\Lws-5TƦJ@+B!?8 <BQFҤ1R_lP]i i0W^s`CH) MB5irʤLRR$$q4I*`: &8s7_Ktfi$ !B"EJ,Rb;!rbW 5ɉtgv𳪥w.4Ym[2 Hd[>nSǺijju& ͗9y6}fC,s~v_zFBe>q}SQ/;-=7 \˼_ܯ.Iرovr 3tp#o'DSg-IENDB`spykeviewer-0.4.1/resources/icons/edit.png0000755000175000017500000000133612262550403017004 0ustar robrobPNG  IHDRw=IDATHOAǿ) !!Af z ^x3'h@k]IS[4-P%ڝt0]0K&ټyf\uit$bCB~hϛ!2.15uUEݺ)m~~RʙL~?ȎڤDPJ#1J)RRX,@qB؜lI k= &C)O;Rsdϰ]DԣaooBkgزt:X]]ZP>WJX,1ssɄ|̒VyyZbt4 EKфn!{$r[WCgV [E6 |0 "/zNsZsKwbM AJ)T*Rۂ8`hYevȁC\8_8Npl P RAvd F߽E6 {IJJ4  yrPl0PPJpv}?cqq18Pۓ}'x"xtēz.^z 4;S g1\#O,//)JWFIr/s6-8&'&odŽIENDB`spykeviewer-0.4.1/resources/icons/help.png0000755000175000017500000000302012262550403016777 0ustar robrobPNG  IHDRw=IDATH{lSUǿ]趖MC:mVe1FNbFsQJEDiQ kn 6Qv[nznoA@}w|uL uE }DD{z9 zҘQ<慳fVyRH ok=g,lF(!ߔ6mXkmqjķԻt)&%CUTחpZu"2;^޺qI:c d40 .KֈXj[W͸u^9wݼ#U3I0>*(("|tn=@ݓx"UMl}N?gFiƽѴ{8:vq7o7pM~tCSK YtgqatMCcagRe((?oE^<\'T2@al4{z@a 6ݷb+0F8Dqz#`1":鎃a4Y,"BS" k/wkx\] Ї i ssUՖ4Cv)Znk6T{,"{  * ,b1PDy"Gwؐ3Qu uHM L$xI\Cz9ejwWy@(NqpahKxD; .C~^n ( $+ԙ 'Y@JJ$/7:FNujuCebF28pZ Ÿ.=e+/-T D8X:JlDr[*(rӪKe/4N$~B(21W`l ,*ą"Ξ ^^,Tʋ9M[pb:< Qb`Q)gc"写ϴ,f%/XsvU/{9{OxF,`p45HÃ"%t^]k uQ2LaY6}h2,`fXe,Ϣ0+whH[.NV1.Í1]A@CKxM[IMkSs?~`T9` xe<>L}3 lGV h(xaghgd%5v]R#_O$K=GC{rxN b Asc [vitǫy|]j宆 ۂcS&\'IJYIENDB`spykeviewer-0.4.1/resources/icons/copy.png0000644000175000017500000000224012262550403017021 0ustar robrobPNG  IHDRw=bKGDC pHYsHHFk> vpAgxLIDATHǥUN@=s(*H#5ݱ(*ib7thT/ocBJhB؞{p8D‰${sV"qy% 0c׿CDWS^@`LLL@krD bWVV>DQֿ& /~EnWC < 2ZZ$DG=3ye%%q 0s`v,+>Ox@]&gِ`k϶1,bA?qࠥA@gHc& 9j~NLrl`O uA٬/.u<"MҠTB yHZ#M{{D<"(*@ Tp0ac0BfͶ#I <8ZR dYY}fnv;|>\__Q6Ca‹ig& .Qŭ9z[=v]>9˝N焙L 8s\_RVʱY5SiyD`>/ϗFn1sKF}VЏ%tEXtcreate-date2009-11-28T17:18:28-07:001,%tEXtdate:create2010-02-20T23:26:15-07:00;\%tEXtdate:modify2010-01-11T08:45:22-07:00gϛ5tEXtLicensehttp://creativecommons.org/licenses/LGPL/2.1/;%tEXtmodify-date2009-11-28T14:32:16-07:00B`tEXtSourceCrystal Project'tEXtSource_URLhttp://everaldo.com/crystal/[IENDB`spykeviewer-0.4.1/resources/icons/run.png0000755000175000017500000000303612262550403016662 0ustar robrobPNG  IHDRw=IDATH}yW~۾ͼYXa-*ΠlB*ԤI-Kl5X5mC4%%iLMiIjF)RS6а y͛-?дPNr{s=s=\%"JR), ece$Qv[9NQ师TouX!wy|Kc}}DbQDZ*3znTvb$=WRN~Gdh: Fre"yppɭ [RS{zbڮ>['d&n(_K?wKDVC@R 9-s'cG}6!E-d9? wŏ[[\hZ3XZ~:B!"HAC|#}ƻC+٠>ZCkRՊ[!9 ^Eɵ,!

1NĈb( D`RiL.~i*[u/|,BvZL040SNnm-ZEcܯӓ'=L xw+>N(љ.oD@, ^}mՋȫNi4@mgJ]^'ȃNv͋(eᢇ!~yP ٞe* ryrCgUIz)FDƃ*Hh̬zQ x P1p5 l l9cSWu+9P1eV9x߬wg`?b5"Q&9gvs'#KDV?hC=(,W^=xϔ2ԋ"-p,/`T=4ptɃ{ك` Rl&KiG*bH5q;1_ |'t|so vj!@cHu{Gg76rxJɫYWC6]o eٷB(3;ۺt;5xOjosW+(KUv ^ˣQnјa/;U*#IENDB`spykeviewer-0.4.1/resources/icons/copy-filter.png0000644000175000017500000000215012262550403020304 0ustar robrobPNG  IHDRw=sRGBbKGD pHYs  tIME  ,IDATHǥMoU{87mIT"% %iQTPUaJuA75 ~A` Ď(`H Hmj{38رgaauqzw3=9y߯R,'`Vª+v\6$\ׅJgs-˲g_}FcGFc7Ӭ"@ݶQ*V G{"fo(T7[xu26kd Z;Y'#4l?Zm8.lfbh"d(+DgN0l0->& ^3?vvuefU-,767r"ёQzp"!p`YUJ29.'6|H?V^|199dRc@|1n`Rґ@ܗkkkwFFQ("ze4M,//czuO"ٳ$CH* FF!mp7="0 #U @?5 Czp'Q2L\."GpB' !A.u}K"B46 ˲$::DTS%Ņ"D <۠ZIr@wz VWW\ׅ$N=Bk@v5Rɀہ1fi_v tuaP*Bas@Bsr6h4DR.cZjdBEnJ{͔VUUu-e膢iNI4Rܳ TUMqf;)-0 CdbED%nϛ񍍍388xsǍxZ)IENDB`spykeviewer-0.4.1/resources/icons/edit-delete.png0000644000175000017500000000066512262550403020245 0ustar robrobPNG  IHDR 2ϽsRGBbKGD pHYs:tIME 9%: 5IDATMKBq?Oa3fA%?@Z "AGP4ZZ\ $q( 5޷!z{ιpFk.dKYns 4hh<~-cMA$8+2)qj1cΡq, A5)>m5VkeR|A@A ﬖrB:r_1ԋE~Y$‡^oZ&n("EԄQCQحcGWz)UϥH:=].%z#zMm΁_6vc=.-IENDB`spykeviewer-0.4.1/resources/icons/restore-config.png0000644000175000017500000000310012262550403020771 0ustar robrobPNG  IHDRw=bKGDC pHYs oy vpAgxLIDATHǵKlU~gPK,Rk)>qF "%( ]`"" # YGDE7 h1T*i)ҡNg} B$ws_= An R )ɄhˈϞ_H/zOM@oiȲު.GC]ySIK_Kv8+7=I-,}^ڙ(*t.ړ5Z+"&JFs;1GӾ;J:7ջf/JKlE>|pl$B¦0E&s sЂu)kx%[ss( 0 c\(( ( Zq- xT> 9 `){8I;^V:[T+ʙb 2`BG ׻s^8y-tdM֐:kDnol}R#׋:_–CI J *ݗyF5caȥQ2ϱ|`GkzƼ#[d;:I! g~ws9k`$N5/Qh3ͯ\Ngj8dn  HOd-߲C;{Cҵ'FWlA}ơ k9w9P8Ə7}N؁mP V:/]DaQ!±2eX C!7n][N58jN_x]OMVlkB=`Lhm?}ʀ %]1OtR9WCkt>ta7~k4J%tEXtdate:create2010-05-24T07:42:23-06:00 ^ %tEXtdate:modify2010-05-24T07:42:23-06:00|O5tEXtLicensehttp://creativecommons.org/licenses/LGPL/2.1/;tEXtSoftwarewww.inkscape.org<tEXtSourcenuoveXT2 6"tEXtSource_URLhttp://nuovext.pwsp.net-IENDB`spykeviewer-0.4.1/resources/icons/remove-filter.png0000644000175000017500000000234712262550403020637 0ustar robrobPNG  IHDRw=sRGBbKGD pHYs B(xtIME  &W^A<gIDATHǕTkL[e~)q+u19'*1.(D~jp̙qZ\̆fc"Ẁ XkhOO=Ӗ2/%<<9/+W:?x샺gWsG[A>ˌy{<ݵa_7 `B@>B(**X\rS]./224lma BS O4%&P(~yp``Tҗ_~A}O,-ӥasӉlLOArJFnaNv-u͘[ƳGq0. ?y^Ғ?gi, DIH$ڱ @%Xa~[[s`{kn±h|8( Mng%ĸFUmgژoܸPBx!^XVlhoJȿ)!$ +SiT#G<ᵮ nΜmFfVfbwUttzօlP/A(2* Lg_f<;Ҳr8E;'TULC+Ih|u: > *H]|y)EBFwd~PJ.vagסTU?1i~t!iuW&9MIENDB`spykeviewer-0.4.1/resources/icons/config.png0000755000175000017500000000277712262550403017336 0ustar robrobPNG  IHDRw=IDATHU[lTU]1w*,4~DjPGALy}@`h)3 twLy;9c}>{Cx^44487l@>WZU\ H){Q큃X4&ɔf~ v9`ss;w~ XԺsE!BH~ys^Dze­K;::2HvBokx( ϟ?*.~՚N`p8x'D+LBB`&$;`a, a4MH ؖ 4]TU]iB`}R( (`r[Zk+?>󪪪*UT-˂h 4-] %0o\ܾ}>_.R̙(//0UfX]_^Q+++X4( 2t:- )%8 JHMx<Yie˖Öeykma5igp8<v|%0`>킔h>z_i~?^/~ 56~P"gr!{cJW<G08@ oBX!''uk?D"h, ۶A0pa`hh#rRܮX,aR[PJ&p8R$R2 ּr((|hҲx,(/Y:A\.F"nxllcР*(%S _P" #^(?xs~5<^U%% , c!cGOrO`ddh8l9*3DmCuTm#L |F)FGGi:ȴ3gφ^RL[G2}}!%/S)%4MGW?dBJ n1ŕz,YR%`AUU %ΜN<BȂ͛7w۷%DΟ6Mؓ6k\xa(//{g|[Z!kZkR\ @cSSӕ+WğҥM.xvo=qXft:.\dCaȳgJB qM댮0cGA2f_7 LR{/ X^rIENDB`spykeviewer-0.4.1/resources/icons/edit-add.png0000644000175000017500000000575412262550403017537 0ustar robrobPNG  IHDR 2Ͻ =iCCPiccxڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧ:.bKGD pHYs  tIME # 0IDATu?KaƟ}NOO;rRhAA9TKԧڃlD%fDשy|r4:CToNg#0n2RW {S HQCfo4 TؑF%#յ[:sXb~F$W ۏ = \p9PcfC" dCy㌕Vs<Q.ԫsä G}Y+T◢/Rej0Wwʽ wnD\ хd#$Wɀ&F2t=yNDnzݯ9{Y==r)ec<9}˭ȉ?>qcGyzƥK/G67`dRK-M5)Tc_NAQ#HyDf- D@)ned̰E 7_dAL  H8=j)/S5PEH3bk@7l@Dj@R/2ww6Ͽ WO2T{|ч4_˥b0od{3m!RB$ ḳ{r9j693;,2 Z\@07hPZhL0-P`;׸rU6&*6']!ң䜹~:_~-hJ5,ՀAiyDKM|2ɧUmY=uj${*BhQAUDhF "Գ--3Wk0/p)nG0ͨz0`PJ M,TΙ(׾-D tR mRJ!"ږѶ"Wf+w_ "E̓)mҶ*RP-AXģ=ϹGߪt/\xkx4f<lF G g666L6GmۜN|䩜DzȐT"ǼwVEfvik_v9#)LEd l h#xTU=028ns4xiM/9s=󼇌z &&xdkKKhƲ,Y+Pߚay!+ܨlƣaM++X+pB:44:#4|)xwEjB>C&suuس =ςȲI IF#|>z17kyug;q<+_ӏSP-P|nkT,.??s׷,vLjl$a!>P *!U}P[S \%ahFIENDB`spykeviewer-0.4.1/resources/icons/remote.png0000755000175000017500000000316712262550403017356 0ustar robrobPNG  IHDRw=>IDATHYl\Wsxgs_Y9 ș:I\orSlvKד klzOT x+46=U7Sef{{:&xؿr,n*>1m,[nj=*Aq{!=FkeqSTyN;<2L"A++I/dxbz,'`Y'ʏ{5_T+ l:^PoZLSgbdtФ#C ڽ|6K1'3,],9rpa߆N ֝NL$?b"TJe~^=l;qutO7(Ccd#C=N*eұQNqsjE8X܅9Dbɀŕ5n@+[7殯 *e#~jQKa g]^'Z i (ŭwgNxfv(qZlE>Y_(Qc\_c@Bdc:~im8>~̿yGpGt`Q M.)sQD@xM`8Wr/׿p_=çޜ_/$Jh iDj;wWX&/ˀ<@Bu j7D1lWf3O]b2L>?HP! UcI䳒='_mYlmл9n/Qo)t Yd8ԇ)gD+?+; 5<{ψ\V9pD~`d/4q)Z3݄0ixٲaLqo ]8[T}-З.ζE}Q]yab ~-]M?{fd ߮*S|AirT!pvnuLUq"Hl(LGzPM)O;"֚F$beF1G VD AёT UҤ*[2+ӛB쫫X% )EQ=Ȟ~g"iIENDB`spykeviewer-0.4.1/resources/icons/new-plugin.png0000644000175000017500000000127312262550403020141 0ustar robrobPNG  IHDRw=sRGBbKGD pHYs  tIME 3٫I;IDATHǵVkA&Ɔ*栂h xov}YXt\.p\,BaEJB!NQTk1H8J)5>P@)5@Z  5DdO ,&i5â@Jt6~ sS*}MmΌ6J@7O4ekD:øֶ-?(2$$5RL7(|./-Ec 70+i5wr`iRX"ƐEc|mj^!zivz`Xrw;7IzÉә[޴D/0.|/~y%Bf2i B;Eo}l~{[Pטjly ۾;lzwoS)VnܛB '1B C8Nl&77=:?KdxuJ)q%gikg^coaIČ^IENDB`spykeviewer-0.4.1/resources/icons/repository.png0000644000175000017500000000402012262550403020264 0ustar robrobPNG  IHDRw=bKGDC pHYsHHFk> vpAgxLAIDATHm[l\G3잳^^vB/Ai%iBI  #QQDh#(^&nP'iB**;Ɖ^_kŻ{ΙaN(ia3'(KhLep[kJLS!Pʻ;G~x[!_X H}E4Jmqq0 RJErbx5O }~^V^^C8|\eVQL$"k{y^> :::zirR)r  Zhh4BX,aݸq}boh4D}S!T(кdX,1:v/7l5?]6mzk*<׭ &Zh,4B+Ѐ  s;굫?ѣS̗CBuR"Hi"uioGkA EZ%8DT,|H!DJHm ם 4kx8r٩{s8M-(0LL@JH!&4J+(壴"R@tUJVoMΞ]e).1mi@f2 (՟azf3X2ʕ_oiiJ¾}{#d2&''hA@ 8lݰ,Ǐi6q ;v2wWvٞSNW_eΝ|{%7bJ`M833Y?q {N$oGW{5mƷk5}f$jq.^4MRXMT!LbģkְmvJ/@:}mٲhBcǾ;v+)C/ΝIT5 +hFX(O337S+}ogD1)RquW荛O?C8,,.VPʯK p9N4'!`b߳>sF#P`bҥᧆ/UڙL$-E@c, г3{s֭پ}D"9 @K@/'N`u.뙞* uZk*P('dža }<xd6l 7 8HY%_y%tEXtcreate-date2009-11-28T17:18:28-07:001,%tEXtdate:create2010-01-11T08:45:16-07:00lR%tEXtdate:modify2010-01-11T08:45:16-07:00R5tEXtLicensehttp://creativecommons.org/licenses/LGPL/2.1/;%tEXtmodify-date2009-11-28T14:32:14-07:00ՋItEXtSourceCrystal Project'tEXtSource_URLhttp://everaldo.com/crystal/[IENDB`spykeviewer-0.4.1/resources/icons/filter.png0000644000175000017500000000625612262550403017347 0ustar robrobPNG  IHDR Vu\ =iCCPiccxڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧ:.bKGD pHYs  tIME  '9B@IDAT(}OhRqǿD]f>iZ uXAt!N֡"۩eEjRAF6gs:kAۗC޾N!'Iv ͦe^E3Y,̓#f=񺃄a-m3vՊ BMF=!52q1pEf2 Do($zj /'ޥ̢-$!ۿ mAwt]Z,Em۽d֠>\岊B՚ڽs3M_\*j}9S" !Pi4/Ԫ7sۉx2d&r?rQ*GZ$6S=8OXlz\Ua^ NoE1G<]dl*Q*jo] vX(a֏p*q68n]J]ݎ7J _IENDB`spykeviewer-0.4.1/resources/icons/appicon.png0000644000175000017500000001773512262550403017517 0ustar robrobPNG  IHDR@@iqsRGBbKGD pHYs  tIME 1 :0tEXtComment̖IIDATx{ix\ŕ{njly-K6o0 x`$,a$B2!aK[6x"wc-b}h˗ I&9>UT}[N:u/3GϿ+U<%33cRZZZʖJx +Anoojj9o[7ЋpԻY3cqȊ`0WB<G,C<eY`0\.x=^x<x}^8ۇuvؼof-6}ԛFfX U'Oèohminn:t;18RJP)F*(,,,,//N,-E05 ؽ{ϡm۶?~ Hs ]XW۶b֭U'6:u :D$0 @pHP=dtɼ /Z(-Xvݡ7WxκuOvww>{}{Zy;bEDRT) [`,k7oq{|WozM<`хWS;}Thk'}Ϟ=r$p^adgAꓖuϽ?GE'Ӥ߳> ODYn+@1YO~﮻:Oӧ?tjZh_KwuBpvcZlo|c 3Akc9ZZrf.Z`|9Ĭ9`;-rQ?χjgΞ8o?Oǭmy&>g]4>ҩ^حoC|9nZ̋fӴ֓yz 3kօ9Ygj=ÿNEk FT*1R>mhO`Zh硧C}Wݝ}?=rύ @3g.q〔dD0!"43kbh&M~ ÚMi"s477j@ЌD¿-7ߐ;﬛t39?Жuݗ鑼P{챾n]J8\ ˘Pm3; rhA;<TO +xH/DqNx;xӾNg/s;tgϙ5W~~]v:COBkb,iSJJ'ldYrXiJ*' @kkVĚXSkv475h׭iGM5^ߛ\:ocs}I&`+M,_qnAEmSc#^yMs./(sxRHR} 1tpr3sl99`(f$DRRI1TJ@*40H rA$>%}5o Oɩc'߰aGQa᭟e.uc;{thTn5Ex̠iWgi"b1&Q?$cLrȄ5_莵K ,wi aX\p $k Dc& >7#=SO=B@Ԋpoၟ럾r*︳AI4b`u{(wrK"c_$UĊGyCBI19 R$A mkiE_i۷Ǐv̚5P3& *XZQ^S]]CG\:,rCP^ϖ.\k=@ز4)!f3 c`@%, uu;+F= L^Y,Y f)?Qf]vؼ e>Y/20mb;sf,\Tcd^Puoh ((_2bf0|aaa!j:1^{m=Ǝim{ܺ0!ؓt_/tu顠C>Y?.ITV>ADO\+ !Ibgן[7jԏyyo| e۶v:5gO ޾/FTpfCCG7FQgB@qcyݨ𬊻+^@"= OY`Ц> Բe=Zs˯9`q*W X%fS"'ZP(8p5F 9_ݻ,rJFX6( F+==mO}>: x[ggO9 )M2: 8#Mec$፤# p~t$y}pFL t97$wx~oYU$7~8S,IJZkLɷ9RٗGͩORDdk 죻1 bHOww_^n.<3 bQ,,?/ @V ` |eZqcA'GH 1FȤ_ j jQ_o$n{ k#:EQ;Jk7O70"y\a.+Q=|sfs+VNzF _D6?H\k$6\x~X^u@'HѮYr~bV  XŔ5b1*xQk"_giۗ9\ JXT''T@nRi;$mZBkbAJ DIq 8y<$@H $#%\pZ$ CCHz5@ WA~zͺxv3RhPţ?UTQO aR+H2C)??P "0p3gIN`YH1;L6( Y]=>E R(m?Z:Q 2.{}Xi{w I" E@`N0*_9 F}UO]v4gҚ94xv\vѠ(5-׭H$k<}aQL￶Xe"9gg=vo?.g"LI-{~yeLmYeJ^3bKRiͬx(>.5$Ɏ#3둋/\o|oц1)/Zr|XfdM-f4>@,`7:>[[޽DCCSEIf!yRLI|_e3 .ynU[#Vث2n3tD6_|?-~>A .CDry9'Z"9CczJф&uˡIiG\u|᮰{p3IȁHb¢s;2ޓ ɔ- bT`l‹6ڬa^s^m$ ADsvv><S'l/M-DZA4 p! ⶖfBKǒ"(s-<|ǸW:, WePe:2Ić+#W,JF8LGLŹ|&b׬~LSZk GXb… ;62ӽn8R;v `kH ̮$ P՛ a%HX8D„Hģ݋ĴR1iO*~O=V_`f+ˎTr-r" -11%%Z6a'(JKQ>FpiM8!;P"ҶpJ%LD4xȌbxhpمHe&=ey޼e0s* ]vyw7899E(WQQɚS+=)3:xoIhC-m,a%e"AHI 3NG'OI!-K׎gWu7ϿQ^6 =6e囯zV}@Ng{[ki\$2,-ǃۡP΋"Ӈ.l ʲ JP4!qB, 0{z( ͹ٴpX|kr1K/VL2 )^E99!ڷ]6q[o" 9Ho9|`Pkֺ1|#ʧLfƇJŊ<|v>5 $ 2,&OZEggФP:SL4Q[[;=SؿoUusKs `Ri)ǿdf ?18Hpa~AUʖ^tRq/=4!#DQF错@WFDk$IU ˍ$#H)Ǐh o^Ko| jر^֛/>}z֎;sQa!a}ߴa>lmmY}K,F^^.<IrRPb(1-Z'C EO y [GC8~m/++6?kDԩSVS5fJ~L޳0++'¹G.~4̛{ƍáPO&zooNǮݻi߾=u U6='#طoL0J)WUUQ~^.ƍˣGct a_lڴ?Ef, f r&嫒(Y|rrR 8DWg'[ЈS֊``OO_~(Nug]]]ɓ\]]#G'OVܹsyٲe>;wD{{۷oD@)i^/HIwR !l Ԗcٱh|4=h@ggN^r&n۶oNV;.RD"]v[Y|$xՑ 7%a(9(eH۲&xt @P'ɡCDyy%̼.''ǧbjhhkA̜9ӧOg4'gώWVV>簀^vzW]]N8UUUwuM2ػw/޽}}}wWVVB\.ٶرc4nܸ3fx= !`6СCTTT\q\ vE << 22~zmO ݽ8==ikk#)qf8S"dۍOZ)??999ʂmݽtuu'`˖-ֶm^7o9(h8innÇ#77222 ӳ8%%%7O̝;ul.B>'NP(,AJI nعss7lpt *F'N@vv6!##aߑ\JD. \XX W_aYߙl۶z_:pٶml ëCGG ##\gdd\JDǁaB\PP\ bըێz]4;xøIENDB`spykeviewer-0.4.1/resources/icons/info.png0000755000175000017500000000272212262550403017012 0ustar robrobPNG  IHDRw=IDATH[lzn|'v!RTUoT}BjT 6Uh҇*mURZRQ AE@E TJ!QKjg7:{mwzNƱc93}wft#\Ľ6RLuZB٠^|__/_lHcή8|[w*r9!`yF8{vttア8Q<o@._x˧ʧ{;XTWCÄP*gc//xP{ӯ-iqw_щoPʃ bЀe$,)x_ /Ώ =Wt=?};77Q]IIJCw+ɪLFʋ3//W&@ɗvtQ]R)>Op~ V! h+)]Zs>N Id8 3kkT{c-^vzoaen+ϮJK/&H$#f CR L L{\ Rl9Lm]*js~1_:ɶ~ZܞF*hBjNRL@mG͇χ?zu]7~܅+̌p,)%QիQY^%۾nK瞛ntg#>}meϣP]u1=,KI%\.>LJז' ;:k}ƶ\.Ӛs0̮+Kdy<1o?q>[ vpAgxLIDATHǥk\UνIjXikJ&i_`!O>T_C(W!  } "AS)kbc;L㞳afڙd ^^kufƳ˗/I;ƝswQtQh䍥7.#^rEQ'|~P(9vͽl3g&|=@j$(W7 %{k~~ݻws FxTZ $XC@\4^x >Hrz88R C DT03TYaF>ɐ xj}(Alj6 )Gw# [DB8rD  GP$TUELG'jk 5D $6`P[6Jp@ÏA/YP BA3 '#vRQ]iF#6[PURd"hzcA'O8Vy)>ūEQZ }rΝq_{W_fii= )պTP tRo866yNΓ$!MSDYsNzNmemSޫi 4}QsmeTֵW/ W&?;epwlm1],8r뇋UY]]ջw.//فvS>/^)۸O75+ %A)¢BQBAC޹sgĉGX +B#PD9捤wvvMӬkniI@DHdDW_{ 3ƠEE{kƱ}at\uogk3E<Zdl˻'" q`Y8754,*`6'ku[ lRfch@@mUBq J[e&8 ]ZQ! njM2ihRRrJW`ZRʇuc#$2"R|JMz s `@#׻؛Cob잳s]h G)݉TV[/ 訊EZkC]1|>ԇY|0~nXjEm,d3#[(h^/+T$ ѥsCC'S#GVl6G"鞞]|#JA>G*ozc^qACc YZ8 ?RlBZIENDB`spykeviewer-0.4.1/resources/icons/new-filter.png0000644000175000017500000000207012262550403020124 0ustar robrobPNG  IHDRw=sRGBbKGD pHYs  tIME լIDATHǭUmh[U~ι1͇Lڮӥ݇"Jmб*LA"΁TI@V))Ώlq8hH.Ymmm6M$ƛ4I;{=st~%I&3qd=G.F]ԾGv;|PΒLaa= U!&QT0f綁{{{ U ,[,:wldkhh؁A^qo}7BHDӴRUB$D;8Ӆg91(kJzՎ; (kj4H\oC 4Ǿdn|+ilvT9G-.FIX,C{|i8~ًP(8kEC$M\.sv9hJ[ҋyak>Di1Y s2(J(*gR}{xrijSCΝgGJ*`Y T %<믽_8qff.R,QX^^&M14 #"{bs9}کSJeHxISo94ͦ?bc_Jō ֛LNLp1:;;iii{%O%$!MS4%I"fݵJ֮CLNNǘRhD $IB ϒ(99>>p}Tj59Z6''P|.O>[wcX|zYbT5}{}Z'|Zvt[R9[m:c5&kLj&gϞ+fWNTUUM<LMo_1 cLS@pMUmc_/X[c^ܾKQ S: wp]!i2)6߸@pIENDB`spykeviewer-0.4.1/setup.py0000644000175000017500000000410212262550403013725 0ustar robrob# -*- coding: utf-8 -*- from setuptools import setup, find_packages import os def find_version(): try: f = open(os.path.join('spykeviewer', '__init__.py'), 'r') try: for line in f: if line.startswith('__version__'): return line.split()[-1][1:-1] finally: f.close() except Exception: return '0' DESC = """Spyke Viewer is a multi-platform GUI application for navigating, analyzing and visualizing electrophysiological datasets. Based on the `Neo `_ library, it works with a wide variety of data formats. For more information, see the documentation at http://spyke-viewer.readthedocs.org""" if __name__ == "__main__": version = find_version() plugin_files = [] for path, dirs, files in os.walk(os.path.join('spykeviewer', 'plugins')): p = path.split(os.sep, 1)[1] plugin_files.extend([os.path.join(p, f) for f in files]) setup( name="spykeviewer", version=version, packages=find_packages(), install_requires=['guidata', 'guiqwt>=2.1.4', 'spyder>=2.1.0', 'spykeutils[plot,plugin]>=0.4.0', 'neo>=0.2.1', 'matplotlib', 'scipy'], entry_points={'gui_scripts': ['spykeviewer = spykeviewer.start:main']}, package_data={'': plugin_files}, zip_safe=False, author='Robert Pröpper', maintainer='Robert Pröpper', description='A multi-platform GUI application for navigating, analyzing and visualizing electrophysiological datasets', long_description=DESC, license='BSD', url='https://github.com/rproepp/spykeviewer', classifiers=[ 'Development Status :: 4 - Beta', 'Intended Audience :: Science/Research', 'License :: OSI Approved :: BSD License', 'Natural Language :: English', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Topic :: Scientific/Engineering :: Bio-Informatics'])